CLI releases

This commit is contained in:
Matthew Knight 2026-03-02 19:55:33 -08:00
parent effa388025
commit 75b7dac0d7
No known key found for this signature in database
2 changed files with 66 additions and 4 deletions

View File

@ -60,16 +60,41 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install Go
uses: actions/setup-go@v5
with:
go-version: "1.25.7"
- name: Build Go binaries
- name: Compute next version
run: |
CGO_ENABLED=0 GOOS=linux go build -ldflags="-w -s" -o ./bin/cairn-server ./cmd/cairn-server
CGO_ENABLED=0 GOOS=linux go build -ldflags="-w -s" -o ./bin/cairn ./cmd/cairn
LATEST_TAG=$(git tag --list 'v*' --sort=-v:refname | head -n1)
if [ -z "${LATEST_TAG}" ]; then
NEXT="v0.1.0"
else
# Bump patch: v0.1.2 -> v0.1.3
PREFIX="${LATEST_TAG%.*}"
PATCH="${LATEST_TAG##*.}"
NEXT="${PREFIX}.$((PATCH + 1))"
fi
echo "VERSION=${NEXT}" >> "$GITHUB_ENV"
echo "Next version: ${NEXT}"
- name: Build server binary
run: CGO_ENABLED=0 GOOS=linux go build -ldflags="-w -s" -o ./bin/cairn-server ./cmd/cairn-server
- name: Cross-compile CLI
run: |
LDFLAGS="-w -s -X main.version=${VERSION}"
for pair in linux/amd64 linux/arm64 darwin/amd64 darwin/arm64; do
GOOS="${pair%/*}"
GOARCH="${pair#*/}"
CGO_ENABLED=0 GOOS="${GOOS}" GOARCH="${GOARCH}" \
go build -ldflags="${LDFLAGS}" -o "./bin/cairn-${GOOS}-${GOARCH}" ./cmd/cairn
done
cp ./bin/cairn-linux-amd64 ./bin/cairn
- name: Install Docker CLI
run: |
@ -98,6 +123,26 @@ jobs:
docker push "${REGISTRY}/cairn:${GITHUB_SHA}"
docker push "${REGISTRY}/cairn:latest"
- name: Create git tag
run: |
git tag "${VERSION}"
git push origin "${VERSION}"
- name: Publish CLI to package registry
run: |
PKG="${GITHUB_SERVER_URL}/api/packages/${GITHUB_REPOSITORY_OWNER}/generic/cairn"
AUTH="Authorization: token ${{ secrets.PACKAGES_TOKEN }}"
for file in ./bin/cairn-*; do
filename="$(basename "${file}")"
curl -fsSL -X PUT -H "${AUTH}" --upload-file "${file}" "${PKG}/${VERSION}/${filename}"
done
# Overwrite "latest": delete old files then upload
for file in ./bin/cairn-*; do
filename="$(basename "${file}")"
curl -sS -X DELETE -H "${AUTH}" "${PKG}/latest/${filename}" || true
curl -fsSL -X PUT -H "${AUTH}" --upload-file "${file}" "${PKG}/latest/${filename}"
done
- name: Update infra
uses: https://git.ts.mattnite.net/mattnite/infra/actions/update-image@main
with:

View File

@ -11,6 +11,8 @@ import (
"path/filepath"
)
var version = "dev"
func main() {
if len(os.Args) < 2 {
usage()
@ -18,6 +20,9 @@ func main() {
}
switch os.Args[1] {
case "version":
fmt.Println(version)
return
case "upload":
if err := cmdUpload(os.Args[2:]); err != nil {
fmt.Fprintf(os.Stderr, "error: %v\n", err)
@ -69,6 +74,7 @@ Upload flags:
-crash-message MSG Crash message (optional)
-stack-trace TRACE Stack trace text (optional)
-seed VALUE Simulation seed for reproducibility (optional, stored in metadata)
-target NAME Target name/platform (optional, stored in metadata)
`)
}
@ -83,6 +89,7 @@ func cmdUpload(args []string) error {
crashMessage string
stackTrace string
seed string
target string
)
for i := 0; i < len(args); i++ {
@ -114,6 +121,9 @@ func cmdUpload(args []string) error {
case "-seed":
i++
seed = args[i]
case "-target":
i++
target = args[i]
default:
return fmt.Errorf("unknown flag: %s", args[i])
}
@ -135,8 +145,15 @@ func cmdUpload(args []string) error {
if stackTrace != "" {
meta["stack_trace"] = stackTrace
}
md := map[string]any{}
if seed != "" {
meta["metadata"] = map[string]any{"seed": seed}
md["seed"] = seed
}
if target != "" {
md["target"] = target
}
if len(md) > 0 {
meta["metadata"] = md
}
metaJSON, err := json.Marshal(meta)