name: build on: - workflow_dispatch - push - workflow_call env: PKG_NAME: "boundary" jobs: product-metadata: runs-on: ubuntu-latest outputs: product-version: ${{ steps.get-product-version.outputs.product-version }} product-minor-version: ${{ steps.get-product-version.outputs.product-minor-version }} product-edition: ${{ steps.get-product-edition.outputs.product-edition }} go-version: ${{ steps.get-go-version.outputs.go-version }} steps: - uses: actions/checkout@v3 - name: Determine 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 "::set-output name=go-version::$(cat .go-version)" - name: Set up Go uses: actions/setup-go@v3 with: go-version: "${{ steps.get-go-version.outputs.go-version }}" - name: Determine Go cache paths id: go-cache-paths run: | echo "::set-output name=go-build::$(go env GOCACHE)" echo "::set-output name=go-mod::$(go env GOMODCACHE)" - name: Set up Go modules cache uses: actions/cache@v3 with: path: | ${{ steps.go-cache-paths.outputs.go-build }} ${{ steps.go-cache-paths.outputs.go-mod }} key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} restore-keys: | ${{ runner.os }}-go- - name: Determine product edition id: get-product-edition # Run make edition twice to ensure that extra go output isn't included run: | make edition echo "::set-output name=product-edition::$(make edition)" - name: Determine product version id: get-product-version run: | VERSION=$(make version) MINOR_VERSION=$(echo $VERSION | cut -d. -f-2) echo "::set-output name=product-version::$VERSION" echo "::set-output name=product-minor-version::$MINOR_VERSION" verify-product-metadata: needs: product-metadata runs-on: ubuntu-latest steps: - name: 'Checkout directory' uses: actions/checkout@v3 - run: | echo "Product Version - ${{ needs.product-metadata.outputs.product-version }}" echo "Product Minor Version - ${{ needs.product-metadata.outputs.product-minor-version }}" echo "Product Edition - ${{ needs.product-metadata.outputs.product-edition }}" generate-metadata-file: needs: product-metadata runs-on: ubuntu-latest outputs: filepath: ${{ steps.generate-metadata-file.outputs.filepath }} steps: - name: 'Checkout directory' uses: actions/checkout@v3 - name: Generate metadata file id: generate-metadata-file uses: hashicorp/actions-generate-metadata@main with: version: ${{ needs.product-metadata.outputs.product-version }} product: ${{ env.PKG_NAME }} - uses: actions/upload-artifact@v3 with: name: metadata.json path: ${{ steps.generate-metadata-file.outputs.filepath }} build-other: needs: - product-metadata runs-on: ubuntu-latest strategy: matrix: goos: [ freebsd, windows, netbsd, openbsd, solaris ] goarch: [ "386", "amd64", "arm" ] go: [ "${{ needs.product-metadata.outputs.go-version }}" ] exclude: - goos: solaris goarch: 386 - goos: solaris goarch: arm - goos: windows goarch: arm fail-fast: true name: Go ${{ matrix.go }} ${{ matrix.goos }} ${{ matrix.goarch }} build env: GOPRIVATE: "github.com/hashicorp" GO111MODULE: on steps: - uses: actions/checkout@v3 - name: Set up go uses: actions/setup-go@v3 with: go-version: ${{ matrix.go }} - name: Determine Go cache paths id: go-cache-paths run: | echo "::set-output name=go-build::$(go env GOCACHE)" echo "::set-output name=go-mod::$(go env GOMODCACHE)" - name: Set up Go modules cache uses: actions/cache@v3 with: path: | ${{ steps.go-cache-paths.outputs.go-build }} ${{ steps.go-cache-paths.outputs.go-mod }} key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}-${{ matrix.goarch }} restore-keys: | ${{ runner.os }}-go- - name: Set up Git run: git config --global url."https://${{ secrets.ELEVATED_GITHUB_TOKEN }}:@github.com".insteadOf "https://github.com" - name: Determine SHA id: set-sha run: echo "::set-output name=sha::$(head -n1 internal/ui/VERSION | cut -d ' ' -f1)" - name: Download UI artifact uses: dawidd6/action-download-artifact@v2 with: workflow: build-admin-ui.yaml commit: ${{ steps.set-sha.outputs.sha }} repo: "hashicorp/boundary-ui" name: admin-ui-${{ needs.product-metadata.outputs.product-edition }} path: internal/ui/.tmp/boundary-ui/ui/admin/dist - name: Go build env: GOOS: ${{ matrix.goos }} GOARCH: ${{ matrix.goarch }} CGO_ENABLED: 0 run: | mkdir out make build zip -r -j out/${{ env.PKG_NAME }}_${{ needs.product-metadata.outputs.product-version }}_${{ matrix.goos }}_${{ matrix.goarch }}.zip bin/ - uses: actions/upload-artifact@v3 with: name: ${{ env.PKG_NAME }}_${{ needs.product-metadata.outputs.product-version }}_${{ matrix.goos }}_${{ matrix.goarch }}.zip path: out/${{ env.PKG_NAME }}_${{ needs.product-metadata.outputs.product-version }}_${{ matrix.goos }}_${{ matrix.goarch }}.zip build-linux: needs: - product-metadata runs-on: ubuntu-latest strategy: matrix: goos: [linux] goarch: ["arm", "arm64", "386", "amd64"] go: [ "${{ needs.product-metadata.outputs.go-version }}" ] fail-fast: true name: Go ${{ matrix.go }} ${{ matrix.goos }} ${{ matrix.goarch }} build env: GOPRIVATE: "github.com/hashicorp" GO111MODULE: on steps: - uses: actions/checkout@v3 - name: Set up Git run: git config --global url."https://${{ secrets.ELEVATED_GITHUB_TOKEN }}:@github.com".insteadOf "https://github.com" - name: Set up Go uses: actions/setup-go@v3 with: go-version: ${{ matrix.go }} - name: Determine Go cache paths id: go-cache-paths run: | echo "::set-output name=go-build::$(go env GOCACHE)" echo "::set-output name=go-mod::$(go env GOMODCACHE)" - name: Set up Go modules cache uses: actions/cache@v3 with: path: | ${{ steps.go-cache-paths.outputs.go-build }} ${{ steps.go-cache-paths.outputs.go-mod }} key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}-${{ matrix.goarch }} restore-keys: | ${{ runner.os }}-go- - name: Determine SHA id: set-sha run: echo "::set-output name=sha::$(head -n1 internal/ui/VERSION | cut -d ' ' -f1)" - name: Download UI artifact uses: dawidd6/action-download-artifact@v2 with: workflow: build-admin-ui.yaml commit: ${{ steps.set-sha.outputs.sha }} repo: "hashicorp/boundary-ui" name: admin-ui-${{ needs.product-metadata.outputs.product-edition }} path: internal/ui/.tmp/boundary-ui/ui/admin/dist - name: Go build env: GOOS: ${{ matrix.goos }} GOARCH: ${{ matrix.goarch }} CGO_ENABLED: 0 run: | mkdir out make build zip -r -j out/${{ env.PKG_NAME }}_${{ needs.product-metadata.outputs.product-version }}_${{ matrix.goos }}_${{ matrix.goarch }}.zip bin/ - uses: actions/upload-artifact@v3 with: name: ${{ env.PKG_NAME }}_${{ needs.product-metadata.outputs.product-version }}_${{ matrix.goos }}_${{ matrix.goarch }}.zip path: out/${{ env.PKG_NAME }}_${{ needs.product-metadata.outputs.product-version }}_${{ matrix.goos }}_${{ matrix.goarch }}.zip - name: Package uses: hashicorp/actions-packaging-linux@v1 with: name: ${{ github.event.repository.name }} description: "HashiCorp Boundary - Identity-based access management for dynamic infrastructure" arch: ${{ matrix.goarch }} version: ${{ needs.product-metadata.outputs.product-version }} maintainer: "HashiCorp" homepage: "https://github.com/hashicorp/boundary" license: "MPL-2.0" binary: "bin/${{ env.PKG_NAME }}" deb_depends: "openssl" rpm_depends: "openssl" config_dir: ".release/linux/package/" preinstall: ".release/linux/preinst" postremove: ".release/linux/postrm" - name: Add Linux Package names to env run: | echo "RPM_PACKAGE=$(basename out/*.rpm)" >> $GITHUB_ENV echo "DEB_PACKAGE=$(basename out/*.deb)" >> $GITHUB_ENV - name: Upload RPM package uses: actions/upload-artifact@v3 with: name: ${{ env.RPM_PACKAGE }} path: out/${{ env.RPM_PACKAGE }} - name: Upload DEB package uses: actions/upload-artifact@v3 with: name: ${{ env.DEB_PACKAGE }} path: out/${{ env.DEB_PACKAGE }} build-darwin: needs: - product-metadata runs-on: macos-latest strategy: matrix: goos: [ darwin ] goarch: [ "amd64", "arm64" ] go: [ "${{ needs.product-metadata.outputs.go-version }}" ] fail-fast: true name: Go ${{ matrix.go }} ${{ matrix.goos }} ${{ matrix.goarch }} build env: GOPRIVATE: "github.com/hashicorp" GO111MODULE: on steps: - uses: actions/checkout@v3 - name: Set up go uses: actions/setup-go@v3 with: go-version: ${{ matrix.go }} - name: Determine Go cache paths id: go-cache-paths run: | echo "::set-output name=go-build::$(go env GOCACHE)" echo "::set-output name=go-mod::$(go env GOMODCACHE)" - name: Set up Go modules cache uses: actions/cache@v3 with: path: | ${{ steps.go-cache-paths.outputs.go-build }} ${{ steps.go-cache-paths.outputs.go-mod }} key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} restore-keys: | ${{ runner.os }}-go- - name: Determine SHA id: set-sha run: echo "::set-output name=sha::$(head -n1 internal/ui/VERSION | cut -d ' ' -f1)" - name: Download UI artifact uses: dawidd6/action-download-artifact@v2 with: workflow: build-admin-ui.yaml commit: ${{ steps.set-sha.outputs.sha }} repo: "hashicorp/boundary-ui" name: admin-ui-${{ needs.product-metadata.outputs.product-edition }} path: internal/ui/.tmp/boundary-ui/ui/admin/dist - name: Go build env: GOOS: ${{ matrix.goos }} GOARCH: ${{ matrix.goarch }} CGO_ENABLED: 0 run: | mkdir out make build zip -r -j out/${{ env.PKG_NAME }}_${{ needs.product-metadata.outputs.product-version }}_${{ matrix.goos }}_${{ matrix.goarch }}.zip bin/ - uses: actions/upload-artifact@v3 with: name: ${{ env.PKG_NAME }}_${{ needs.product-metadata.outputs.product-version }}_${{ matrix.goos }}_${{ matrix.goarch }}.zip path: out/${{ env.PKG_NAME }}_${{ needs.product-metadata.outputs.product-version }}_${{ matrix.goos }}_${{ matrix.goarch }}.zip build-docker: name: Docker ${{ matrix.arch }} build needs: - product-metadata - build-linux runs-on: ubuntu-latest strategy: matrix: arch: ["arm", "arm64", "386", "amd64"] env: repo: ${{ github.event.repository.name }} version: ${{ needs.product-metadata.outputs.product-version }} minor-version: ${{ needs.product-metadata.outputs.product-minor-version }} steps: - uses: actions/checkout@v3 - name: Docker Build (Action) uses: hashicorp/actions-docker-build@v1 with: version: ${{ env.version }} target: default arch: ${{ matrix.arch }} tags: | docker.io/hashicorp/${{ env.repo }}:${{ env.version }} public.ecr.aws/hashicorp/${{ env.repo }}:${{ env.version }} # Per-commit dev images follow the naming convention MAJOR.MINOR-dev # And MAJOR.MINOR-dev-$COMMITSHA dev_tags: | docker.io/hashicorppreview/${{ env.repo }}:${{ env.minor-version }}-dev docker.io/hashicorppreview/${{ env.repo }}:${{ env.minor-version }}-dev-${{ github.sha }} enos: name: Enos # Only run the Enos workflow on pull requests that have been originated from # the hashicorp/boundary repository. As Enos scenarios require access to # Github Actions secrets, it only makes sense to run this workflow when those # secrets are available. Any pull requests from forks will not trigger the # workflow. if: "! github.event.pull_request.head.repo.fork" needs: - product-metadata - build-linux uses: ./.github/workflows/enos-run.yml with: artifact-name: "boundary_${{ needs.product-metadata.outputs.product-version }}_linux_amd64.zip" go-version: ${{ needs.product-metadata.outputs.go-version }} secrets: inherit