From 326132c795447e87759d3264aa3b980ff8908c78 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Mon, 19 Oct 2026 03:15:07 +0700 Subject: [PATCH] docs(ci): record the Linux gate and the linux-v* tag rules --- .claude/rules/ci.md | 10 +++++----- .claude/skills/release/SKILL.md | 2 +- AGENTS.md | 2 +- RELEASING.md | 2 +- linux/ROADMAP.md | 2 +- linux/docs/releasing.md | 7 +++---- 6 files changed, 12 insertions(+), 13 deletions(-) diff --git a/.claude/rules/ci.md b/.claude/rules/ci.md index 9b2f3c0190..a9f10fddf3 100644 --- a/.claude/rules/ci.md +++ b/.claude/rules/ci.md @@ -18,15 +18,15 @@ The required check names are in `AGENTS.md` (CI). Reading a red check: `.claude/ | Ruleset | Refs | Rules | Bypass | |---|---|---|---| -| 25308039 "tags never move" | tags `v*`, `libs-*` | update, deletion | none | -| 23959123 "release tags are created by admins" | tags `v*`, `libs-*`, `plugin-*` | creation | admins | +| 25308039 "tags never move" | tags `v*`, `linux-v*`, `libs-*` | update, deletion | none | +| 23959123 "release tags are created by admins" | tags `v*`, `linux-v*`, `libs-*`, `plugin-*` | creation | admins | | 25308049 "release branches are created by admins" | `release/*` | creation | admins | -| 23957966 "main and release branches require green gates" | default branch, `release/*` | the five required checks, `do_not_enforce_on_create` | none | +| 23957966 "main and release branches require green gates" | default branch, `release/*` | the required checks, `do_not_enforce_on_create` | none | | 25129799 "branches keep their history" | default branch, `release/*`, `gh-pages` | deletion, non-fast-forward | none | - `gh-pages` takes no required checks (`RELEASING.md`, Keys and environments). -- There are no gate jobs. A test job runs on `!cancelled() && needs.changes.outputs.run != 'false'`. A job its `if:` skips reports success, and a failed changes job runs the suite rather than skipping it. -- `Changes (macOS)`, `Changes (iOS)` and `Changes (Release)` are not required checks. +- The Apple workflows have no gate job. A test job runs on `!cancelled() && needs.changes.outputs.run != 'false'`. A job its `if:` skips reports success, and a failed changes job runs the suite rather than skipping it. +- `Changes (macOS)`, `Changes (iOS)`, `Changes (Linux)` and `Changes (Release)` are not required checks. - A PR need not be up to date with main to merge (`strict_required_status_checks_policy: false`). - A required check's name is its job's `name:`. Renaming a job changes the ruleset in the same change, and every open PR then merges main in before its checks report the new name. diff --git a/.claude/skills/release/SKILL.md b/.claude/skills/release/SKILL.md index a387f3135f..57c358e5d8 100644 --- a/.claude/skills/release/SKILL.md +++ b/.claude/skills/release/SKILL.md @@ -17,7 +17,7 @@ description: > - Never push a tag, never create or delete a `release/*` branch, never push to `main` or `release/*`. The maintainer runs every block you hand over, in their own terminal, and tells you when it landed. - A tag never moves. A fix after a tag is the next number. -- Release PRs and backport PRs go through the five required checks like any other PR. +- Release PRs and backport PRs go through the required checks like any other PR. ## 2. Read the state diff --git a/AGENTS.md b/AGENTS.md index 72ceb678b1..03f4a822c5 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -119,7 +119,7 @@ scripts/generate-project.sh [both|macos|ios] # needs the libs; rerun after edit ## CI -- A PR into `main` or `release/*` merges on five green checks: macOS Tests, iOS and Package Tests, SwiftLint, Repo Hygiene and PR title. Nothing bypasses them. +- A PR into `main` or `release/*` merges on green macOS Tests, iOS and Package Tests, SwiftLint, Repo Hygiene, PR title and Linux. Nothing bypasses them. - Read why a CI check failed before any re-run. - Workflows: `.claude/rules/ci.md`. Red checks: `.claude/skills/fix-issue/references/verification-apple.md`, Reading CI. diff --git a/RELEASING.md b/RELEASING.md index 5c75b09107..64a7554aad 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -116,7 +116,7 @@ gh workflow run withdraw.yml --ref v -f version=X.Y.Z | `release` | tags `v*` | `SPARKLE_PRIVATE_KEY`, `TELEGRAM_BOT_TOKEN`, `TELEGRAM_CHAT_ID` | | `github-pages` | tags `v*` | none | -- No repo-level secret or deploy key is left, and no environment has required reviewers: admin-only, immutable tags are the gate. Rulesets: `.claude/rules/ci.md`, Rulesets. +- No repo-level secret or deploy key is left, and no environment above has required reviewers: admin-only, immutable tags are the gate. `linux-release` also deploys from `main`, so it takes a reviewer (`linux/docs/releasing.md`). Rulesets: `.claude/rules/ci.md`, Rulesets. - Notarization uses the App Store Connect API key, which `.github/actions/apple-signing` stores as the `TablePro` notarytool profile. The action warns when the certificate expires within 60 days. - An offline backup of the Sparkle EdDSA key exists and the maintainer holds it. The key never rotates without a signed transition, since every app from 0.82 verifies the feed with it. - `gh-pages` takes pushes from `github-actions[bot]` with `GITHUB_TOKEN` and has no required checks. `feed.py add` and `withdraw` refuse an `appcast.xml` whose signature does not verify, so a hand edit is re-signed with `sign_update` before it is pushed. diff --git a/linux/ROADMAP.md b/linux/ROADMAP.md index 74e18b8527..c0739906e2 100644 --- a/linux/ROADMAP.md +++ b/linux/ROADMAP.md @@ -146,7 +146,7 @@ Not built yet, in no order. ### Release and project -- Before the first tag, the release setup [ADR 0018](docs/decisions/0018-ppa-copr-and-flathub-later.md#consequences) lists: the PPA, the COPR project, and the `linux-release` environment with what `release-linux.yml` names in its header. +- Before the first tag, the release setup [ADR 0018](docs/decisions/0018-ppa-copr-and-flathub-later.md#consequences) lists: the PPA, the COPR project, and the secrets and variable `release-linux.yml` names in its header. - Write the Flathub manifest and the exception request by hand, and submit them. - An AUR PKGBUILD, kept by the community. - The first translations in `po/LINGUAS`. diff --git a/linux/docs/releasing.md b/linux/docs/releasing.md index fe1bfbdf0c..a31a0ea750 100644 --- a/linux/docs/releasing.md +++ b/linux/docs/releasing.md @@ -6,13 +6,12 @@ A repository admin does these once. The workflow's header names the same secrets and variables. -1. **Environment** `linux-release`: a required reviewer, and deployments from `linux-v*` tags and the `main` branch only. The branch is for a [packaging fix](#a-packaging-fix). Two secrets in it: +1. **Secrets** in the `linux-release` environment, which takes a required reviewer and deploys from `linux-v*` tags and the `main` branch only. The branch is for a [packaging fix](#a-packaging-fix). - `LINUX_PPA_SIGNING_KEY`: the ASCII-armored OpenPGP secret key, with no passphrase, that signs the uploads. - `LINUX_COPR_WEBHOOK`: the custom webhook URL from the COPR project's Integrations page, ending in `/tablepro/`. 2. **Variables**: `LINUX_PPA`, the PPA as `owner/name`. `LINUX_BRANCH` stays unset unless a release comes from a [maintenance branch](#a-fix-release). -3. **Tag ruleset**: add `refs/tags/linux-v*` to the ruleset that lets only admins create release tags. Today it covers `refs/tags/v*` alone, so anyone with write access could start a release. -4. **Launchpad**: a team that owns the PPA, and the PPA with a dependency on `~rust-toolchain/staging`, amd64 and arm64 turned on under its processors, and debug symbol publishing on (Launchpad's admins turn it on when the PPA's settings do not offer it). Register the signing key's public half on an account in the team. Launchpad mails a failed build to the owner of the key that signed the upload, so that account's mail has to reach someone. -5. **COPR**: a project with the Fedora 44 x86_64 and aarch64 chroots, following Fedora branching, with AppStream metadata generation on, and a package named `tablepro` with the custom source method from `build-aux/rpm/copr-sources.sh` (the command is in its header). Turn on build failure emails for the project's admins. +3. **Launchpad**: a team that owns the PPA, and the PPA with a dependency on `~rust-toolchain/staging`, amd64 and arm64 turned on under its processors, and debug symbol publishing on (Launchpad's admins turn it on when the PPA's settings do not offer it). Register the signing key's public half on an account in the team. Launchpad mails a failed build to the owner of the key that signed the upload, so that account's mail has to reach someone. +4. **COPR**: a project with the Fedora 44 x86_64 and aarch64 chroots, following Fedora branching, with AppStream metadata generation on, and a package named `tablepro` with the custom source method from `build-aux/rpm/copr-sources.sh` (the command is in its header). Turn on build failure emails for the project's admins. [README.md](../README.md#install) gives users `ppa:tablepro/tablepro` and `@tablepro/tablepro`; change it if the PPA or the COPR project gets another name.