refactor: stand up vantage-ctl as its own repository

vantagectl/ becomes the repository root, so the module is
gitea.hostxtra.co.uk/vantage/vantage-ctl and the image is
vantage/vantage-ctl. The command keeps the name vantagectl.

Release tags become a bare v*: the vantagectl/ prefix existed to
namespace one component inside a shared repository, and unlike the
agent's agent/v* nothing reads this one programmatically.
This commit is contained in:
2026-09-08 09:05:21 +00:00
parent c9471f73ba
commit 4ee3382e2b
6 changed files with 282 additions and 7 deletions
+136
View File
@@ -0,0 +1,136 @@
name: Release
on:
push:
# A bare v* now this is its own repository. The old prefixed
# vantagectl/v* tag existed to namespace one component's releases
# inside a shared repository, and unlike the agent's agent/v* — which
# the control plane greps release tag names for — nothing reads this
# one programmatically. Releases before the move keep their prefixed
# tags in the monorepo's release list.
tags:
- "v*"
jobs:
build:
runs-on: ubuntu-docker
container: node:26
env:
GOPRIVATE: gitea.hostxtra.co.uk/*
steps:
- name: Checkout
uses: actions/checkout@v4
# vantage-shared is a private module, so the Go builds below cannot
# resolve it without a credential.
- name: Write the module fetch credential
run: |
umask 077
printf 'machine gitea.hostxtra.co.uk\nlogin %s\npassword %s\n' \
"${{ secrets.REGISTRY_USER }}" "${{ secrets.RELEASE_TOKEN }}" \
> "$HOME/.netrc"
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: "1.26"
cache: true
cache-dependency-path: go.sum
- name: Extract version
id: version
run: echo "VERSION=${GITHUB_REF_NAME}" >> $GITHUB_OUTPUT
- name: Test
run: go test ./...
- name: Build
env:
VERSION: ${{ steps.version.outputs.VERSION }}
run: |
mkdir -p dist
for target in linux/amd64 linux/arm64 darwin/arm64 windows/amd64; do
goos="${target%/*}"
goarch="${target#*/}"
out="dist/vantagectl-${goos}-${goarch}"
if [ "$goos" = "windows" ]; then out="${out}.exe"; fi
CGO_ENABLED=0 GOOS="$goos" GOARCH="$goarch" go build \
-ldflags="-s -w -X main.Version=${VERSION}" \
-o "$out" .
done
- name: Checksums
working-directory: dist
run: sha256sum vantagectl-* > checksums.txt
- name: Create release
uses: https://gitea.com/actions/gitea-release-action@v1
with:
token: ${{ secrets.RELEASE_TOKEN }}
files: |
dist/vantagectl-linux-amd64
dist/vantagectl-linux-arm64
dist/vantagectl-darwin-arm64
dist/vantagectl-windows-amd64.exe
dist/checksums.txt
# The image is built here rather than in server-deploy.yml on every push to
# main, because vantagectl is a released tool rather than a running service.
# An operator restoring a database should be able to name the version they
# ran; ":latest, rebuilt whenever main moved" cannot be named after the
# fact. It is a separate job from the binaries because it needs a
# docker-capable runner rather than a Go one, and it does not need the
# binaries — the image builds from source in its own stage.
image:
runs-on: ubuntu-docker
container: docker:dind
steps:
- name: Setup
run: apk add --update nodejs npm git
- name: Checkout
uses: actions/checkout@v4
- name: Extract version
id: version
run: |
# v0.1.0 for the binary stamp, 0.1.0 for the image tag: a
# leading v is conventional on a git tag and unconventional on
# a container tag.
VERSION="${GITHUB_REF_NAME}"
echo "VERSION=${VERSION}" >> $GITHUB_OUTPUT
echo "IMAGE_TAG=${VERSION#v}" >> $GITHUB_OUTPUT
# The image build resolves the private vantage-shared module, so
# it needs a credential of its own — this job does not share the
# build job's filesystem.
- name: Write the module fetch credential
run: |
umask 077
printf 'machine gitea.hostxtra.co.uk\nlogin %s\npassword %s\n' \
"${{ secrets.REGISTRY_USER }}" "${{ secrets.RELEASE_TOKEN }}" \
> "$HOME/.netrc"
- name: Log in to registry
run: |
echo "${{ secrets.RELEASE_TOKEN }}" | \
docker login ${{ vars.DOCKER_HOST }} \
-u "${{ secrets.REGISTRY_USER }}" --password-stdin
- name: Build and push image
env:
VERSION: ${{ steps.version.outputs.VERSION }}
IMAGE_TAG: ${{ steps.version.outputs.IMAGE_TAG }}
run: |
REPO="${{ vars.DOCKER_HOST }}/vantage/vantage-ctl"
# VERSION is passed through so `vantagectl --version` inside
# the image reports the tag it was built from rather than
# "dev". The context is the repository root.
docker build \
--build-arg VERSION="${VERSION}" \
--secret id=netrc,src="$HOME/.netrc" \
-t "${REPO}:${IMAGE_TAG}" \
-t "${REPO}:latest" \
-f Dockerfile .
docker push "${REPO}:${IMAGE_TAG}"
docker push "${REPO}:latest"