Skip to content

CI audit: concurrency, coverage gating, release cache + cron scoping - #177

Merged
jmagar merged 1 commit into
mainfrom
ci/audit-fixes-20260805
Aug 5, 2026
Merged

CI audit: concurrency, coverage gating, release cache + cron scoping#177
jmagar merged 1 commit into
mainfrom
ci/audit-fixes-20260805

Conversation

@jmagar

@jmagar jmagar commented Aug 5, 2026

Copy link
Copy Markdown
Collaborator

Fleet CI audit follow-up for cortex. Measured motivation: cortex CI averaged 116 min wall-clock over the last 100 runs, with jobs queueing up to 97 min behind a 4-runner ci-pool-rust pool while running for under 2 min.

Changes

  • ci.yml had no concurrency: block at all — every follow-up push left the prior run's jobs occupying the contended Rust pool. Adopts the idiom already used by repository-contract.yml.
  • coverage off PRs. It performed a full instrumented rebuild plus a second full run of the suite test had just run, emitting --summary-only output that is not uploaded, thresholded, or commented. Now push/schedule/dispatch only.
  • docs-contract no longer duplicates test. When rust == true, nextest already executes docs_tests::.
  • check-public-identity.sh ran twice per PR (version-sync + docs-contract). It now runs once in a new toolchain-free identity job whose gate is the exact union of the paths the script scans — deliberately not folded into version-sync, whose gate would have missed docs-only and config-only PRs.
  • Weekly cron scoped. classify() returned every lane true for schedule, so the cron documented as a cargo-deny advisory check rebuilt all of CI.
  • Hosted release build was uncached. setup-rust-kache targeted a LAN-only endpoint unreachable from GitHub-hosted runners, silently degrading to LOCAL-ONLY on an ephemeral VM — a cold --release build every tag. Now uses the public kache S3 endpoint via the existing org secrets/vars.
  • Dropped the Tauri/GTK/WebKit apt stack from the composite action. Cortex links none of it; the justification comment referenced a different repository.
  • Pinned 4 floating action tags; added timeout-minutes everywhere (default 360m).

Known pre-existing gap (not introduced here)

check-public-identity.sh scans plugins/*, but no classifier output covers plugins/syslog/**, so a PR touching only that path skips the check. The new identity gate is coverage-identical to the previous docs-contract gate, so this is unchanged by this PR — worth a separate fix.

- ci.yml: add concurrency with cancel-in-progress on PRs (was absent, so
  superseded pushes ran to completion on the contended ci-pool-rust pool)
- coverage: restrict to push/schedule/dispatch. On PRs it re-ran the entire
  suite under instrumentation to produce a --summary-only report nothing reads
- docs-contract: skip when rust==true (Tests already runs docs_tests:: via
  nextest); it now covers only the docs/release/skills/docker/workflow lanes
- new toolchain-free `identity` job runs check-public-identity.sh once, gated
  on the union of paths that script scans (previously it ran twice, and moving
  it under version-sync alone would have missed docs-only and config-only PRs)
- changed_paths: the weekly cron enabled every lane, so a RUSTSEC advisory
  check rebuilt all of CI. schedule now enables only the security lane;
  workflow_dispatch keeps full fan-out
- release.yml: add concurrency; route the hosted Linux build at the public
  kache S3 endpoint (the composite pointed at a LAN-only address, so every
  release built cold); drop the dead CARGO_BUILD_RUSTC_WRAPPER override
- setup-rust-kache: stop apt-installing the Tauri/GTK/WebKit stack; cortex
  links none of it, and hosted runners paid a full WebKitGTK install per release
- pin cargo-deny-action, upload/download-artifact and action-gh-release to SHAs
- add timeout-minutes to every ci.yml job (default was 360m on a shared pool)
@jmagar
jmagar enabled auto-merge (squash) August 5, 2026 15:31
@jmagar
jmagar merged commit 7c35d1f into main Aug 5, 2026
15 of 16 checks passed
@jmagar
jmagar deleted the ci/audit-fixes-20260805 branch August 5, 2026 15:35
jmagar added a commit that referenced this pull request Aug 7, 2026
This repository is public. Three internal identifiers were committed under
.github/:

  * action.yml:34  default: "https://s3.tootie.tv"      (PR #177)
  * action.yml:228 endpoint = "http://10.1.0.2:9000"    (PR #159)
  * action.yml:233 "... via Tootie MinIO"               (PR #159)
  * actionlint.yaml self-hosted-runner labels tootie/dookie

The s3-endpoint default was never reachable. The endpoint is only consumed
inside the `KACHE_S3_ACCESS_KEY && KACHE_S3_SECRET_KEY` branch, and the only
caller that supplies those keys (release.yml) also passes
`s3-endpoint: ${{ vars.KACHE_S3_ENDPOINT }}`. The org variable holds the real
value, so nothing changes.

The hardcoded 10.1.0.2 block is dead: it needs a runner with no existing
~/.config/kache/config.toml AND a ~/.aws/credentials [kache] profile. Every
self-hosted job logs "existing kache config present - leaving it alone", so
the branch never runs. Scrubbed to the RFC 5737 documentation address and the
placeholder name already used on soma main.

actionlint's tootie/dookie labels are stale: no workflow uses them; every
self-hosted job routes through a ci-pool-* label.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant