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: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install Go - name: Install Go
uses: actions/setup-go@v5 uses: actions/setup-go@v5
with: with:
go-version: "1.25.7" go-version: "1.25.7"
- name: Build Go binaries - name: Compute next version
run: | run: |
CGO_ENABLED=0 GOOS=linux go build -ldflags="-w -s" -o ./bin/cairn-server ./cmd/cairn-server LATEST_TAG=$(git tag --list 'v*' --sort=-v:refname | head -n1)
CGO_ENABLED=0 GOOS=linux go build -ldflags="-w -s" -o ./bin/cairn ./cmd/cairn 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 - name: Install Docker CLI
run: | run: |
@ -98,6 +123,26 @@ jobs:
docker push "${REGISTRY}/cairn:${GITHUB_SHA}" docker push "${REGISTRY}/cairn:${GITHUB_SHA}"
docker push "${REGISTRY}/cairn:latest" 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 - name: Update infra
uses: https://git.ts.mattnite.net/mattnite/infra/actions/update-image@main uses: https://git.ts.mattnite.net/mattnite/infra/actions/update-image@main
with: with:

View File

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