docs: Gitea pipeline operating notes; ci-image build publishes to registry
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AqpXh3hQMMaC74pTjFq4it
This commit is contained in:
@@ -1,6 +1,10 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
# Build peptide-ci-php into the gitea-dind daemon the shared runner uses.
|
# Rebuild the CI image (PHP 8.1/8.2/8.3 + Composer) and publish it to the Gitea
|
||||||
|
# registry. Run on the KVM8 as root. Pulls are anonymous (public org), but the
|
||||||
|
# push needs `docker exec -i gitea-dind docker login git.protopeer.com` first with
|
||||||
|
# a Gitea token that has write:package. Bump TAG and CI_IMAGE in
|
||||||
|
# tools/gitea-pipeline/render.py together, then re-render the pipelines.
|
||||||
set -e
|
set -e
|
||||||
TAG=peptide-ci-php:2026-10
|
TAG=git.protopeer.com/peptide-repo/ci-php:2026-10
|
||||||
docker exec -i gitea-dind docker build -t "$TAG" - < "$(dirname "$0")/Dockerfile"
|
docker exec -i gitea-dind docker build -t "$TAG" - < "$(dirname "$0")/Dockerfile"
|
||||||
docker exec gitea-dind docker image inspect "$TAG" --format '{{.Id}} {{.Size}}'
|
docker exec gitea-dind docker push "$TAG"
|
||||||
|
|||||||
68
docs/gitea-pipeline.md
Normal file
68
docs/gitea-pipeline.md
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
# Gitea Actions pipeline (peptide-repo)
|
||||||
|
|
||||||
|
Since 2026-10-24 every peptide-repo plugin/theme builds and deploys from
|
||||||
|
`git.protopeer.com/peptide-repo`, not GitHub. GitHub's `.github/workflows` are
|
||||||
|
left in the repos but Gitea ignores them (a repo with `.gitea/workflows` uses
|
||||||
|
only that folder).
|
||||||
|
|
||||||
|
## How it fits together
|
||||||
|
|
||||||
|
- **Shared logic lives once**, as composite actions in this repo under
|
||||||
|
`.gitea/actions/`: `deploy`, `smoke`, `ci-lint-php`, `ci-phpcs`,
|
||||||
|
`ci-file-size`, `ci-phpunit`, `ci-lint-js`, `audit-direct-push`.
|
||||||
|
Gitea 1.25 cannot run reusable workflows (`workflow_call`), which is why this
|
||||||
|
is not a 1:1 copy of the GitHub `deploy-app.yml` / `ci.yml`.
|
||||||
|
- **Each repo's `.gitea/workflows/pipeline.yml` is generated** by
|
||||||
|
`tools/gitea-pipeline/render.py` from `tools/gitea-pipeline/repos.json`.
|
||||||
|
Change a repo's settings in `repos.json`, re-render, commit the output. Do not
|
||||||
|
hand-edit the generated files.
|
||||||
|
- **Job graph:** lint-php / phpcs / file-size / phpunit / lint-js (+ repo extras)
|
||||||
|
-> deploy-staging -> smoke (gate) -> deploy-production. Deploys run on pushes
|
||||||
|
to `main` and on manual runs of `main`.
|
||||||
|
- **Runners:** CI jobs run on the shared docker runner (`ubuntu-latest`) inside
|
||||||
|
`git.protopeer.com/peptide-repo/ci-php:2026-10` (PHP 8.1/8.2/8.3 + Composer,
|
||||||
|
built from `ci-image/`). Deploy and smoke run on the host runner
|
||||||
|
`peptide-vps-gitea` (systemd `gitea-runner-peptide`, user `gtrunner`, label
|
||||||
|
`peptide-vps`) on the KVM8, one job at a time, like the old GitHub runner.
|
||||||
|
- **Secrets / variables** are org-level on Gitea `peptide-repo`:
|
||||||
|
`SSH_PRIVATE_KEY` (deploy key `gitea-peptide-deploy-20261024` on Hostinger),
|
||||||
|
`SSH_HOST`, `SSH_PORT`, `SSH_USERNAME`, `STAGING_WP_ADMIN_USER` (`gitea-smoke`,
|
||||||
|
staging-only admin), `STAGING_WP_ADMIN_PASSWORD`; variable `PROD_DEPLOY_ENABLED`.
|
||||||
|
|
||||||
|
## Switches and recovery
|
||||||
|
|
||||||
|
- **Kill switch:** set org variable `PROD_DEPLOY_ENABLED` to anything but `true`
|
||||||
|
-> production deploys (and `peptide-news-plugin` rollback) are skipped;
|
||||||
|
staging + smoke still run.
|
||||||
|
- **Redeploy / retry:** run the repo's `CI / Deploy` workflow on `main` manually.
|
||||||
|
- **Roll back news plugin:** `peptide-news-plugin` -> `Rollback Deployment`
|
||||||
|
(workflow_dispatch, optional commit SHA). Same deploy action as normal.
|
||||||
|
- **Drift:** `deploy-health.yml` (daily 13:00 UTC / 21:00 SGT) compares the
|
||||||
|
commit stamped in `~/.peptide-deploys/production/<target>` on Hostinger with
|
||||||
|
each repo's `main`, and opens one "Deploy drift detected" issue here.
|
||||||
|
- **Back to GitHub (emergency):** `systemctl enable --now
|
||||||
|
actions.runner.peptide-repo.peptide-vps` on the KVM8 and set
|
||||||
|
`PROD_DEPLOY_ENABLED=false` here. Only works while GitHub's Hostinger deploy
|
||||||
|
key is still authorised.
|
||||||
|
|
||||||
|
## Differences from the GitHub pipeline (deliberate)
|
||||||
|
|
||||||
|
- `.gitea` is also excluded from rsync.
|
||||||
|
- JS lint uses Node 22 (GitHub used Node 20, now end-of-life).
|
||||||
|
- Smoke login confirms WordPress's periodic "Administration email verification"
|
||||||
|
screen instead of timing out on it (it had been blocking smoke since
|
||||||
|
2026-09-10, when staging's admin-email check expired).
|
||||||
|
- Production stamps the deployed commit for deploy-health (replaces GitHub
|
||||||
|
Deployments).
|
||||||
|
- PHP matrices are literal lists (avoids Gitea's `fromJson` matrix bug).
|
||||||
|
|
||||||
|
## Known gaps
|
||||||
|
|
||||||
|
- `pr-vision` `cto-review.yml` (AI PR review via OpenRouter) is **not ported**:
|
||||||
|
its `OPENROUTER_API_KEY` / `CTO_ADMIN_TOKEN` secrets only exist on GitHub and
|
||||||
|
it calls GitHub's review API.
|
||||||
|
- The LiteSpeed purge in the production deploy runs relative to `$HOME`, so it is
|
||||||
|
effectively a no-op - same as on GitHub. Kept as-is, not fixed.
|
||||||
|
- Issues / PR history of repos other than peptide-e2e stayed on GitHub (the
|
||||||
|
migration hit GitHub's anonymous API rate limit); GitHub repos are to be
|
||||||
|
archived, not deleted.
|
||||||
Reference in New Issue
Block a user