Files
LithosAnanke/.gitea/workflows/release.yml
T
rajamesandClaude Opus 5.5 0fd7648a77
Build / Image RASPI (push) Successful in 4m19s
Build / Image PC (push) Successful in 4m14s
Build / Image MILKV (push) Successful in 4m30s
Build / v4 tests (32- and 64-bit cells) (push) Successful in 11m19s
Acceptance / Acceptance (pull_request) Successful in 16m48s
ci: acceptance.yml gates every PR into master; master only through an accepted PR
Captain Bob, 2026-11-06: what a developer runs, what CI runs and what
the nightly runs are one process, and "failures should not be allowed
to be merged to master".

acceptance.yml runs on every PR into master (opened, pushed to,
reopened): .claude/CLAUDE.md's acceptance protocol through the same
scripts/nightly.sh stages -- amd64, aarch64, riscv64 to [zuse@Hera]
ok>, the PC stick loaded high (and the three agree on dict_hash), then
make -C v4 test-32 -- one QEMU at a time, in one job. Its logs and DoE
CSVs are kept, pass or fail. master's branch protection requires it.

acceptance, nightly and release share the concurrency group qemu, so
the runner never runs two of them at once: CLAUDE.md's one-QEMU rule
holds in CI too. build.yml becomes the quick check on pushes only.

.claude/CLAUDE.md's Hard Rules: commit and push directly on the working
branch; master only through a PR that passed acceptance, no direct
pushes; no approval required while there is one developer. Named: the
Captain Bob method.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GE3SDvQn5EoxdGufk84zz2
2026-11-06 16:24:22 +00:00

86 lines
3.1 KiB
YAML

# A release: pushing a tag v<version> builds that commit exactly as the nightly does -- the
# acceptance protocol, the proofs, the board images -- and the documents, and publishes both to
# starshipos-releases at that version:
#
# org.starship:kernelImage:<version> classifiers pc, raspi5, milkv, logs (nightly.yml)
# org.starship:documentation:<version> classifiers book, vol1, vol2, vol3, api (nightly-docs.yml)
#
# The tag must name the version the tree says it is: v<LITHOS_VERSION> (kernel/Makefile). A tag
# that does not is refused before anything is built. A release repository takes a version once.
name: Release
on:
push:
tags: ['v*']
concurrency:
group: qemu # one QEMU at a time on the runner: shared with acceptance.yml
cancel-in-progress: false
jobs:
release:
name: Release ${{ github.ref_name }}
runs-on: ubuntu-latest
container:
image: gitea/runner-images:ubuntu-24.04-v26.11.03 # the runner's own ubuntu-latest is Debian 11 (node:20-bullseye)
timeout-minutes: 240
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
lfs: false
- name: The tag names the tree's version
run: |
tree="v$(sed -n 's/^LITHOS_VERSION *?= *//p' kernel/Makefile)"
echo "tag ${{ github.ref_name }}, kernel/Makefile LITHOS_VERSION -> $tree"
[ "${{ github.ref_name }}" = "$tree" ] || { echo "The tag must be $tree, or LITHOS_VERSION changed first."; exit 1; }
echo "NIGHTLY_VERSION=${tree#v}" >> "$GITHUB_ENV"
- name: Install the dependencies
run: |
make ARCH=amd64,aarch64,riscv64 init
DEBIAN_FRONTEND=noninteractive apt-get install -y -qq maven default-jre-headless
- name: Acceptance amd64
run: scripts/nightly.sh accept amd64
- name: Acceptance aarch64
run: scripts/nightly.sh accept aarch64
- name: Acceptance riscv64
run: scripts/nightly.sh accept riscv64
- name: Acceptance PC stick loaded high
run: scripts/nightly.sh accept stick-high
- name: Acceptance 32-bit build
run: scripts/nightly.sh test-32
- name: Isabelle/HOL proofs
run: scripts/nightly.sh proofs
- name: Images
run: scripts/nightly.sh images
- name: Documents
run: scripts/nightly.sh docs
- name: Publish to Nexus
env:
NEXUS_USER: ci-publisher
NEXUS_PASSWORD: ${{ secrets.NEXUS_CI_PASSWORD }}
run: |
scripts/nightly.sh publish https://nexus.starshipos-f18.org/repository/starshipos-releases
scripts/nightly.sh publish-docs https://nexus.starshipos-f18.org/repository/starshipos-releases
- name: Keep the release
uses: actions/upload-artifact@v3
with:
name: release-${{ github.ref_name }}
path: |
build/nightly/
build/nightly-docs/
- name: Keep the logs and DoE CSVs
if: always()
uses: actions/upload-artifact@v3
with:
name: release-logs-${{ github.ref_name }}
path: |
logs/
experiments/bare_metal/runs/