From e2c0db2a5de2437c230fad53c903f26bcb87c664 Mon Sep 17 00:00:00 2001 From: wtclaude Date: Wed, 30 Sep 2026 04:52:36 -0500 Subject: [PATCH] ci(release): ask the installer to recompose the Rust bundle (stage 4, D224) RunicNPC is the Rust bundle's third artefact from stage 4, so its release ends as Rust-Plugins' does: a dispatch of the installer's bundle workflow, warned rather than failed when the token cannot reach it. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY --- .gitea/workflows/release.yml | 38 ++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index 7d32328..06ecca1 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -38,9 +38,12 @@ # sidecar (PLAN.md §4): the bridge calls it in-process. What a consumer pairs # on is the API version other plugins call, from plugin.toml. # -# 4. NO BUNDLE DISPATCH, YET. The installer does not know RunicNPC until stage 4 -# makes it a third artefact of the Rust bundle (D224). That stage adds the -# step Rust-Plugins ends with, which asks RunicGateway/installer to recompose. +# 4. THE BUNDLE IS RECOMPOSED. Since stage 4 RunicNPC is the Rust bundle's third +# artefact (D224): the installer's compose job carries the latest RunicNPC +# release that answers the API the bridge declares (Rust-Plugins' overlay.toml +# `runicnpc_api`). The last step here asks RunicGateway/installer to +# recompose, as Rust-Plugins' release does; the installer's nightly cron covers +# a dispatch that did not arrive. # # The version is stamped into the shipped copy's `[Info(…)]` attribute, so # `oxide.plugins` / `c.plugins` on a server names the release it runs. The @@ -55,7 +58,9 @@ # Prerequisites (Settings → Actions → Secrets on RunicGateway/runicnpc-rust, or # the organisation's): # REGISTRY_TOKEN — Gitea access token with `write:repository`, to push the -# tag and create the release. +# tag and create the release. The final step also dispatches +# RunicGateway/installer's bundle workflow, so the token +# needs write on that repo too; without it that step warns. # REGISTRY_USER — the Gitea username that token belongs to. name: Release plugin @@ -71,6 +76,7 @@ concurrency: env: GITEA_HOST: gitea.whitlocktech.com + INSTALLER_REPO: RunicGateway/installer REPO: RunicGateway/runicnpc-rust ARTIFACT: runicnpc PLUGIN: plugin/RunicNPC.cs @@ -474,3 +480,27 @@ jobs: fi echo " uploaded ${f}" done + + # ── Recompose the installer's bundle manifest (D224) ───────────────── + # DISPATCH, DON'T WAIT, as Rust-Plugins' release does. A dropped dispatch + # costs latency, not correctness: the installer's nightly cron recomputes + # the bundle from whatever the latest releases actually are. + - name: Ask the installer repo to recompose its bundle + if: ${{ steps.plan.outputs.release == 'true' }} + env: + REGISTRY_TOKEN: ${{ secrets.REGISTRY_TOKEN }} + run: | + set -euo pipefail + CI_TOKEN="$(printf '%s' "${REGISTRY_TOKEN}" | tr -d '\r\n')" + HTTP="$(curl -s -o /dev/null -w '%{http_code}' -X POST \ + -H "Authorization: token ${CI_TOKEN}" \ + -H "Content-Type: application/json" \ + -d '{"ref":"main"}' \ + "https://${GITEA_HOST}/api/v1/repos/${INSTALLER_REPO}/actions/workflows/bundle.yml/dispatches" || echo 000)" + case "$HTTP" in + 20*) echo "Dispatched ${INSTALLER_REPO} bundle.yml (HTTP ${HTTP}) — not waiting for it." ;; + 403|404) + echo "::warning::Could not dispatch ${INSTALLER_REPO} bundle.yml (HTTP ${HTTP}). REGISTRY_TOKEN likely lacks write:repository on that repo. Release ${{ steps.plan.outputs.tag }} is published and fine; its bundle will be composed by the installer's nightly cron instead." ;; + *) + echo "::warning::Dispatching ${INSTALLER_REPO} bundle.yml returned HTTP ${HTTP}. Release ${{ steps.plan.outputs.tag }} is published and fine; the nightly cron will recompose the bundle." ;; + esac