name: build on: push: branches: - main - release/** workflow_dispatch: inputs: build-ref: description: 'The git ref to build from' type: string default: '' required: false make-prerelease: description: "Run prerelease to generate files" type: "boolean" required: false default: true env: PKG_NAME: "nomad" GO_TAGS: "release" jobs: get-go-version: runs-on: ubuntu-20.04 outputs: go-version: ${{ steps.get-go-version.outputs.go-version }} steps: - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 with: ref: ${{ github.event.inputs.build-ref }} - 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 "go-version=$(cat .go-version)" >> "$GITHUB_OUTPUT" get-product-version: runs-on: ubuntu-20.04 outputs: product-version: ${{ steps.get-product-version.outputs.product-version }} steps: - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 with: ref: ${{ github.event.inputs.build-ref }} - name: get product version id: get-product-version run: |- make version echo "product-version=$(make version)" >> "$GITHUB_OUTPUT" generate-metadata-file: needs: get-product-version runs-on: ubuntu-20.04 outputs: filepath: ${{ steps.generate-metadata-file.outputs.filepath }} steps: - name: "Checkout directory" uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 with: ref: ${{ github.event.inputs.build-ref }} - name: Generate metadata file id: generate-metadata-file uses: hashicorp/actions-generate-metadata@v1.1.1 with: version: ${{ needs.get-product-version.outputs.product-version }} product: ${{ env.PKG_NAME }} repositoryOwner: "hashicorp" sha: ${{ github.event.inputs.build-ref }} - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 with: name: metadata.json path: ${{ steps.generate-metadata-file.outputs.filepath }} build-other: needs: [get-go-version, get-product-version] runs-on: [ custom, linux, xxl, 20.04 ] strategy: matrix: goos: [windows] goarch: ["amd64"] fail-fast: true name: Go ${{ needs.get-go-version.outputs.go-version }} ${{ matrix.goos }} ${{ matrix.goarch }} build steps: - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 with: ref: ${{ github.event.inputs.build-ref }} - name: Setup go uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4.0.0 with: go-version: ${{ needs.get-go-version.outputs.go-version }} - name: Build dependencies run: make deps - name: Setup node and yarn uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 with: node-version: "18" cache-dependency-path: "ui/yarn.lock" - name: Install Yarn run: | npm install -g yarn - name: Build prerelease run: make prerelease if: ${{ github.event_name != 'workflow_dispatch' || github.event.inputs.make-prerelease == 'true' }} - name: Build env: GOOS: ${{ matrix.goos }} GOARCH: ${{ matrix.goarch }} GO_TAGS: ${{ env.GO_TAGS }} CGO_ENABLED: 1 run: | make pkg/${{ matrix.goos }}_${{ matrix.goarch }}.zip mv pkg/${{ matrix.goos }}_${{ matrix.goarch }}.zip ${{ env.PKG_NAME }}_${{ needs.get-product-version.outputs.product-version }}_${{ matrix.goos }}_${{ matrix.goarch }}.zip - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 with: name: ${{ env.PKG_NAME }}_${{ needs.get-product-version.outputs.product-version }}_${{ matrix.goos }}_${{ matrix.goarch }}.zip path: ${{ env.PKG_NAME }}_${{ needs.get-product-version.outputs.product-version }}_${{ matrix.goos }}_${{ matrix.goarch }}.zip build-linux: needs: [get-go-version, get-product-version] runs-on: [ custom, linux, xxl, 20.04 ] strategy: matrix: goos: [linux] goarch: ["arm", "arm64", "amd64"] fail-fast: true name: Go ${{ needs.get-go-version.outputs.go-version }} ${{ matrix.goos }} ${{ matrix.goarch }} build steps: - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 with: ref: ${{ github.event.inputs.build-ref }} - name: Setup go uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4.0.0 with: go-version: ${{ needs.get-go-version.outputs.go-version }} - name: Build dependencies run: make deps - name: Setup node and yarn uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 with: node-version: "18" cache-dependency-path: "ui/yarn.lock" - name: Install Yarn run: | npm install -g yarn - name: Build prerelease run: make prerelease if: ${{ github.event_name != 'workflow_dispatch' || github.event.inputs.make-prerelease == 'true' }} - name: Install Linux build utilties run: | sudo apt-get update sudo apt-get install -y software-properties-common sudo apt-get update sudo apt-get install -y \ binutils-aarch64-linux-gnu \ binutils-arm-linux-gnueabihf \ gcc-aarch64-linux-gnu \ gcc-arm-linux-gnueabihf \ gcc-multilib-arm-linux-gnueabihf - name: Set gcc run: | if [ "${{ matrix.goarch }}" == "arm" ]; then echo "CC=arm-linux-gnueabihf-gcc" >> "$GITHUB_ENV" elif [ "${{ matrix.goarch }}" == "arm64" ]; then echo "CC=aarch64-linux-gnu-gcc" >> "$GITHUB_ENV" fi - name: Build env: GOOS: ${{ matrix.goos }} GOARCH: ${{ matrix.goarch }} GO_TAGS: ${{ env.GO_TAGS }} CGO_ENABLED: 1 run: | make pkg/${{ matrix.goos }}_${{ matrix.goarch }}.zip mv pkg/${{ matrix.goos }}_${{ matrix.goarch }}.zip ${{ env.PKG_NAME }}_${{ needs.get-product-version.outputs.product-version }}_${{ matrix.goos }}_${{ matrix.goarch }}.zip - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 with: name: ${{ env.PKG_NAME }}_${{ needs.get-product-version.outputs.product-version }}_${{ matrix.goos }}_${{ matrix.goarch }}.zip path: ${{ env.PKG_NAME }}_${{ needs.get-product-version.outputs.product-version }}_${{ matrix.goos }}_${{ matrix.goarch }}.zip - name: Package uses: hashicorp/actions-packaging-linux@v1 with: name: ${{ env.PKG_NAME }} description: "Nomad is an easy-to-use, flexible, and performant workload orchestrator that can deploy a mix of microservice, batch, containerized, and non-containerized applications." arch: ${{ matrix.goarch }} version: ${{ needs.get-product-version.outputs.product-version }} maintainer: "HashiCorp" homepage: "https://github.com/hashicorp/nomad" license: "MPL-2.0" binary: "pkg/${{ matrix.goos }}_${{ matrix.goarch }}/${{ env.PKG_NAME }}" deb_depends: "openssl" rpm_depends: "openssl" config_dir: ".release/linux/package/" preinstall: ".release/linux/preinst" postinstall: ".release/linux/postinst" postremove: ".release/linux/postrm" - name: Set Package Names run: | echo "RPM_PACKAGE=$(basename out/*.rpm)" >> "$GITHUB_ENV" echo "DEB_PACKAGE=$(basename out/*.deb)" >> "$GITHUB_ENV" - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 with: name: ${{ env.RPM_PACKAGE }} path: out/${{ env.RPM_PACKAGE }} - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 with: name: ${{ env.DEB_PACKAGE }} path: out/${{ env.DEB_PACKAGE }} build-darwin: needs: [get-go-version, get-product-version] runs-on: macos-latest strategy: matrix: goos: [darwin] goarch: ["arm64", "amd64"] fail-fast: true name: Go ${{ needs.get-go-version.outputs.go-version }} ${{ matrix.goos }} ${{ matrix.goarch }} build steps: - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 with: ref: ${{ github.event.inputs.build-ref }} - name: Setup go uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4.0.0 with: go-version: ${{ needs.get-go-version.outputs.go-version }} - name: Build dependencies run: make deps - name: Setup node and yarn uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 with: node-version: "18" cache-dependency-path: "ui/yarn.lock" - name: Install Yarn run: | npm install -g yarn - name: Build prerelease run: make prerelease if: ${{ github.event_name != 'workflow_dispatch' || github.event.inputs.make-prerelease == 'true' }} - name: Build env: GOOS: ${{ matrix.goos }} GOARCH: ${{ matrix.goarch }} GO_TAGS: "${{ env.GO_TAGS }} netcgo" CGO_ENABLED: 1 run: | make pkg/${{ matrix.goos }}_${{ matrix.goarch }}.zip mv pkg/${{ matrix.goos }}_${{ matrix.goarch }}.zip ${{ env.PKG_NAME }}_${{ needs.get-product-version.outputs.product-version }}_${{ matrix.goos }}_${{ matrix.goarch }}.zip - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 with: name: ${{ env.PKG_NAME }}_${{ needs.get-product-version.outputs.product-version }}_${{ matrix.goos }}_${{ matrix.goarch }}.zip path: ${{ env.PKG_NAME }}_${{ needs.get-product-version.outputs.product-version }}_${{ matrix.goos }}_${{ matrix.goarch }}.zip build-docker: name: Docker ${{ matrix.arch }} build needs: - get-product-version - build-linux runs-on: [ custom, linux, xxl, 20.04 ] strategy: matrix: arch: ["arm64", "amd64"] env: version: ${{needs.get-product-version.outputs.product-version}} steps: - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 - name: Docker Build (Action) uses: hashicorp/actions-docker-build@v1 with: smoke_test: | TEST_VERSION="$(docker run "${IMAGE_NAME}" version | awk '/Nomad v/{print $2}')" if [ "${TEST_VERSION}" != "v${version}" ]; then echo "Test FAILED" exit 1 fi echo "Test PASSED" version: ${{env.version}} target: release arch: ${{matrix.arch}} tags: | docker.io/hashicorp/${{env.PKG_NAME}}:${{env.version}} dev_tags: | docker.io/hashicorppreview/${{ env.PKG_NAME }}:${{ env.version }}-dev docker.io/hashicorppreview/${{ env.PKG_NAME }}:${{ env.version }}-${{ github.sha }} permissions: contents: read