2 min read | by Jordi Prats
In order to build binaries for multiple architectures, we can use GoReleaser together with Github Actions so that they get built automatically when we create a release.
We are going to use as an example how binaries are built for kubectl's searchrule plugin. First we need to configure GoReleaser using the .goreleaser.yaml file:
project_name: kubectl-searchrule builds: - goos: - linux - windows - darwin goarch: - amd64 - arm64 main: ./rule-lookup.go binary: kubectl-searchrule env: - CGO_ENABLED=0 - >- {{- if eq .Os "darwin" }} {{- if eq .Arch "amd64"}}CC=o64-clang{{- end }} {{- if eq .Arch "arm64"}}CC=aarch64-apple-darwin20.2-clang{{- end }} {{- end }} {{- if eq .Os "windows" }} {{- if eq .Arch "amd64" }}CC=x86_64-w64-mingw32-gcc{{- end }} {{- end }} {{- if eq .Os "linux" }} {{- if eq .Arch "arm64" }}CC=aarch64-linux-gnu-gcc{{- end }} {{- end }} ignore: - goos: darwin goarch: 386 - goos: linux goarch: arm goarm: 7 - goarm: mips64 - gomips: hardfloat - goamd64: v4
While this file instructs GoReleaser what to do, we'll need to create a Github Action workflow to tell it when to do it.
Using the folowing file in .github/workflows/releaser.yaml we are telling it how to build it using GoReleaser when a tag is pushed that matches the configured regex:
name: Release CLI on: push: tags: - 'v[0-9]+.[0-9]+' jobs: release-cli: name: Release CLI runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v3 - name: Set up Go uses: actions/setup-go@v4 with: go-version: 1.19.x - name: Run GoReleaser uses: goreleaser/goreleaser-action@v4 with: distribution: goreleaser version: latest args: -f .goreleaser.yaml release --clean env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Upload assets uses: actions/upload-artifact@v3 with: name: kubectl-searchrule path: dist/* if-no-files-found: error
Since we are using the actions/upload-artifact action, the resulting files will be uploaded as an asset in the releases page.
Posted on 08/08/2023