# Copyright (c) HashiCorp, Inc. # SPDX-License-Identifier: MPL-2.0 # # This workflow builds the product for all supported platforms and uploads the resulting # binaries as Actions artifacts. The workflow also uploads a build metadata file # (metadata.json) -- and a Terraform Registry manifest file (terraform-registry-manifest.json). # # Reference: https://github.com/hashicorp/terraform-provider-crt-example/blob/main/.github/workflows/README.md # name: build # We default to running this workflow on every push to every branch. # This provides fast feedback when build issues occur, so they can be # fixed prior to being merged to the main branch. # # If you want to opt out of this, and only run the build on certain branches # please refer to the documentation on branch filtering here: # # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#onpushbranchestagsbranches-ignoretags-ignore # on: [workflow_dispatch, push] env: PKG_NAME: "terraform-provider-boundary" jobs: # Detects the Go version to use for builds. get-go-version: name: "Detect Go toolchain version" runs-on: ubuntu-latest outputs: go-version: ${{ steps.get-go-version.outputs.go-version }} steps: - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Detect Go version id: get-go-version # We use .go-version as our source of truth for current Go version, # because "goenv" can react to it automatically. run: | echo "Building with Go $(cat .go-version)" echo "go-version=$(cat .go-version)" >> "$GITHUB_OUTPUT" - name: Set up Go uses: actions/setup-go@44694675825211faa026b3c33043df3e48a5fa00 # v6.0.0 with: go-version: "${{ steps.get-go-version.outputs.go-version }}" cache: false # Parses the version/VERSION file. Reference: https://github.com/hashicorp/actions-set-product-version/blob/main/README.md # # > This action should be implemented in product repo `build.yml` files. The action is intended to grab the version # > from the version file at the beginning of the build, then passes those versions (along with metadata, where # > necessary) to any workflow jobs that need version information. set-product-version: name: "Parse version file" runs-on: ubuntu-latest outputs: product-version: ${{ steps.set-product-version.outputs.product-version }} product-base-version: ${{ steps.set-product-version.outputs.base-product-version }} product-prerelease-version: ${{ steps.set-product-version.outputs.prerelease-product-version }} product-minor-version: ${{ steps.set-product-version.outputs.minor-product-version }} steps: - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Set variables id: set-product-version uses: hashicorp/actions-set-product-version@v2 # Creates metadata.json file containing build metadata for consumption by CRT workflows. # # Reference: https://github.com/hashicorp/actions-generate-metadata/blob/main/README.md generate-metadata-file: needs: set-product-version runs-on: ubuntu-latest outputs: filepath: ${{ steps.generate-metadata-file.outputs.filepath }} steps: - name: "Checkout directory" uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Generate metadata file id: generate-metadata-file uses: hashicorp/actions-generate-metadata@v1 with: version: ${{ needs.set-product-version.outputs.product-version }} product: ${{ env.PKG_NAME }} repositoryOwner: "hashicorp" - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 with: name: metadata.json path: ${{ steps.generate-metadata-file.outputs.filepath }} # Uploads an Actions artifact named terraform-registry-manifest.json.zip. # # The artifact contains a single file with a filename that Terraform Registry expects # (example: terraform-provider-crt-example_2.3.6-alpha1_manifest.json). The file contents # are identical to the terraform-registry-manifest.json file in the source repository. upload-terraform-registry-manifest-artifact: needs: set-product-version runs-on: ubuntu-latest steps: - name: "Checkout directory" uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: path: ${{ env.PKG_NAME }} - name: "Copy manifest from checkout directory to a file with the desired name" id: terraform-registry-manifest run: | name="${{ env.PKG_NAME }}" version="${{ needs.set-product-version.outputs.product-version }}" source="${name}/terraform-registry-manifest.json" destination="${name}_${version}_manifest.json" cp "$source" "$destination" echo "filename=$destination" >> "$GITHUB_OUTPUT" - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 with: name: terraform-registry-manifest.json path: ${{ steps.terraform-registry-manifest.outputs.filename }} if-no-files-found: error # Builds the product for supported platforms. # # With `reproducible: report`, this job also reports whether the build is reproducible, # but does not enforce it. # # Reference: https://github.com/hashicorp/actions-go-build/blob/main/README.md build: needs: - get-go-version - set-product-version runs-on: ubuntu-latest strategy: fail-fast: true matrix: goos: [freebsd, windows, linux, darwin] goarch: ["386", "amd64", "arm", "arm64"] exclude: - goos: freebsd goarch: arm64 - goos: windows goarch: arm64 - goos: windows goarch: arm - goos: darwin goarch: 386 - goos: darwin goarch: arm name: Go ${{ needs.get-go-version.outputs.go-version }} ${{ matrix.goos }} ${{ matrix.goarch }} build steps: - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - uses: hashicorp/actions-go-build@v1 env: CGO_ENABLED: 0 BASE_VERSION: ${{ needs.set-product-version.outputs.product-base-version }} PRERELEASE_VERSION: ${{ needs.set-product-version.outputs.product-prerelease-version}} METADATA_VERSION: ${{ env.METADATA }} with: bin_name: "${{ env.PKG_NAME }}_v${{ needs.set-product-version.outputs.product-version }}_x5" product_name: ${{ env.PKG_NAME }} product_version: ${{ needs.set-product-version.outputs.product-version }} go_version: ${{ needs.get-go-version.outputs.go-version }} os: ${{ matrix.goos }} arch: ${{ matrix.goarch }} reproducible: report instructions: | go mod download && ./scripts/plugins-all.sh go build \ -o "$BIN_PATH" \ -trimpath \ -buildvcs=false \ -ldflags "-s -w -X 'main.version=${{ needs.set-product-version.outputs.product-version }}'" cp LICENSE "$TARGET_DIR/LICENSE.txt" whats-next: needs: - build - generate-metadata-file - upload-terraform-registry-manifest-artifact runs-on: ubuntu-latest name: "What's next?" steps: - name: "Write a helpful summary" run: | github_dot_com="${{ github.server_url }}" owner_with_name="${{ github.repository }}" ref="${{ github.ref }}" { echo "### What's next?" echo "#### For a release branch (see \`.release/ci.hcl\`)" echo "After this \`build\` workflow run completes succesfully, you can expect the CRT \`prepare\` workflow to begin momentarily." echo "To find the \`prepare\` workflow run, [view the checks for this commit]($github_dot_com/$owner_with_name/commits/$ref)" } >> "$GITHUB_STEP_SUMMARY"