210 lines
7.1 KiB
YAML
210 lines
7.1 KiB
YAML
![]() |
name: Build Terraform CLI Packages
|
||
|
|
||
|
# If you want to test changes to this file before merging to a main branch,
|
||
|
# push them up to a branch whose name has the prefix "build-workflow-dev/",
|
||
|
# which is a special prefix that triggers this workflow even though it's not
|
||
|
# actually a release branch.
|
||
|
|
||
|
on:
|
||
|
workflow_dispatch:
|
||
|
push:
|
||
|
branches:
|
||
|
- main
|
||
|
- 'v[0-9]+.[0-9]+'
|
||
|
- build-workflow-dev/*
|
||
|
tags:
|
||
|
- 'v[0-9]+.[0-9]+.[0-9]+*'
|
||
|
|
||
|
env:
|
||
|
PKG_NAME: "terraform"
|
||
|
|
||
|
jobs:
|
||
|
get-product-version:
|
||
|
name: "Determine intended Terraform version"
|
||
|
runs-on: ubuntu-latest
|
||
|
outputs:
|
||
|
product-version: ${{ steps.get-product-version.outputs.product-version }}
|
||
|
steps:
|
||
|
- uses: actions/checkout@v2
|
||
|
with:
|
||
|
fetch-depth: 0 # Need all commits and tags to find a reasonable version number
|
||
|
- name: Decide version number
|
||
|
id: get-product-version
|
||
|
run: |
|
||
|
git describe --first-parent
|
||
|
echo "::set-output name=product-version::$(git describe --first-parent)"
|
||
|
|
||
|
get-go-version:
|
||
|
name: "Determine Go toolchain version"
|
||
|
runs-on: ubuntu-latest
|
||
|
outputs:
|
||
|
go-version: ${{ steps.get-go-version.outputs.go-version }}
|
||
|
steps:
|
||
|
- uses: actions/checkout@v2
|
||
|
- 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)"
|
||
|
|
||
|
generate-metadata-file:
|
||
|
name: "Generate release metadata"
|
||
|
needs: get-product-version
|
||
|
runs-on: ubuntu-latest
|
||
|
outputs:
|
||
|
filepath: ${{ steps.generate-metadata-file.outputs.filepath }}
|
||
|
steps:
|
||
|
- uses: actions/checkout@v2
|
||
|
- name: Generate package metadata
|
||
|
id: generate-metadata-file
|
||
|
uses: hashicorp/actions-generate-metadata@main
|
||
|
with:
|
||
|
version: ${{ needs.get-product-version.outputs.product-version }}
|
||
|
product: ${{ env.PKG_NAME }}
|
||
|
|
||
|
- uses: actions/upload-artifact@v2
|
||
|
with:
|
||
|
name: metadata.json
|
||
|
path: ${{ steps.generate-metadata-file.outputs.filepath }}
|
||
|
|
||
|
build:
|
||
|
needs: ["get-product-version", "get-go-version"]
|
||
|
runs-on: ubuntu-latest
|
||
|
strategy:
|
||
|
matrix:
|
||
|
include:
|
||
|
- {goos: "freebsd", goarch: "386"}
|
||
|
- {goos: "freebsd", goarch: "amd64"}
|
||
|
- {goos: "freebsd", goarch: "arm"}
|
||
|
- {goos: "linux", goarch: "386"}
|
||
|
- {goos: "linux", goarch: "amd64"}
|
||
|
- {goos: "linux", goarch: "arm"}
|
||
|
- {goos: "linux", goarch: "arm64"}
|
||
|
- {goos: "openbsd", goarch: "386"}
|
||
|
- {goos: "openbsd", goarch: "amd64"}
|
||
|
- {goos: "solaris", goarch: "amd64"}
|
||
|
- {goos: "windows", goarch: "386"}
|
||
|
- {goos: "windows", goarch: "amd64"}
|
||
|
fail-fast: false
|
||
|
|
||
|
name: Build for ${{ matrix.goos }}_${{ matrix.goarch }}
|
||
|
|
||
|
steps:
|
||
|
- uses: actions/checkout@v2
|
||
|
|
||
|
- name: Install Go toolchain
|
||
|
uses: actions/setup-go@v2
|
||
|
with:
|
||
|
go-version: ${{ needs.get-go-version.outputs.go-version }}
|
||
|
|
||
|
- name: Build
|
||
|
env:
|
||
|
GOOS: ${{ matrix.goos }}
|
||
|
GOARCH: ${{ matrix.goarch }}
|
||
|
run: |
|
||
|
mkdir dist out
|
||
|
go build -o dist/ .
|
||
|
zip -r -j out/${{ env.PKG_NAME }}_${{ needs.get-product-version.outputs.product-version }}_${{ matrix.goos }}_${{ matrix.goarch }}.zip dist/
|
||
|
|
||
|
- uses: actions/upload-artifact@v2
|
||
|
with:
|
||
|
name: ${{ env.PKG_NAME }}_${{ needs.get-product-version.outputs.product-version }}_${{ matrix.goos }}_${{ matrix.goarch }}.zip
|
||
|
path: out/${{ env.PKG_NAME }}_${{ needs.get-product-version.outputs.product-version }}_${{ matrix.goos }}_${{ matrix.goarch }}.zip
|
||
|
|
||
|
- name: Linux distribution packages
|
||
|
if: ${{ matrix.goos == 'linux' }}
|
||
|
uses: hashicorp/package@v1
|
||
|
with:
|
||
|
name: "terraform"
|
||
|
description: "Terraform enables you to safely and predictably create, change, and improve infrastructure. It is an open source tool that codifies APIs into declarative configuration files that can be shared amongst team members, treated as code, edited, reviewed, and versioned."
|
||
|
arch: ${{ matrix.goarch }}
|
||
|
version: ${{ needs.get-product-version.outputs.product-version }}
|
||
|
maintainer: "HashiCorp"
|
||
|
homepage: "https://terraform.io/"
|
||
|
license: "MPL-2.0"
|
||
|
binary: "dist/${{ env.PKG_NAME }}"
|
||
|
deb_depends: "git"
|
||
|
rpm_depends: "git"
|
||
|
|
||
|
- name: Gather Linux distribution package filenames
|
||
|
if: ${{ matrix.goos == 'linux' }}
|
||
|
run: |
|
||
|
echo "RPM_PACKAGE=$(basename out/*.rpm)" >> $GITHUB_ENV
|
||
|
echo "DEB_PACKAGE=$(basename out/*.deb)" >> $GITHUB_ENV
|
||
|
|
||
|
- uses: actions/upload-artifact@v2
|
||
|
if: ${{ matrix.goos == 'linux' }}
|
||
|
with:
|
||
|
name: ${{ env.RPM_PACKAGE }}
|
||
|
path: out/${{ env.RPM_PACKAGE }}
|
||
|
|
||
|
- uses: actions/upload-artifact@v2
|
||
|
if: ${{ matrix.goos == 'linux' }}
|
||
|
with:
|
||
|
name: ${{ env.DEB_PACKAGE }}
|
||
|
path: out/${{ env.DEB_PACKAGE }}
|
||
|
|
||
|
build-darwin:
|
||
|
needs: ["get-product-version", "get-go-version"]
|
||
|
runs-on: macos-latest
|
||
|
strategy:
|
||
|
matrix:
|
||
|
include:
|
||
|
- {goos: "darwin", goarch: "amd64"}
|
||
|
- {goos: "darwin", goarch: "arm64"}
|
||
|
fail-fast: false
|
||
|
|
||
|
name: Build for ${{ matrix.goos }}_${{ matrix.goarch }}
|
||
|
|
||
|
env:
|
||
|
GOOS: ${{ matrix.goos }}
|
||
|
GOARCH: ${{ matrix.goarch }}
|
||
|
|
||
|
steps:
|
||
|
- uses: actions/checkout@v2
|
||
|
|
||
|
- name: Install Go toolchain
|
||
|
uses: actions/setup-go@v2
|
||
|
with:
|
||
|
go-version: ${{ needs.get-go-version.outputs.go-version }}
|
||
|
|
||
|
- name: Build
|
||
|
run: |
|
||
|
mkdir dist out
|
||
|
go build -o dist/
|
||
|
zip -r -j out/${{ env.PKG_NAME }}_${{ needs.get-product-version.outputs.product-version }}_${{ matrix.goos }}_${{ matrix.goarch }}.zip dist/
|
||
|
|
||
|
- uses: actions/upload-artifact@v2
|
||
|
with:
|
||
|
name: ${{ env.PKG_NAME }}_${{ needs.get-product-version.outputs.product-version }}_${{ matrix.goos }}_${{ matrix.goarch }}.zip
|
||
|
path: out/${{ env.PKG_NAME }}_${{ needs.get-product-version.outputs.product-version }}_${{ matrix.goos }}_${{ matrix.goarch }}.zip
|
||
|
|
||
|
build-docker:
|
||
|
name: Build Docker image for linux_${{ matrix.arch }}
|
||
|
needs:
|
||
|
- get-product-version
|
||
|
- build
|
||
|
runs-on: ubuntu-latest
|
||
|
strategy:
|
||
|
matrix:
|
||
|
arch: ["amd64"]
|
||
|
fail-fast: false
|
||
|
env:
|
||
|
repo: ${{github.event.repository.name}}
|
||
|
version: ${{needs.get-product-version.outputs.product-version}}
|
||
|
|
||
|
steps:
|
||
|
- uses: actions/checkout@v2
|
||
|
- name: Build Docker images
|
||
|
uses: hashicorp/actions-docker-build@v1
|
||
|
with:
|
||
|
version: ${{env.version}}
|
||
|
target: default
|
||
|
arch: ${{matrix.arch}}
|
||
|
dockerfile: .github/workflows/build-Dockerfile
|
||
|
tags: |
|
||
|
docker.io/hashicorp/${{env.repo}}:${{env.version}}
|
||
|
986891699432.dkr.ecr.us-east-1.amazonaws.com/hashicorp/${{env.repo}}:${{env.version}}
|