# Copyright (c) The OpenTofu Authors
# SPDX-License-Identifier: MPL-2.0
# Copyright (c) 2023 HashiCorp, Inc.
# SPDX-License-Identifier: MPL-2.0

project_name: tofu

before:
  hooks:
    - go mod tidy
    - go generate ./...
    - make protobuf

builds:
  - env:
      - CGO_ENABLED=0

    main: ./cmd/tofu

    flags:
      - "-mod=readonly"
      - "-trimpath"

    ldflags:
      - "-s -w"
      - "-X 'github.com/opentofu/opentofu/version.dev=no'"

    goos:
      - linux
      - windows
      - darwin
      - freebsd
      - openbsd
      - solaris

    goarch:
      - "386"
      - amd64
      - arm
      - arm64

    ignore:
      - goos: freebsd
        goarch: arm64
      - goos: openbsd
        goarch: arm
      - goos: openbsd
        goarch: arm64
      - goos: solaris
        goarch: "386"
      - goos: solaris
        goarch: arm
      - goos: solaris
        goarch: arm64
      - goos: windows
        goarch: arm
      - goos: windows
        goarch: arm64
      - goos: darwin
        goarch: "386"
      - goos: darwin
        goarch: arm

archives:
  - format: tar.gz
    id: targz
    name_template: "{{ .ProjectName }}_{{ .Version }}_{{- .Os }}_{{- .Arch }}"
  
  - format: zip
    id: zip 
    name_template: "{{ .ProjectName }}_{{ .Version }}_{{- .Os }}_{{- .Arch }}"

dockers:
  - use: buildx
    goarch: amd64
    build_flag_templates:
      - "--pull"
      - "--platform=linux/amd64"
      - "--label=org.opencontainers.image.title={{ .ProjectName }}"
      - "--label=org.opencontainers.image.vendor=OpenTofu"
      - "--label=org.opencontainers.image.description=OpenTofu {{ .Version }}"
      - "--label=org.opencontainers.image.url=https://github.com/opentofu/opentofu"
      - "--label=org.opencontainers.image.documentation=https://github.com/opentofu/opentofu/blob/main/README.md"
      - "--label=org.opencontainers.image.source=https://github.com/opentofu/opentofu"
      - "--label=org.opencontainers.image.licenses=MPL-2.0"
      - "--label=org.opencontainers.image.version={{ .Version }}"
      - "--label=org.opencontainers.image.revision={{ .FullCommit }}"
      - "--label=org.opencontainers.image.created={{ time \"2006-01-02T15:04:05Z07:00\" }}"
    image_templates:
      - "ghcr.io/opentofu/opentofu:{{ .Version }}-amd64"

  - use: buildx
    goarch: amd64
    dockerfile: Dockerfile.minimal
    build_flag_templates:
      - "--pull"
      - "--platform=linux/amd64"
      - "--label=org.opencontainers.image.title={{ .ProjectName }}"
      - "--label=org.opencontainers.image.vendor=OpenTofu"
      - "--label=org.opencontainers.image.description=OpenTofu {{ .Version }}"
      - "--label=org.opencontainers.image.url=https://github.com/opentofu/opentofu"
      - "--label=org.opencontainers.image.documentation=https://github.com/opentofu/opentofu/blob/main/README.md"
      - "--label=org.opencontainers.image.source=https://github.com/opentofu/opentofu"
      - "--label=org.opencontainers.image.licenses=MPL-2.0"
      - "--label=org.opencontainers.image.version={{ .Version }}"
      - "--label=org.opencontainers.image.revision={{ .FullCommit }}"
      - "--label=org.opencontainers.image.created={{ time \"2006-01-02T15:04:05Z07:00\" }}"
    image_templates:
      - "ghcr.io/opentofu/opentofu:{{ .Version }}-minimal-amd64"

  - use: buildx
    goarch: arm64
    build_flag_templates:
      - "--pull"
      - "--platform=linux/arm64"
      - "--label=org.opencontainers.image.title={{ .ProjectName }}"
      - "--label=org.opencontainers.image.vendor=OpenTofu"
      - "--label=org.opencontainers.image.description=OpenTofu {{ .Version }}"
      - "--label=org.opencontainers.image.url=https://github.com/opentofu/opentofu"
      - "--label=org.opencontainers.image.documentation=https://github.com/opentofu/opentofu/blob/main/README.md"
      - "--label=org.opencontainers.image.source=https://github.com/opentofu/opentofu"
      - "--label=org.opencontainers.image.licenses=MPL-2.0"
      - "--label=org.opencontainers.image.version={{ .Version }}"
      - "--label=org.opencontainers.image.revision={{ .FullCommit }}"
      - "--label=org.opencontainers.image.created={{ time \"2006-01-02T15:04:05Z07:00\" }}"
    image_templates:
      - "ghcr.io/opentofu/opentofu:{{ .Version }}-arm64"

  - use: buildx
    goarch: arm64
    dockerfile: Dockerfile.minimal
    build_flag_templates:
      - "--pull"
      - "--platform=linux/arm64"
      - "--label=org.opencontainers.image.title={{ .ProjectName }}"
      - "--label=org.opencontainers.image.vendor=OpenTofu"
      - "--label=org.opencontainers.image.description=OpenTofu {{ .Version }}"
      - "--label=org.opencontainers.image.url=https://github.com/opentofu/opentofu"
      - "--label=org.opencontainers.image.documentation=https://github.com/opentofu/opentofu/blob/main/README.md"
      - "--label=org.opencontainers.image.source=https://github.com/opentofu/opentofu"
      - "--label=org.opencontainers.image.licenses=MPL-2.0"
      - "--label=org.opencontainers.image.version={{ .Version }}"
      - "--label=org.opencontainers.image.revision={{ .FullCommit }}"
      - "--label=org.opencontainers.image.created={{ time \"2006-01-02T15:04:05Z07:00\" }}"
    image_templates:
      - "ghcr.io/opentofu/opentofu:{{ .Version }}-minimal-arm64"

  - use: buildx
    goarch: arm
    build_flag_templates:
      - "--pull"
      - "--platform=linux/arm"
      - "--label=org.opencontainers.image.title={{ .ProjectName }}"
      - "--label=org.opencontainers.image.vendor=OpenTofu"
      - "--label=org.opencontainers.image.description=OpenTofu {{ .Version }}"
      - "--label=org.opencontainers.image.url=https://github.com/opentofu/opentofu"
      - "--label=org.opencontainers.image.documentation=https://github.com/opentofu/opentofu/blob/main/README.md"
      - "--label=org.opencontainers.image.source=https://github.com/opentofu/opentofu"
      - "--label=org.opencontainers.image.licenses=MPL-2.0"
      - "--label=org.opencontainers.image.version={{ .Version }}"
      - "--label=org.opencontainers.image.revision={{ .FullCommit }}"
      - "--label=org.opencontainers.image.created={{ time \"2006-01-02T15:04:05Z07:00\" }}"
    image_templates:
      - "ghcr.io/opentofu/opentofu:{{ .Version }}-arm"

  - use: buildx
    goarch: arm
    dockerfile: Dockerfile.minimal
    build_flag_templates:
      - "--pull"
      - "--platform=linux/arm"
      - "--label=org.opencontainers.image.title={{ .ProjectName }}"
      - "--label=org.opencontainers.image.vendor=OpenTofu"
      - "--label=org.opencontainers.image.description=OpenTofu {{ .Version }}"
      - "--label=org.opencontainers.image.url=https://github.com/opentofu/opentofu"
      - "--label=org.opencontainers.image.documentation=https://github.com/opentofu/opentofu/blob/main/README.md"
      - "--label=org.opencontainers.image.source=https://github.com/opentofu/opentofu"
      - "--label=org.opencontainers.image.licenses=MPL-2.0"
      - "--label=org.opencontainers.image.version={{ .Version }}"
      - "--label=org.opencontainers.image.revision={{ .FullCommit }}"
      - "--label=org.opencontainers.image.created={{ time \"2006-01-02T15:04:05Z07:00\" }}"
    image_templates:
      - "ghcr.io/opentofu/opentofu:{{ .Version }}-minimal-arm"

  - use: buildx
    goarch: "386"
    build_flag_templates:
      - "--pull"
      - "--platform=linux/386"
      - "--label=org.opencontainers.image.title={{ .ProjectName }}"
      - "--label=org.opencontainers.image.vendor=OpenTofu"
      - "--label=org.opencontainers.image.description=OpenTofu {{ .Version }}"
      - "--label=org.opencontainers.image.url=https://github.com/opentofu/opentofu"
      - "--label=org.opencontainers.image.documentation=https://github.com/opentofu/opentofu/blob/main/README.md"
      - "--label=org.opencontainers.image.source=https://github.com/opentofu/opentofu"
      - "--label=org.opencontainers.image.licenses=MPL-2.0"
      - "--label=org.opencontainers.image.version={{ .Version }}"
      - "--label=org.opencontainers.image.revision={{ .FullCommit }}"
      - "--label=org.opencontainers.image.created={{ time \"2006-01-02T15:04:05Z07:00\" }}"
    image_templates:
      - "ghcr.io/opentofu/opentofu:{{ .Version }}-386"

  - use: buildx
    goarch: "386"
    dockerfile: Dockerfile.minimal
    build_flag_templates:
      - "--pull"
      - "--platform=linux/386"
      - "--label=org.opencontainers.image.title={{ .ProjectName }}"
      - "--label=org.opencontainers.image.vendor=OpenTofu"
      - "--label=org.opencontainers.image.description=OpenTofu {{ .Version }}"
      - "--label=org.opencontainers.image.url=https://github.com/opentofu/opentofu"
      - "--label=org.opencontainers.image.documentation=https://github.com/opentofu/opentofu/blob/main/README.md"
      - "--label=org.opencontainers.image.source=https://github.com/opentofu/opentofu"
      - "--label=org.opencontainers.image.licenses=MPL-2.0"
      - "--label=org.opencontainers.image.version={{ .Version }}"
      - "--label=org.opencontainers.image.revision={{ .FullCommit }}"
      - "--label=org.opencontainers.image.created={{ time \"2006-01-02T15:04:05Z07:00\" }}"
    image_templates:
      - "ghcr.io/opentofu/opentofu:{{ .Version }}-minimal-386"

docker_manifests:
  - name_template: ghcr.io/opentofu/opentofu:{{ .Version }}
    image_templates:
      - ghcr.io/opentofu/opentofu:{{ .Version }}-amd64
      - ghcr.io/opentofu/opentofu:{{ .Version }}-arm64
      - ghcr.io/opentofu/opentofu:{{ .Version }}-arm
      - ghcr.io/opentofu/opentofu:{{ .Version }}-386

  - name_template: ghcr.io/opentofu/opentofu:{{ .Version }}-minimal
    image_templates:
      - ghcr.io/opentofu/opentofu:{{ .Version }}-minimal-amd64
      - ghcr.io/opentofu/opentofu:{{ .Version }}-minimal-arm64
      - ghcr.io/opentofu/opentofu:{{ .Version }}-minimal-arm
      - ghcr.io/opentofu/opentofu:{{ .Version }}-minimal-386

  - name_template: ghcr.io/opentofu/opentofu:{{ .Major }}.{{ .Minor }}
    image_templates:
      - ghcr.io/opentofu/opentofu:{{ .Version }}-amd64
      - ghcr.io/opentofu/opentofu:{{ .Version }}-arm64
      - ghcr.io/opentofu/opentofu:{{ .Version }}-arm
      - ghcr.io/opentofu/opentofu:{{ .Version }}-386
    skip_push: auto # Skips the push on pre-release versions, like 1.6.1-alpha1. See https://goreleaser.com/customization/docker_manifest/#customization

  - name_template: ghcr.io/opentofu/opentofu:{{ .Major }}.{{ .Minor }}-minimal
    image_templates:
      - ghcr.io/opentofu/opentofu:{{ .Version }}-minimal-amd64
      - ghcr.io/opentofu/opentofu:{{ .Version }}-minimal-arm64
      - ghcr.io/opentofu/opentofu:{{ .Version }}-minimal-arm
      - ghcr.io/opentofu/opentofu:{{ .Version }}-minimal-386
    skip_push: auto # Skips the push on pre-release versions, like 1.6.1-alpha1. See https://goreleaser.com/customization/docker_manifest/#customization

  - name_template: ghcr.io/opentofu/opentofu:{{ .Major }}
    image_templates:
      - ghcr.io/opentofu/opentofu:{{ .Version }}-amd64
      - ghcr.io/opentofu/opentofu:{{ .Version }}-arm64
      - ghcr.io/opentofu/opentofu:{{ .Version }}-arm
      - ghcr.io/opentofu/opentofu:{{ .Version }}-386
    skip_push: auto # Skips the push on pre-release versions, like 1.6.1-alpha1. See https://goreleaser.com/customization/docker_manifest/#customization

  - name_template: ghcr.io/opentofu/opentofu:{{ .Major }}-minimal
    image_templates:
      - ghcr.io/opentofu/opentofu:{{ .Version }}-minimal-amd64
      - ghcr.io/opentofu/opentofu:{{ .Version }}-minimal-arm64
      - ghcr.io/opentofu/opentofu:{{ .Version }}-minimal-arm
      - ghcr.io/opentofu/opentofu:{{ .Version }}-minimal-386
    skip_push: auto # Skips the push on pre-release versions, like 1.6.1-alpha1. See https://goreleaser.com/customization/docker_manifest/#customization

  - name_template: ghcr.io/opentofu/opentofu:latest
    image_templates:
      - ghcr.io/opentofu/opentofu:{{ .Version }}-amd64
      - ghcr.io/opentofu/opentofu:{{ .Version }}-arm64
      - ghcr.io/opentofu/opentofu:{{ .Version }}-arm
      - ghcr.io/opentofu/opentofu:{{ .Version }}-386
    skip_push: auto # Skips the push on pre-release versions, like 1.6.1-alpha1. See https://goreleaser.com/customization/docker_manifest/#customization

  - name_template: ghcr.io/opentofu/opentofu:minimal
    image_templates:
      - ghcr.io/opentofu/opentofu:{{ .Version }}-minimal-amd64
      - ghcr.io/opentofu/opentofu:{{ .Version }}-minimal-arm64
      - ghcr.io/opentofu/opentofu:{{ .Version }}-minimal-arm
      - ghcr.io/opentofu/opentofu:{{ .Version }}-minimal-386
    skip_push: auto # Skips the push on pre-release versions, like 1.6.1-alpha1. See https://goreleaser.com/customization/docker_manifest/#customization

