From 041d134079cfbedb2c8f44f8fa3dad34311fe3a5 Mon Sep 17 00:00:00 2001 From: Alex Lovell-Troy Date: Wed, 30 Oct 2024 09:56:44 -0600 Subject: [PATCH] refactor: Update Go version This commit updates the Go version to the latest stable release and adds QEMU setup to the GitHub workflow. It also sets up the necessary environment variables required by GoReleaser. These changes ensure that the project is using the latest Go version and is ready for release. Adds support for more architectures, package types, and better docker image. --- .github/workflows/main.yml | 29 ++++++-- .github/workflows/prbuild.yml | 44 ++++++++++++ .gitignore | 1 + .goreleaser.yaml | 109 +++++++++++++++++++++++++----- Dockerfile | 10 ++- bin/magellan.sh | 122 ---------------------------------- dist/archlinux/PKGBUILD | 29 -------- 7 files changed, 168 insertions(+), 176 deletions(-) create mode 100644 .github/workflows/prbuild.yml delete mode 100755 bin/magellan.sh delete mode 100644 dist/archlinux/PKGBUILD diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 2629cfd..edf7304 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -14,21 +14,36 @@ jobs: runs-on: ubuntu-latest steps: - - name: Set up Go 1.21 + - name: Set up latest stable Go uses: actions/setup-go@v5 with: - go-version: 1.21 + go-version: stable + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-tags: 1 + fetch-depth: 1 + + # Set environment variables required by GoReleaser + - name: Set build environment variables + run: | + echo "GIT_STATE=$(if git diff-index --quiet HEAD --; then echo 'clean'; else echo 'dirty'; fi)" >> $GITHUB_ENV + echo "BUILD_HOST=$(hostname)" >> $GITHUB_ENV + echo "GO_VERSION=$(go version | awk '{print $3}')" >> $GITHUB_ENV + echo "BUILD_USER=$(whoami)" >> $GITHUB_ENV + echo "CGO_ENABLED=1" >> $GITHUB_ENV + - name: Docker Login uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - - name: Checkout - uses: actions/checkout@v4 - with: - fetch-tags: 1 - fetch-depth: 0 + - name: Release with goreleaser uses: goreleaser/goreleaser-action@v6 env: diff --git a/.github/workflows/prbuild.yml b/.github/workflows/prbuild.yml new file mode 100644 index 0000000..476ba60 --- /dev/null +++ b/.github/workflows/prbuild.yml @@ -0,0 +1,44 @@ +name: Build PR with goreleaser + +on: + pull_request: + branches: + - main + types: [opened, synchronize, reopened, edited] + workflow_dispatch: + +jobs: + prbuild: + runs-on: ubuntu-latest + steps: + + - name: Set up latest stable Go + uses: actions/setup-go@v5 + with: + go-version: stable + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-tags: 1 + fetch-depth: 1 + + # Set environment variables required by GoReleaser + - name: Set build environment variables + run: | + echo "GIT_STATE=$(if git diff-index --quiet HEAD --; then echo 'clean'; else echo 'dirty'; fi)" >> $GITHUB_ENV + echo "BUILD_HOST=$(hostname)" >> $GITHUB_ENV + echo "GO_VERSION=$(go version | awk '{print $3}')" >> $GITHUB_ENV + echo "BUILD_USER=$(whoami)" >> $GITHUB_ENV + echo "CGO_ENABLED=1" >> $GITHUB_ENV + + - name: Build with goreleaser + uses: goreleaser/goreleaser-action@v6 + + with: + version: '~> v2' + args: release --snapshot + id: goreleaser \ No newline at end of file diff --git a/.gitignore b/.gitignore index 45e95ea..aeafd79 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ emulator/rf-emulator **.part dist/* **coverage.out** +magellan.1 \ No newline at end of file diff --git a/.goreleaser.yaml b/.goreleaser.yaml index b202123..4eca1fe 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -7,12 +7,33 @@ before: - go-md2man -in README.md -out magellan.1 builds: - - env: - - CGO_ENABLED=1 + - binary: magellan + # 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) + ldflags: + - "-X main.GitCommit={{.Commit}} \ + -X main.BuildTime={{.Timestamp}} \ + -X main.Version={{.Version}} \ + -X main.GitBranch={{.Branch}} \ + -X main.GitTag={{.Tag}} \ + -X main.GitState={{ .Env.GIT_STATE }} \ + -X main.BuildHost={{ .Env.BUILD_HOST }} \ + -X main.GoVersion={{ .Env.GO_VERSION }} \ + -X main.BuildUser={{ .Env.BUILD_USER }} " goos: - linux + - darwin + - windows goarch: - amd64 + - arm64 + goamd64: + - v3 + env: + - CGO_ENABLED=0 + archives: - format: tar.gz # this name template makes the OS and Arch compatible with the results of uname. @@ -27,17 +48,55 @@ archives: - LICENSE - CHANGELOG.md - README.md - - bin/magellan.sh - 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/ + + dockers: - - - image_templates: - - ghcr.io/openchami/{{.ProjectName}}:latest - - ghcr.io/openchami/{{.ProjectName}}:{{ .Tag }} - - ghcr.io/openchami/{{.ProjectName}}:v{{ .Major }} - - ghcr.io/openchami/{{.ProjectName}}:v{{ .Major }}.{{ .Minor }} + - image_templates: + - &amd64_linux_image ghcr.io/openchami/{{.ProjectName}}:{{ .Tag }}-amd64 + - ghcr.io/openchami/{{.ProjectName}}:{{ .Major }}-amd64 + - ghcr.io/openchami/{{.ProjectName}}:{{ .Major }}.{{ .Minor }}-amd64 + use: buildx build_flag_templates: - "--pull" + - "--platform=linux/amd64" + - "--label=org.opencontainers.image.created={{.Date}}" + - "--label=org.opencontainers.image.title={{.ProjectName}}" + - "--label=org.opencontainers.image.revision={{.FullCommit}}" + - "--label=org.opencontainers.image.version={{.Version}}" + goarch: amd64 + goamd64: v3 + extra_files: + - LICENSE + - CHANGELOG.md + - README.md + - image_templates: + - &arm64v8_linux_image ghcr.io/openchami/{{.ProjectName}}:{{ .Tag }}-arm64 + - ghcr.io/openchami/{{.ProjectName}}:{{ .Major }}-arm64 + - ghcr.io/openchami/{{.ProjectName}}:{{ .Major }}.{{ .Minor }}-arm64 + use: buildx + build_flag_templates: + - "--pull" + - "--platform=linux/arm64" - "--label=org.opencontainers.image.created={{.Date}}" - "--label=org.opencontainers.image.title={{.ProjectName}}" - "--label=org.opencontainers.image.revision={{.FullCommit}}" @@ -46,7 +105,32 @@ dockers: - LICENSE - CHANGELOG.md - README.md - - bin/magellan.sh + goarch: arm64 + +docker_manifests: + - name_template: "ghcr.io/openchami/{{.ProjectName}}:latest" + image_templates: + - *amd64_linux_image + - *arm64v8_linux_image + + - name_template: "ghcr.io/openchami/{{.ProjectName}}:{{ .Tag }}" + image_templates: + - *amd64_linux_image + - *arm64v8_linux_image + + - name_template: "ghcr.io/openchami/{{.ProjectName}}:{{ .Major }}" + image_templates: + - *amd64_linux_image + - *arm64v8_linux_image + + - name_template: "ghcr.io/openchami/{{.ProjectName}}:{{ .Major }}.{{ .Minor }}" + image_templates: + - *amd64_linux_image + - *arm64v8_linux_image + + + + checksum: name_template: 'checksums.txt' snapshot: @@ -57,8 +141,3 @@ changelog: exclude: - '^docs:' - '^test:' -release: - github: - name_template: "{{.Version}}" - prerelease: auto - mode: append diff --git a/Dockerfile b/Dockerfile index 510a291..d9632fe 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,13 +1,17 @@ -FROM cgr.dev/chainguard/wolfi-base +FROM chainguard/wolfi-base:latest -RUN apk add --no-cache tini bash +# Include curl in the final image for manual checks of the Redfish urls +RUN set -ex \ + && apk update \ + && apk add --no-cache curl tini \ + && rm -rf /var/cache/apk/* \ + && rm -rf /tmp/* # nobody 65534:65534 USER 65534:65534 COPY magellan /magellan -COPY /bin/magellan.sh /magellan.sh CMD [ "/magellan" ] diff --git a/bin/magellan.sh b/bin/magellan.sh deleted file mode 100755 index c91d922..0000000 --- a/bin/magellan.sh +++ /dev/null @@ -1,122 +0,0 @@ -#!/bin/bash - -EXE=./magellan -SUBNETS="" -PORTS="" -USER="" -PASS="" -SMD_HOST="" -SMD_PORT="" -THREADS="1" -TIMEOUT="30" -ARGS="" -FORCE_UPDATE=false -SCAN_PARAMS="" -COLLECT_PARAMS="" - - -function scan() { - # ./magellan scan --subnet 172.16.0.0 --port 443 - ${EXE} scan ${SCAN_PARAMS} - # --subnet ${SUBNETS} \ - # --port ${PORTS} \ - # --timeout ${TIMEOUT} \ - # --threads ${THREADS} -} - -function list(){ - # ./magellan list - ${EXE} list -} - -function collect() { - # ./magellan collect --user admin --pass password - ${EXE} collect ${COLLECT_PARAMS} - # --user ${USER} \ - # --pass ${PASS} \ - # --timeout ${TIMEOUT} \ - # --threads ${THREADS} \ - # --host ${SMD_HOST} \ - # --port ${SMD_PORT} \ - # --force-update ${FORCE_UPDATE} -} - - -# parse incoming arguments to set variables -while [[ $# -gt 0 ]]; do - case $1 in - --scan) - SCAN_PARAMS="$2" - shift - shift - ;; - --collect) - COLLECT_PARAMS="$2" - shift - shift - ;; - --subnet) - SUBNETS="$2" - shift # past argument - shift # past value - ;; - -p|--port) - PORTS="$2" - shift # past argument - shift # past value - ;; - --user) - USER="$2" - shift # past argument - shift # past value - ;; - --pass|--password) - PASS="$2" - shift - shift - ;; - --smd-host) - SMD_HOST="$2" - shift - shift - ;; - --smd-port) - SMD_PORT="$2" - shift - shift - ;; - --timeout) - TIMEOUT="$2" - shift - shift - ;; - --threads) - THREADS="$2" - shift - shift - ;; - -*|--*) - echo "Unknown option $1" - exit 1 - ;; - *) - ARGS+=("$1") # save positional arg - shift # past argument - ;; - esac -done - -set -- "${POSITIONAL_ARGS[@]}" # restore positional parameters - -if [[ -n $1 ]]; then - echo "Last line of file specified as non-opt/last argument:" - tail -1 "$1" -fi - -scan -collect - -# run with docker -# docker run magellan:latest magellan.sh \ -# --scan "--subnet 127.16.0.0 --port 443" \ -# --collect "--user admin --pass password --timeout 300 --threads 1 --smd-host host --smd-port port" \ No newline at end of file diff --git a/dist/archlinux/PKGBUILD b/dist/archlinux/PKGBUILD deleted file mode 100644 index 23e69b7..0000000 --- a/dist/archlinux/PKGBUILD +++ /dev/null @@ -1,29 +0,0 @@ -# Maintainer: David J. Allen -pkgname=magellan -pkgver=v0.1.5 -pkgrel=1 -pkgdesc="Redfish-based BMC discovery tool written in Go" -arch=("x86_64") -url="https://github.com/OpenCHAMI/magellan" -license=('MIT') -groups=("openchami") -provides=('magellan') -conflicts=('magellan') -source_x86_64=("${url}/releases/download/${pkgver}/${pkgname}_Linux_x86_64.tar.gz") -sha256sums_x86_64=('1bb028d592d5389b519362e6aa7021f27443f0b36471e09ee7f47ab5cb6d4d7f') - -# Please refer to the 'USING VCS SOURCES' section of the PKGBUILD man page for -# a description of each element in the source array. - -pkgver() { - cd "$srcdir" || exit - printf "%s" "$(git describe --tags --abbrev=0)" -} - -package() { - cd "$srcdir/" || exit - - # install the binary to /usr/bin - mkdir -p "${pkgdir}/usr/bin" - install -m755 magellan "${pkgdir}/usr/bin/magellan" -}