88145225cc
On a v* tag, builds the x86_64-unknown-linux-musl binary in the CI image and publishes it (+ .sha256) to a Gitea release via the API and the auto GITEA_TOKEN. x86_64 Linux only for now; rest of the D1 matrix and D3 packaging layer on later. Correctness comes from the branch gate.
70 lines
2.7 KiB
YAML
70 lines
2.7 KiB
YAML
# Release: on a version tag, build the static Linux binary (D2) and publish it
|
|
# to a Gitea release with a checksum. Runs in the same prebuilt CI image as the
|
|
# gate, so the pinned toolchain + musl target/cc are already warm.
|
|
#
|
|
# Scope: x86_64-unknown-linux-musl only, for now. The rest of the D1 matrix
|
|
# (aarch64, macOS, Windows) and the D3 package-manager manifests layer on later,
|
|
# step by step.
|
|
#
|
|
# Correctness comes from the branch gate (clippy + test) that ran when the
|
|
# tagged commit was pushed; this job builds + publishes, it does not re-test.
|
|
name: release
|
|
on:
|
|
push:
|
|
tags:
|
|
- 'v*'
|
|
|
|
jobs:
|
|
release:
|
|
runs-on: ci-public
|
|
container:
|
|
image: git.lazyeval.net/oli/rdbms-playground-ci:latest
|
|
env:
|
|
TARGET: x86_64-unknown-linux-musl
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- name: build static binary
|
|
run: nix develop -c cargo build --release --target "$TARGET"
|
|
|
|
- name: package artifacts
|
|
run: |
|
|
set -euo pipefail
|
|
BIN="target/$TARGET/release/rdbms-playground"
|
|
file "$BIN"
|
|
OUT="rdbms-playground-${{ github.ref_name }}-$TARGET"
|
|
mkdir -p dist
|
|
cp "$BIN" "dist/$OUT"
|
|
( cd dist && sha256sum "$OUT" > "$OUT.sha256" )
|
|
ls -l dist
|
|
|
|
- name: publish gitea release + assets
|
|
env:
|
|
# Auto-provided by Gitea Actions; has repo write (release) scope.
|
|
TOKEN: ${{ secrets.GITEA_TOKEN }}
|
|
API: ${{ github.server_url }}/api/v1
|
|
REPO: ${{ github.repository }}
|
|
TAG: ${{ github.ref_name }}
|
|
run: |
|
|
set -euo pipefail
|
|
# Create the release for this tag; if it already exists, look it up.
|
|
created=$(curl -sS -X POST "$API/repos/$REPO/releases" \
|
|
-H "Authorization: token $TOKEN" \
|
|
-H "Content-Type: application/json" \
|
|
-d "{\"tag_name\":\"$TAG\",\"name\":\"$TAG\",\"body\":\"Automated release for $TAG.\"}")
|
|
id=$(printf '%s' "$created" | node -e 'let s="";process.stdin.on("data",d=>s+=d).on("end",()=>{try{const o=JSON.parse(s);process.stdout.write(String(o.id||""))}catch(e){}})')
|
|
if [ -z "$id" ]; then
|
|
id=$(curl -sS "$API/repos/$REPO/releases/tags/$TAG" \
|
|
-H "Authorization: token $TOKEN" \
|
|
| node -e 'let s="";process.stdin.on("data",d=>s+=d).on("end",()=>{process.stdout.write(String(JSON.parse(s).id))})')
|
|
fi
|
|
echo "release id: $id"
|
|
for f in dist/*; do
|
|
name=$(basename "$f")
|
|
echo "uploading $name"
|
|
curl -sS -X POST "$API/repos/$REPO/releases/$id/assets?name=$name" \
|
|
-H "Authorization: token $TOKEN" \
|
|
-F "attachment=@$f" > /dev/null
|
|
done
|
|
echo "published $TAG"
|