From ffe60f4a8ce024bedf7d2d1ec1fcffcaebd382f5 Mon Sep 17 00:00:00 2001 From: Alex Lovell-Troy Date: Wed, 5 Feb 2025 12:01:10 -0500 Subject: [PATCH] chore: update build workflow and add container build script (#70) * chore: update build workflow and add container build script * Add build dependencies to workflow * fix: remove unnecessary magellan installation path from goreleaser config --- .github/workflows/main.yml | 11 +++++-- .goreleaser.yaml | 56 +++++++++++++++++------------------ build-in-container.sh | 60 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 96 insertions(+), 31 deletions(-) create mode 100644 build-in-container.sh diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 1136387..d5109a2 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -21,6 +21,13 @@ jobs: - name: Set up QEMU uses: docker/setup-qemu-action@v3 + + - name: Install dependencies + run: | + sudo apt update && sudo apt install -y curl git gcc g++ make \ + gcc-aarch64-linux-gnu binutils-aarch64-linux-gnu \ + libc6-dev-arm64-cross software-properties-common + - name: Checkout uses: actions/checkout@v4 @@ -53,6 +60,6 @@ jobs: args: release --clean id: goreleaser - name: Attest Binaries - uses: actions/attest-build-provenance@v1 + uses: actions/attest-build-provenance@v2 with: - subject-path: '${{ github.workspace }}/dist/magellan_linux_amd64_v3/magellan' + subject-checksums: dist/checksums.txt diff --git a/.goreleaser.yaml b/.goreleaser.yaml index d8552b6..df7b3c8 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -27,18 +27,20 @@ builds: - version goos: - linux - - darwin - - windows goarch: - amd64 - arm64 goamd64: - v3 + goarm: + - 7 env: - - CGO_ENABLED=0 + - CGO_ENABLED=1 + - CC={{ if eq .Arch "arm64" }}aarch64-linux-gnu-gcc{{ else }}gcc{{ end }} + - CXX={{ if eq .Arch "arm64" }}aarch64-linux-gnu-g++{{ else }}g++{{ end }} archives: - - format: tar.gz + - formats: [ 'tar.gz' ] # this name template makes the OS and Arch compatible with the results of uname. name_template: >- {{ .ProjectName }}_ @@ -54,23 +56,22 @@ archives: - magellan.1 nfpms: - - id: magellan - formats: - - deb - - rpm - - apk - - archlinux - maintainer: "David J. Allen " - description: "Magellan is a discovery tool for BMCs." - homepage: "https://www.openchami.org" - license: MIT - section: utils - priority: optional - contents: - - src: dist/magellan_{{ .Os }}_{{ if eq .Arch "amd64" }}{{ .Arch }}_{{ .Amd64 }}{{ else }}{{ .Arch }}{{ end }}/magellan - dst: /usr/local/bin/magellan - - src: magellan.1 - dst: /usr/share/man/man1/ + - id: magellan + formats: + - deb + - rpm + - apk + - archlinux + maintainer: "David J. Allen " + description: "Magellan is a discovery tool for BMCs." + homepage: "https://www.openchami.org" + license: MIT + section: utils + priority: optional + contents: + - src: magellan.1 + dst: /usr/share/man/man1/ + dockers: @@ -93,7 +94,7 @@ dockers: - CHANGELOG.md - README.md - image_templates: - - &arm64v8_linux_image ghcr.io/openchami/{{.ProjectName}}:{{ .Tag }}-arm64 + - &arm64v7_linux_image ghcr.io/openchami/{{.ProjectName}}:{{ .Tag }}-arm64 - ghcr.io/openchami/{{.ProjectName}}:{{ .Major }}-arm64 - ghcr.io/openchami/{{.ProjectName}}:{{ .Major }}.{{ .Minor }}-arm64 use: buildx @@ -114,25 +115,22 @@ docker_manifests: - name_template: "ghcr.io/openchami/{{.ProjectName}}:latest" image_templates: - *amd64_linux_image - - *arm64v8_linux_image + - *arm64v7_linux_image - name_template: "ghcr.io/openchami/{{.ProjectName}}:{{ .Tag }}" image_templates: - *amd64_linux_image - - *arm64v8_linux_image + - *arm64v7_linux_image - name_template: "ghcr.io/openchami/{{.ProjectName}}:{{ .Major }}" image_templates: - *amd64_linux_image - - *arm64v8_linux_image + - *arm64v7_linux_image - name_template: "ghcr.io/openchami/{{.ProjectName}}:{{ .Major }}.{{ .Minor }}" image_templates: - *amd64_linux_image - - *arm64v8_linux_image - - - + - *arm64v7_linux_image checksum: name_template: 'checksums.txt' diff --git a/build-in-container.sh b/build-in-container.sh new file mode 100644 index 0000000..ba07c82 --- /dev/null +++ b/build-in-container.sh @@ -0,0 +1,60 @@ +#!/bin/bash + +# This script uses the latest Ubuntu 24.04 container to build the project with GoReleaser. It emulates the GitHub Actions environment as closely as possible. +# Before submitting a PR for release/build. please run this script to ensure your PR will pass the build. + +# Name of the container +CONTAINER_NAME="goreleaser-build" + +# Directory where built binaries will be available +OUTPUT_DIR="$(pwd)/dist" + +export GIT_STATE=$(if git diff-index --quiet HEAD --; then echo 'clean'; else echo 'dirty'; fi) +export BUILD_HOST=$(hostname) +export GO_VERSION=$(go version | awk '{print $3}') +export BUILD_USER=$(whoami) + +# Start a new disposable Ubuntu 24.04 container with the current directory mounted +${CONTAINER_CMD:-docker} run --rm -it \ + --name "$CONTAINER_NAME" \ + -v "$(pwd)":/workspace \ + -w /workspace \ + ubuntu:24.04 bash -c " + + # Suppress timezone prompts + export DEBIAN_FRONTEND=noninteractive + export TZ=UTC + + + # Update package lists and install dependencies + apt update && apt install -y curl git gcc g++ make \ + gcc-aarch64-linux-gnu binutils-aarch64-linux-gnu \ + libc6-dev-arm64-cross software-properties-common + + # Install Go (match GitHub runner version) + curl -fsSL https://golang.org/dl/go1.21.5.linux-amd64.tar.gz | tar -C /usr/local -xz + export PATH=\$PATH:/usr/local/go/bin + go version # Verify Go installation + + # Set GOPATH and update PATH to include Go binaries + export GOPATH=\$(go env GOPATH) + export PATH=\$PATH:\$GOPATH/bin + echo \"GOPATH: \$GOPATH\" && echo \"PATH: \$PATH\"`` + + # Install Goreleaser + curl -sL https://github.com/goreleaser/goreleaser/releases/latest/download/goreleaser_Linux_x86_64.tar.gz | tar -xz -C /usr/local/bin + goreleaser --version # Verify Goreleaser installation + + # Set Build Environment Variables + export GIT_STATE="$GIT_STATE" + export BUILD_HOST="$BUILD_HOST" + export BUILD_USER="$BUILD_USER" + export GO_VERSION=$(go version | awk '{print $3}') + + # Run Goreleaser + goreleaser build --snapshot --clean +" + +# Notify user of success +echo "✅ Build complete! Check the output in: $OUTPUT_DIR" +