nfpms:
  - file_name_template: '{{ .ProjectName }}_{{ .Version }}_{{ .Arch }}'
    maintainer: 'https://github.com/orgs/opentofu/teams/opentofu-core-team'
    homepage: https://opentofu.org
    description: >-
      OpenTofu lets you declaratively manage your cloud infrastructure.
    license: "MPL-2.0"
    formats:
      - deb
      - rpm
      - apk
    bindir: /usr/bin
    section: default
    contents:
      - src: ./LICENSE
        dst: /usr/share/doc/opentofu/copyright
        file_info:
          mode: 0444
    rpm:
      signature:
        key_file: "{{ if index .Env \"GPG_KEY_FILE\"  }}{{.Env.GPG_KEY_FILE}}{{ end }}"
    deb:
      signature:
        key_file: "{{ if index .Env \"GPG_KEY_FILE\"  }}{{.Env.GPG_KEY_FILE}}{{ end }}"

snapcrafts:
  - name: opentofu
    publish: true
    summary: OpenTofu lets you declaratively manage your cloud infrastructure.
    description: |
      OpenTofu is an OSS tool for building, changing, and versioning infrastructure
      safely and efficiently. OpenTofu can manage existing and popular service
      providers as well as custom in-house solutions.
    disable: '{{ if eq .Env.RELEASE_FLAG_LATEST "false" }}true{{ else }}false{{ end }}'
    channel_templates:
      - '{{ if eq .Env.RELEASE_FLAG_PRERELEASE "true" }}latest/edge{{ else }}latest/stable{{ end }}'
    grade: '{{ if eq .Env.RELEASE_FLAG_PRERELEASE "true" }}devel{{ else }}stable{{ end }}'
    confinement: classic
    license: MPL-2.0
    base: core22
    apps:
      tofu:
        command: tofu
        aliases: [tofu]

checksum:
  name_template: "{{ .ProjectName }}_{{ .Version }}_SHA256SUMS"

signs:
  - artifacts: all
    id: cosign
    cmd: cosign
    certificate: "${artifact}.pem"
    args: [ "sign-blob", "--oidc-issuer=https://token.actions.githubusercontent.com", "--output-certificate=${certificate}", "--output-signature=${signature}", "${artifact}", "--yes" ]
  - artifacts: all
    signature: "${artifact}.gpgsig"
    id: gpg
    cmd: gpg
    args: ["--batch", "-u", "{{ .Env.GPG_FINGERPRINT }}", "--output", "${signature}", "--detach-sign", "${artifact}" ]

docker_signs:
  - artifacts: all
    args: [ "sign", "--oidc-issuer=https://token.actions.githubusercontent.com", "${artifact}@${digest}", "--yes" ]

snapshot:
  name_template: "{{ .Version }}-next"

# Docs are here: https://github.com/goreleaser/goreleaser/blob/v1.26.2/www/docs/customization/nightlies.md
nightly:
  # Version format: nightly-20250806-c5fd934
  name_template: "nightly-{{ .Now.Format \"20060102\" }}-{{ .ShortCommit }}"
  publish_release: false

changelog:
  use: github-native

release:
  prerelease: auto
  draft: true
