From 6dc9f68b125be9130303dcc83cda35166af8885c Mon Sep 17 00:00:00 2001 From: Mikkeli Matlock Date: Tue, 11 Aug 2026 19:47:35 +0900 Subject: [PATCH] chore: repoint pipeline at the novoyuuparosk-wiki org MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This repo and the three source repos moved from the `mikkeli` account into the `novoyuuparosk-wiki` org. Rewrites cover repo paths only — the `mikkeli:` HTTP basic-auth usernames stay, since FAPAT/PKGRW_PAT remain personally owned, as do the `3005/mikkeli/*` image paths (Gitea cannot transfer packages). Bot identity moves to `Mikkeli@giteaBot`; both accounts hold the bot right, so edits stay flagged as bot edits. --- .gitea/workflows/build-image.yml | 4 ++-- .gitea/workflows/publish-ses.yml | 6 +++--- .gitea/workflows/publish-songs.yml | 6 +++--- .gitea/workflows/publish-tech.yml | 6 +++--- README.md | 25 +++++++++++++++---------- pipelines/ses/README.md | 6 +++--- pipelines/ses/SCHEMA.md | 2 +- pipelines/songs/README.md | 8 ++++---- pipelines/songs/SCHEMA.md | 2 +- pipelines/tech/README.md | 10 +++++----- pipelines/tech/SCHEMA.md | 2 +- 11 files changed, 41 insertions(+), 36 deletions(-) diff --git a/.gitea/workflows/build-image.yml b/.gitea/workflows/build-image.yml index e409a01..90b2f97 100644 --- a/.gitea/workflows/build-image.yml +++ b/.gitea/workflows/build-image.yml @@ -35,7 +35,7 @@ jobs: # Source via Gitea archive API (no git/node in this image; repo is # private — authenticate with the job's own per-run token) wget -qO /tmp/src.tar.gz \ - "http://mikkeli:${JOB_TOKEN}@${HOST}/api/v1/repos/mikkeli/novoyuuparosk-auto-wiki/archive/${GITHUB_SHA}.tar.gz" + "http://mikkeli:${JOB_TOKEN}@${HOST}/api/v1/repos/novoyuuparosk-wiki/novoyuuparosk-auto-wiki/archive/${GITHUB_SHA}.tar.gz" mkdir -p /tmp/src tar -xzf /tmp/src.tar.gz -C /tmp/src --strip-components=1 @@ -77,7 +77,7 @@ jobs: HOST="${URL_TO_GITEA#http://}" SHORT_SHA=$(echo "${GITHUB_SHA}" | cut -c1-7) - git clone "http://mikkeli:${FAPAT}@${HOST}/mikkeli/novoyuuparosk-auto-wiki" repo + git clone "http://mikkeli:${FAPAT}@${HOST}/novoyuuparosk-wiki/novoyuuparosk-auto-wiki" repo cd repo for f in .gitea/workflows/publish-songs.yml \ diff --git a/.gitea/workflows/publish-ses.yml b/.gitea/workflows/publish-ses.yml index 695a817..0a7be39 100644 --- a/.gitea/workflows/publish-ses.yml +++ b/.gitea/workflows/publish-ses.yml @@ -18,14 +18,14 @@ jobs: FAPAT: ${{ secrets.FAPAT }} URL_TO_GITEA: ${{ vars.URL_TO_GITEA }} run: | - git clone "http://mikkeli:${FAPAT}@${URL_TO_GITEA#http://}/mikkeli/ses-light-novel" ses-light-novel + git clone "http://mikkeli:${FAPAT}@${URL_TO_GITEA#http://}/novoyuuparosk-wiki/ses-light-novel" ses-light-novel git -C ses-light-novel checkout ${{ inputs.SOURCE_REF }} - name: Checkout auto-wiki env: FAPAT: ${{ secrets.FAPAT }} URL_TO_GITEA: ${{ vars.URL_TO_GITEA }} - run: git clone "http://mikkeli:${FAPAT}@${URL_TO_GITEA#http://}/mikkeli/novoyuuparosk-auto-wiki" auto-wiki + run: git clone "http://mikkeli:${FAPAT}@${URL_TO_GITEA#http://}/novoyuuparosk-wiki/novoyuuparosk-auto-wiki" auto-wiki - name: Publish env: @@ -34,7 +34,7 @@ jobs: WIKI_BOT_USER: ${{ secrets.WIKI_BOT_USER }} WIKI_BOT_PASSWORD: ${{ secrets.WIKI_BOT_PASSWORD }} SOURCE_REF: ${{ inputs.SOURCE_REF }} - GITEA_REPO_URL: ${{ vars.URL_TO_GITEA }}/mikkeli/ses-light-novel + GITEA_REPO_URL: ${{ vars.URL_TO_GITEA }}/novoyuuparosk-wiki/ses-light-novel run: | python auto-wiki/pipelines/ses/publish.py \ --source-dir ses-light-novel \ diff --git a/.gitea/workflows/publish-songs.yml b/.gitea/workflows/publish-songs.yml index 98ab45f..9cfd829 100644 --- a/.gitea/workflows/publish-songs.yml +++ b/.gitea/workflows/publish-songs.yml @@ -27,14 +27,14 @@ jobs: FAPAT: ${{ secrets.FAPAT }} URL_TO_GITEA: ${{ vars.URL_TO_GITEA }} run: | - git clone "http://mikkeli:${FAPAT}@${URL_TO_GITEA#http://}/mikkeli/ncmr-songs" ncmr-songs + git clone "http://mikkeli:${FAPAT}@${URL_TO_GITEA#http://}/novoyuuparosk-wiki/ncmr-songs" ncmr-songs git -C ncmr-songs checkout ${{ inputs.SOURCE_REF }} - name: Checkout auto-wiki env: FAPAT: ${{ secrets.FAPAT }} URL_TO_GITEA: ${{ vars.URL_TO_GITEA }} - run: git clone "http://mikkeli:${FAPAT}@${URL_TO_GITEA#http://}/mikkeli/novoyuuparosk-auto-wiki" auto-wiki + run: git clone "http://mikkeli:${FAPAT}@${URL_TO_GITEA#http://}/novoyuuparosk-wiki/novoyuuparosk-auto-wiki" auto-wiki - name: Detect changed files id: diff @@ -62,7 +62,7 @@ jobs: WIKI_BOT_USER: ${{ secrets.WIKI_BOT_USER }} WIKI_BOT_PASSWORD: ${{ secrets.WIKI_BOT_PASSWORD }} SOURCE_REF: ${{ inputs.SOURCE_REF }} - GITEA_REPO_URL: ${{ vars.URL_TO_GITEA }}/mikkeli/ncmr-songs + GITEA_REPO_URL: ${{ vars.URL_TO_GITEA }}/novoyuuparosk-wiki/ncmr-songs run: | MODE="${{ steps.diff.outputs.mode }}" if [ "$MODE" = "all" ] || [ "${{ inputs.FULL_PUBLISH }}" = "true" ]; then diff --git a/.gitea/workflows/publish-tech.yml b/.gitea/workflows/publish-tech.yml index 30fa4de..9856fe2 100644 --- a/.gitea/workflows/publish-tech.yml +++ b/.gitea/workflows/publish-tech.yml @@ -18,14 +18,14 @@ jobs: FAPAT: ${{ secrets.FAPAT }} URL_TO_GITEA: ${{ vars.URL_TO_GITEA }} run: | - git clone "http://mikkeli:${FAPAT}@${URL_TO_GITEA#http://}/mikkeli/tech-blogs" tech-blogs + git clone "http://mikkeli:${FAPAT}@${URL_TO_GITEA#http://}/novoyuuparosk-wiki/tech-blogs" tech-blogs git -C tech-blogs checkout ${{ inputs.SOURCE_REF }} - name: Checkout auto-wiki env: FAPAT: ${{ secrets.FAPAT }} URL_TO_GITEA: ${{ vars.URL_TO_GITEA }} - run: git clone "http://mikkeli:${FAPAT}@${URL_TO_GITEA#http://}/mikkeli/novoyuuparosk-auto-wiki" auto-wiki + run: git clone "http://mikkeli:${FAPAT}@${URL_TO_GITEA#http://}/novoyuuparosk-wiki/novoyuuparosk-auto-wiki" auto-wiki - name: Publish env: @@ -34,7 +34,7 @@ jobs: WIKI_BOT_USER: ${{ secrets.WIKI_BOT_USER }} WIKI_BOT_PASSWORD: ${{ secrets.WIKI_BOT_PASSWORD }} SOURCE_REF: ${{ inputs.SOURCE_REF }} - GITEA_REPO_URL: ${{ vars.URL_TO_GITEA }}/mikkeli/tech-blogs + GITEA_REPO_URL: ${{ vars.URL_TO_GITEA }}/novoyuuparosk-wiki/tech-blogs run: | python auto-wiki/pipelines/tech/publish.py \ --source-dir tech-blogs \ diff --git a/README.md b/README.md index e4b6495..b18237e 100644 --- a/README.md +++ b/README.md @@ -6,9 +6,9 @@ CI/CD pipelines that auto-apply commits to https://wiki.novoyuuparosk.org from u | Path | Source repo | Purpose | Status | |---|---|---|---| -| [`pipelines/songs/`](pipelines/songs/) | `mikkeli/ncmr-songs` | Song lyric pages | v1 live | -| [`pipelines/ses/`](pipelines/ses/) | `mikkeli/ses-light-novel` | SES light novel pages | v1 in development | -| [`pipelines/tech/`](pipelines/tech/) | `mikkeli/tech-blogs` | Tech blog posts | v1 live | +| [`pipelines/songs/`](pipelines/songs/) | `novoyuuparosk-wiki/ncmr-songs` | Song lyric pages | v1 live | +| [`pipelines/ses/`](pipelines/ses/) | `novoyuuparosk-wiki/ses-light-novel` | SES light novel pages | v1 in development | +| [`pipelines/tech/`](pipelines/tech/) | `novoyuuparosk-wiki/tech-blogs` | Tech blog posts | v1 live | Per-pipeline READMEs cover everything specific to that pipeline (source schema, renderer, runtime, decisions). This root README covers only what's cross-cutting. @@ -35,9 +35,11 @@ Note: `workflow_call` across private repos was abandoned — the auto-generated ## Bot identity -MediaWiki BotPassword issued for user `Dubrowski`, bot name `giteaAutomaton`. Login form: `Dubrowski@giteaAutomaton`. +MediaWiki BotPassword issued for user `Mikkeli`, bot name `giteaBot`. Login form: `Mikkeli@giteaBot`. -Credentials are stored in the Gitea user-scope secret vault under `mikkeli` (`WIKI_BOT_USER`, `WIKI_BOT_PASSWORD`). Not stored in this repo. +Both this and the previous `Dubrowski` identity hold the `bot` right, so pipeline edits stay flagged as bot edits and keep out of default Recent Changes — `mwclient`'s `page.save()` requests the bot flag and the wiki honours it. + +Credentials are stored in the Gitea org-scope secret vault under `novoyuuparosk-wiki` (`WIKI_BOT_USER`, `WIKI_BOT_PASSWORD`). Not stored in this repo. ## Runner infrastructure @@ -57,12 +59,13 @@ A follow-up `pin` job then rewrites the `image:` pin in each `publish-*.yml` to ## Gitea Actions setup (cross-cutting) -Secrets and variables are scoped to user `mikkeli` (no orgs on this instance), inherited by all repos under that account. +Secrets and variables are scoped to the `novoyuuparosk-wiki` org, inherited by all repos under it. Runs belong to the *caller* repo, so a source repo calling a reusable workflow here resolves secrets and variables from its own owner — which is why they live at org scope rather than on this repo. **Secrets:** -- `WIKI_BOT_USER` = `Dubrowski@giteaAutomaton` +- `WIKI_BOT_USER` = `Mikkeli@giteaBot` - `WIKI_BOT_PASSWORD` = the value from *Bot identity* above -- `FAPAT` = Full-Access PAT under `mikkeli`, used by source-repo workflows to clone this repo at runtime +- `FAPAT` = Full-Access PAT owned by `mikkeli`, used by source-repo workflows to clone this repo at runtime. The PAT stays personal; only its storage scope moved to the org — hence the `mikkeli:` basic-auth username in the clone URLs. +- `PKGRW_PAT` = package read/write PAT owned by `mikkeli`, used by `build-image.yml` to push to the container registry **Variables:** - `WIKI_BASE_URL` = `https://wiki.novoyuuparosk.org` @@ -83,6 +86,8 @@ Secrets and variables are scoped to user `mikkeli` (no orgs on this instance), i | Runner execution | Docker, added as a service to the existing Gitea docker-compose | 2026-06-09 | | Runner network mode | `host` — job containers need to reach Gitea on localhost | 2026-06-09 | | Secret/runner scope | User-level on `mikkeli` (no orgs on this instance) | 2026-06-09 | +| Ownership | This repo and all three source repos moved to the `novoyuuparosk-wiki` org. Keeping caller and callee under one owner avoids the cross-owner read gate on private reusable workflows (Settings → Actions → General → collaborative owners, Gitea 1.26+). Secrets/variables re-created at org scope; runner must serve org-owned runs | 2026-08-11 | +| Container registry | Packages are not transferable in Gitea, so images stay at `pi5-16.local:3005/mikkeli/*` for now. Registry auth still uses the `mikkeli`-owned `PKGRW_PAT` | 2026-08-11 | | MediaWiki API path | `api.php` (classic action API) | 2026-06-09 | | Branch naming (this repo) | `automation/` for pipeline-development branches | 2026-06-09 | | Variable naming | `URL_TO_GITEA` not `GITEA_URL` — Gitea blocks `GITEA_`/`GITHUB_` prefixes | 2026-06-09 | @@ -92,9 +97,9 @@ Per-pipeline decisions live in each pipeline's README. ## Setup checklist (cross-cutting) -Via the Gitea web UI logged in as `mikkeli`: +Via the Gitea web UI logged in as `mikkeli` (an owner of `novoyuuparosk-wiki`): -- [x] User-scoped secrets and variables set per *Gitea Actions setup* above +- [x] Org-scoped secrets and variables set per *Gitea Actions setup* above - [x] `WIKI_BOT_USER` - [x] `WIKI_BOT_PASSWORD` - [x] `FAPAT` (Full-Access PAT — value not stored in this README; saved directly into the Gitea secret. Regenerate if lost.) diff --git a/pipelines/ses/README.md b/pipelines/ses/README.md index 4490a35..9fe7747 100644 --- a/pipelines/ses/README.md +++ b/pipelines/ses/README.md @@ -1,6 +1,6 @@ # pipelines/ses -Publishes SES light novel pages from `mikkeli/ses-light-novel` to `https://wiki.novoyuuparosk.org` under the `SES:` namespace. +Publishes SES light novel pages from `novoyuuparosk-wiki/ses-light-novel` to `https://wiki.novoyuuparosk.org` under the `SES:` namespace. - Source-file contract (frontmatter and body conventions): [SCHEMA.md](SCHEMA.md) - Cross-cutting setup (wiki URL, bot identity, runner, Gitea secrets/variables): [repo root README](../../README.md) @@ -24,7 +24,7 @@ Not in scope (intentional): ## Source repo and branch convention -Source repo: `mikkeli/ses-light-novel`. The pipeline triggers on push to `master`. +Source repo: `novoyuuparosk-wiki/ses-light-novel`. The pipeline triggers on push to `master`. No branch convention enforced — work directly on `master` or use whatever branch workflow suits. @@ -34,7 +34,7 @@ No branch convention enforced — work directly on `master` or use whatever bran ## Invocation -The pipeline runs as a self-contained Gitea Actions workflow in `mikkeli/ses-light-novel` (`.gitea/workflows/publish.yml`). It clones this repo at runtime to get the renderer. +The pipeline runs as a self-contained Gitea Actions workflow in `novoyuuparosk-wiki/ses-light-novel` (`.gitea/workflows/publish.yml`). It clones this repo at runtime to get the renderer. Triggers: - `push` to `master` (path-filtered as above) diff --git a/pipelines/ses/SCHEMA.md b/pipelines/ses/SCHEMA.md index 33e6b75..431ba0a 100644 --- a/pipelines/ses/SCHEMA.md +++ b/pipelines/ses/SCHEMA.md @@ -1,6 +1,6 @@ # SCHEMA — SES light novel source files -Source-file contract for the SES pipeline. Files in `mikkeli/ses-light-novel` must follow this contract to be picked up by the auto-publisher. +Source-file contract for the SES pipeline. Files in `novoyuuparosk-wiki/ses-light-novel` must follow this contract to be picked up by the auto-publisher. The schema lives entirely in the YAML frontmatter block at the top of each `.md` file. The body below the frontmatter is plain markdown, rendered to MediaWiki wikitext by Pandoc. diff --git a/pipelines/songs/README.md b/pipelines/songs/README.md index 38c99cb..e688f55 100644 --- a/pipelines/songs/README.md +++ b/pipelines/songs/README.md @@ -1,6 +1,6 @@ # pipelines/songs -Publishes lyric pages from `mikkeli/ncmr-songs` to `https://wiki.novoyuuparosk.org`. +Publishes lyric pages from `novoyuuparosk-wiki/ncmr-songs` to `https://wiki.novoyuuparosk.org`. - Source-file contract (frontmatter and body conventions): [SCHEMA.md](SCHEMA.md) - Cross-cutting setup (wiki URL, bot identity, runner, Gitea secrets/variables): [repo root README](../../README.md) @@ -27,7 +27,7 @@ Not in scope (intentional): ## Source repo and branch convention -Source repo: `mikkeli/ncmr-songs`. The pipeline triggers on push to `master`. +Source repo: `novoyuuparosk-wiki/ncmr-songs`. The pipeline triggers on push to `master`. **Branch convention in `ncmr-songs`**: per-song short-lived branches named `autowiki/` (e.g., `autowiki/pulse`). Create when staging edits, merge to master when ready to publish, delete after one cycle. @@ -38,7 +38,7 @@ Source repo: `mikkeli/ncmr-songs`. The pipeline triggers on push to `master`. ## Invocation -The pipeline runs as a self-contained Gitea Actions workflow in `mikkeli/ncmr-songs` (`.gitea/workflows/publish.yml`). It clones this repo at runtime to get the renderer. +The pipeline runs as a self-contained Gitea Actions workflow in `novoyuuparosk-wiki/ncmr-songs` (`.gitea/workflows/publish.yml`). It clones this repo at runtime to get the renderer. Triggers: - `push` to `master` (path-filtered as above) @@ -50,7 +50,7 @@ Triggers: |---|---|---|---| | `WIKI_API_URL` | variable | Gitea (cross-cutting) | MediaWiki action API endpoint | | `WIKI_BASE_URL` | variable | Gitea (cross-cutting) | Wiki base URL | -| `WIKI_BOT_USER` | secret | Gitea (cross-cutting) | Bot login (`Dubrowski@giteaAutomaton`) | +| `WIKI_BOT_USER` | secret | Gitea (cross-cutting) | Bot login (`Mikkeli@giteaBot`) | | `WIKI_BOT_PASSWORD` | secret | Gitea (cross-cutting) | BotPasswords value | | `URL_TO_GITEA` | variable | Gitea (cross-cutting) | Gitea instance base URL for cloning | | `FAPAT` | secret | Gitea (cross-cutting) | Full-Access PAT for cloning private repos | diff --git a/pipelines/songs/SCHEMA.md b/pipelines/songs/SCHEMA.md index a42efa0..3b2da86 100644 --- a/pipelines/songs/SCHEMA.md +++ b/pipelines/songs/SCHEMA.md @@ -1,6 +1,6 @@ # SCHEMA — song source files -Source-file contract for the songs pipeline. Files in `mikkeli/ncmr-songs` must follow this contract to be picked up by the auto-publisher. +Source-file contract for the songs pipeline. Files in `novoyuuparosk-wiki/ncmr-songs` must follow this contract to be picked up by the auto-publisher. The schema lives entirely in the YAML frontmatter block at the top of each `.md` file. The body below the frontmatter is plain markdown, rendered to MediaWiki wikitext by Pandoc — no special body conventions are enforced beyond the standard markdown grammar, except that `[[TAG]]` placeholders declared via `wiki.siblings` are substituted with resolved wikilinks after rendering. diff --git a/pipelines/tech/README.md b/pipelines/tech/README.md index ecc7fc0..4efefb4 100644 --- a/pipelines/tech/README.md +++ b/pipelines/tech/README.md @@ -1,6 +1,6 @@ # pipelines/tech -Publishes tech blog posts from `mikkeli/tech-blogs` to `https://wiki.novoyuuparosk.org`. +Publishes tech blog posts from `novoyuuparosk-wiki/tech-blogs` to `https://wiki.novoyuuparosk.org`. - Source-file contract (frontmatter and body conventions): [SCHEMA.md](SCHEMA.md) - Cross-cutting setup (wiki URL, bot identity, runner, Gitea secrets/variables): [repo root README](../../README.md) @@ -18,7 +18,7 @@ Publishes tech blog posts from `mikkeli/tech-blogs` to `https://wiki.novoyuuparo ## Source repo -Source repo: `mikkeli/tech-blogs` (not yet initialised — pipeline code is ready). +Source repo: `novoyuuparosk-wiki/tech-blogs` (not yet initialised — pipeline code is ready). The pipeline triggers on push to `master` and supports `workflow_dispatch` for manual runs. @@ -28,7 +28,7 @@ The pipeline triggers on push to `master` and supports `workflow_dispatch` for m ## Invocation -The pipeline runs as a self-contained Gitea Actions workflow in `mikkeli/tech-blogs` (`.gitea/workflows/publish.yml`). It clones this repo at runtime to get the renderer. +The pipeline runs as a self-contained Gitea Actions workflow in `novoyuuparosk-wiki/tech-blogs` (`.gitea/workflows/publish.yml`). It clones this repo at runtime to get the renderer. Triggers: - `push` to `master` (path-filtered as above) @@ -71,8 +71,8 @@ Shared code lives in `lib/wiki.py` (repo root). | Publish mode | Always `--all` | 2026-06-10 | | Idempotency | Commit SHA in banner | 2026-06-10 | | Manual-page protection | Bot skips pages without `{{Auto-generated` banner | 2026-06-10 | -| Source repo | `mikkeli/tech-blogs` — pipeline ships before repo is initialised | 2026-06-10 | +| Source repo | `novoyuuparosk-wiki/tech-blogs` — pipeline ships before repo is initialised | 2026-06-10 | ## Status -v1 pipeline ready. Source repo (`mikkeli/tech-blogs`) not yet initialised. +v1 pipeline ready. Source repo (`novoyuuparosk-wiki/tech-blogs`) not yet initialised. diff --git a/pipelines/tech/SCHEMA.md b/pipelines/tech/SCHEMA.md index 9747857..51e295b 100644 --- a/pipelines/tech/SCHEMA.md +++ b/pipelines/tech/SCHEMA.md @@ -1,6 +1,6 @@ # SCHEMA — tech blog source files -Source-file contract for the tech blog pipeline. Files in `mikkeli/tech-blogs` must follow this contract to be picked up by the auto-publisher. +Source-file contract for the tech blog pipeline. Files in `novoyuuparosk-wiki/tech-blogs` must follow this contract to be picked up by the auto-publisher. The schema lives entirely in the YAML frontmatter block at the top of each `.md` file. The body is plain markdown, rendered to MediaWiki wikitext by Pandoc.