Vor einigen Wochen haben wir zu dem Thema Makefile und GitHub Workflow / Actions schon einmal einen Beitrag geschrieben. In diesem Beitrag wollen wir Ihnen zeigen, wie Sie Assets zu Ihren Releases automatisiert bauen und anhängen können.
Zuersteinmal möchte ich Ihnen die von uns erstellte Konfiguration für die GitHub Action zeigen. Diese finden Sie einmal hier:
name: Assets
on:
release:
types:
- created
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Clone repository
uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Set up Go
uses: actions/setup-go@v3
with:
go-version: 1.19
- name: Cross compile the binary
run: make cross-compile
- name: Upload Linux binary
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ github.token }}
with:
upload_url: ${{ github.event.release.upload_url }}
asset_path: build/cross-compile/compver-amd64-linux
asset_name: compver-amd64-linux
asset_content_type: application/x-binary
- name: Upload Darwin binary
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ github.token }}
with:
upload_url: ${{ github.event.release.upload_url }}
asset_path: build/cross-compile/compver-amd64-darwin
asset_name: compver-amd64-darwin
asset_content_type: application/x-binary
- name: Upload Windows binary
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ github.token }}
with:
upload_url: ${{ github.event.release.upload_url }}
asset_path: build/cross-compile/compver-amd64-windows.exe
asset_name: compver-amd64-windows.exe
asset_content_type: application/x-binary
Generell ist dieser Workflow recht einfach strukturiert. In den Steps wird ein Klone vom Repository erstellt. Danach erstellen wir im nächsten Step, das Setup für Golang 1.19. Im nächsten Step erstellen wir die verschiedenen Binaries mithilfe eines Makefiles. Hier finden Sie einmal den Teil des Makefiles, der die Bineries generiert:
# Here you can reformat, check or build the binary.
BINARY_NAME=compver
GIT_TAG=$(shell git describe --tags --abbrev=0)
VERSION=$(if $(GIT_TAG),$(GIT_TAG),unavailible)
LDFLAGS=-ldflags "-X 'github.com/gowizzard/${BINARY_NAME}/v4/build_information.Version=${VERSION}'"
cross-compile:
GOOS=windows GOARCH=amd64 go build ${LDFLAGS} -o build/cross-compile/${BINARY_NAME}-amd64-windows.exe
GOOS=linux GOARCH=amd64 go build ${LDFLAGS} -o build/cross-compile/${BINARY_NAME}-amd64-linux
GOOS=darwin GOARCH=amd64 go build ${LDFLAGS} -o build/cross-compile/${BINARY_NAME}-amd64-darwin
Nachdem in der GitHub Action die verschiedenen Binaries erstellt wurden, werden diese in den nächsten und letzten drei Steps an das dazugehörige Release angehangen. Prinzipiell wird der Workflow nur ausgeführt, wenn ein neues Release erstellt wurde.
Somit können wir für zum Beispiel ein CLI Tool nie wieder bei einem neuen Release vergessen die Binaries zu dem Release hochzuladen.