diff --git a/.forgejo/workflows/deploy.yml b/.forgejo/workflows/deploy.yml index 12656fa..3d2ae32 100644 --- a/.forgejo/workflows/deploy.yml +++ b/.forgejo/workflows/deploy.yml @@ -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: diff --git a/cmd/cairn/main.go b/cmd/cairn/main.go index 231610c..b39c753 100644 --- a/cmd/cairn/main.go +++ b/cmd/cairn/main.go @@ -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)