Repository navigation
GenuineCI v2.4.0 — November 8, 2026
This release adds changed-path workflow selection, opt-in cancellation of older PR runs, per-workflow Flutter versions, and ordered merging of stacked PRs. It focuses on the November 2–8 updates and includes changes since v2.3.0, published on October 23.
Highlights
Run the workflows a change needs
- Add
pathstoCITrigger.push()andCITrigger.pullRequest()to select workflows by repository-relative glob patterns. PRs use their full diff; pushes use before/after revisions. Excluded workflows report completed/skipped GitHub Checks without allocating a build job or VM. - Run applicable workflows when a complete changed-file list is unavailable. Include shared dependencies and workflow definitions in path rules.
- Publish queued GitHub Checks before execution starts. Prefer the oldest queued jobs when capacity becomes available, wake dispatch after capacity release, and coalesce retries while capacity is full.
Workflow SDK — openci_workflow 0.2.3
- Enable
OpenCI.init(cancelPreviousRuns: true)to cancel older opted-in queued/running jobs for the same PR and workflow when a new commit's job is scheduled. The default is false; push jobs, same-SHA reruns, completed jobs, and path-skipped workflows retain their existing behavior. - Select an exact Flutter release through
OpenCI.init(flutterVersion: '3.47.8'). CI uses FVM before resolving dependencies; omitting the option uses the image default. Local execution keeps its current SDK. - Add
OpenCI.dart.checkFormat()to check Dart formatting without rewriting files. - Expose team-wide build sequence numbers with
OpenCI.runNumberand generated typedSecretreferences through.keyand.value. - The SDK is published as openci_workflow 0.2.3.
Stacked PRs
- Add Merge stack to merge ancestors through a selected PR, each into the default branch, in dependency order. Wait for updated CI, required reviews, and GitHub merge conditions after each restack. Cancel merge stops the remaining work.
- Recover parent/child relationships after GitHub's automatic base changes. Serialize updates within a stack while allowing independent stacks to run concurrently.
- Identify tracked stacks disconnected from the default branch and stop stack merging until their unresolved base is repaired.
- Reduce repeated work from self-generated notifications and combine contended retries and independent GitHub reads.
Execution, platform, and maintenance
- Move teams, GitHub connections, logs, secrets, billing, planning, and dispatch to Firebase Functions and SQL Connect, with Orchard build execution in Cloud Run Jobs. Remove the legacy servers, planner, worker, and associated storage.
- Support independent Firebase projects for self-hosted deployments. Manage Orchard infrastructure, Mac workers, and macOS images with Terraform, Ansible, and Packer.
- Default build VMs to 4 vCPUs, support per-worker VM memory allocations, and batch executor log ingestion.
- Require verified email before adding team members and reject external-fork PR execution.
- Add localized website routes, generated social images, and Starlight documentation. Introduce the initial Go
go-genuineCLI scaffold; it is not a replacement for the existing Dart CLI.
Upgrade notes and limitations
- SDK 0.2.0 breaking change: replace
whenChanged:withpaths:and.whenChangedwith.paths. See the SDK changelog. - After regenerating older string-based secret getters, use
.valuewhere a secret value is required..keyreturns the original environment variable name. - Direct SDK log forwarding through
LOKI_URLhas been removed. Commands still stream stdout/stderr; the executor captures and persists CI logs. - Existing legacy server/worker and Compose deployments require the FSC deployment changes; updating an old container image alone is insufficient. Review the deployment instructions and self-hosting guide.
- Deploy the connector and planner support before enabling PR auto cancellation.
flutterVersionrequires a literal release and is not inferred from.fvmrc. - PR closure: planner-side cancellation on close/merge is included, but this tag's webhook receiver does not yet subscribe to
pull_request.closed. The receiver follow-up #3810 is outside this release; do not rely on close-event cancellation with the unmodified tagged receiver. - The separate PR-build deduplication follow-up #3809 is outside this release.
Release verification
- Release code:
709fa2acondevelop. - On this commit, Stacked PR CI passed. The other six configured Checks completed as skipped under changed-path selection; they were not rerun for the release tag.
- The English and Japanese release articles passed website formatting, Astro checks, a production build, and all 83 existing site tests. Both localized social images were reviewed.
- No backend/fleet deployment or full end-to-end acceptance run is performed as part of this publication.
Pull request changelog — 94 GitHub-generated entries
What's Changed
- docs(website): add v2.3.0 release article and OGP banner by @mafreud in #3590
- feat(website): add Cloud pricing section by @mafreud in #3591
- chore: release openci_shared 2.0.0 and genuineci_cli 0.6.0 by @mafreud in #3589
- feat(website): add English and Japanese locale routes by @mafreud in #3593
- Migrate GenuineCI website from Jaspr to Astro by @mafreud in #3594
- Generate localized blog OGP images with astro-og-canvas by @mafreud in #3596
- feat(secrets): generate typed Secret references by @mafreud in #3602
- feat(openci_server): add scoped workflow tokens (G-1531) by @mafreud in #3605
- revert(openci_server): defer workflow authentication by @mafreud in #3606
- feat(openci_server): add run number storage (G-1533) by @mafreud in #3613
- feat(openci_server): allocate team run numbers atomically (G-1534) by @mafreud in #3614
- feat(openci_server): assign and return run numbers when creating runs (G-1535) by @mafreud in #3615
- feat(build_job_worker): pass assigned run numbers to workflows (G-1536) by @mafreud in #3616
- feat(openci_workflow): expose openCI.runNumber (G-1537) by @mafreud in #3617
- chore(openci_workflow): release run numbers in 0.1.6 (G-1538) by @mafreud in #3621
- feat(website): migrate docs to Starlight by @mafreud in #3622
- feat(cli): bootstrap Go-based go-genuine CLI (G-1540) by @mafreud in #3624
- feat(cli): resolve personal settings paths with XDG (G-1542) by @mafreud in #3632
- feat(planner): match whenChanged paths (G-1257) by @mafreud in #3649
- feat(shared): add webhook planning result models (G-1549) by @mafreud in #3650
- refactor(planner): use structured webhook plans (G-1550) by @mafreud in #3651
- chore(dataconnect): add SQL Connect configuration (G-1564) by @mafreud in #3660
- feat(dataconnect): add member-scoped team query (G-1565) by @mafreud in #3662
- feat(dataconnect): add Secret Manager reference schema (G-1566) by @mafreud in #3665
- feat(dataconnect): add billing account schema (G-1570) by @mafreud in #3672
- feat(dataconnect): validate billing period creation (G-1571) by @mafreud in #3674
- feat(dataconnect): complete remaining schema definitions (G-1572) by @mafreud in #3676
- feat(dataconnect): add billing customer operations (G-1573) by @mafreud in #3678
- feat(dataconnect): add Checkout lifecycle and Stripe state operations (G-1574) by @mafreud in #3680
- feat(dataconnect): add CI admissions and execution measurement (G-1575) by @mafreud in #3682
- feat(dataconnect): add team create and rename mutations (G-1581) by @mafreud in #3690
- refactor(dataconnect): remove legacy team installation IDs (G-1582) by @mafreud in #3692
- feat(dashboard): generate SQL Connect team Flutter SDK (G-1583) by @mafreud in #3694
- feat(dashboard): load team lists through SQL Connect by @mafreud in #3696
- feat(dataconnect): add build log and step schema (G-1585) by @mafreud in #3701
- feat(dataconnect): add build log queries and mutations (G-1586) by @mafreud in #3702
- fix(dataconnect): append build logs one entry at a time (G-1586) by @mafreud in #3703
- feat(dataconnect): generate Flutter and Admin log SDKs (G-1587) by @mafreud in #3705
- feat(dashboard): create signup teams through SQL Connect (G-1591) by @mafreud in #3711
- feat(dashboard): rename teams through SQL Connect (G-1589) by @mafreud in #3712
- feat(dataconnect): add team member operations (G-1593) by @mafreud in #3715
- feat(dataconnect): generate team member SDKs (G-1594) by @mafreud in #3717
- feat(dataconnect): add team build list query (G-1596) by @mafreud in #3721
- feat(dataconnect): generate build history SDKs (G-1597) by @mafreud in #3722
- feat(dashboard): add builds connector provider (G-1598) by @mafreud in #3724
- feat(dataconnect): add secret operations and SDKs (G-1599) by @mafreud in #3727
- feat(dataconnect): add GitHub connection operations and SDKs (G-1600) by @mafreud in #3729
- feat(dataconnect): add billing operations and SDKs (G-1577) by @mafreud in #3731
- feat(functions): receive GitHub webhooks into FSC (G-1602) by @mafreud in #3737
- feat(functions): create build jobs from webhook tasks (G-1603) by @mafreud in #3738
- feat(functions): dispatch queued builds to Cloud Run (G-1604) by @mafreud in #3740
- feat(executor): run builds with Orchard on Cloud Run (G-1605) by @mafreud in #3741
- refactor: remove legacy planner and build worker (G-1578, G-1579) by @mafreud in #3742
- feat: migrate logs and secrets to FSC (G-1606) by @mafreud in #3745
- feat: migrate GitHub connect to FSC (G-1608) by @mafreud in #3748
- feat: migrate team management to FSC (G-1609) by @mafreud in #3749
- feat: migrate billing to Functions and FSC (G-1577) by @mafreud in #3751
- refactor: retire legacy invitation and device storage (G-1569) by @mafreud in #3752
- infra: finalize FSC production cutover (G-1611) by @mafreud in #3756
- refactor: retire legacy servers and infrastructure (G-1607) by @mafreud in #3757
- refactor: remove unused FSC storage and migration tooling (G-1613) by @mafreud in #3760
- fix: require verified email before adding team members by @mafreud in #3762
- fix: block fork PRs from accessing team secrets in FSC by @mafreud in #3761
- infra: manage Orchard infrastructure with Terraform (G-1614) by @mafreud in #3764
- feat(infra): manage Mac workers with Ansible by @mafreud in #3765
- feat(infra): build macOS images with Packer by @mafreud in #3766
- fix: reschedule expected build dispatch deferrals by @mafreud in #3768
- feat: support independent self-hosted FSC deployments by @mafreud in #3769
- chore: import stacked PR app into apps by @mafreud in #3770
- feat: run stacked PR app on Firebase Functions without a database by @mafreud in #3771
- fix: recover stacked PRs after automatic base changes by @mafreud in #3772
- feat(stacked-pr): migrate to Node.js Task Queue Functions (G-1616) by @mafreud in #3774
- feat(stacked-pr): process independent stacks concurrently by @mafreud in #3776
- fix: show queued CI builds in GitHub Checks by @mafreud in #3778
- fix(ci): accept concurrent webhook deliveries by @mafreud in #3775
- feat(ci): filter workflows by changed paths by @mafreud in #3780
- feat(ci): add oldest queued build selection queries by @mafreud in #3783
- chore(workflow): publish 0.2.0 with paths triggers by @mafreud in #3784
- fix(ci): dispatch oldest queued builds before newer notifications by @mafreud in #3785
- feat(ci): wake build dispatch when execution capacity is released by @mafreud in #3786
- perf(ci): coalesce dispatch retries while capacity is full by @mafreud in #3792
- feat(ci): select workflow Flutter versions with FVM by @mafreud in #3794
- perf(ci): batch executor logs through a writable stream by @mafreud in #3787
- feat(workflow): add dart.checkFormat() by @mafreud in #3795
- feat(ci): auto-cancel superseded pull request runs by @mafreud in #3797
- ci: cancel superseded pull request runs by @mafreud in #3798
- fix(stacked-pr): prevent self-update and lock retry backlogs by @mafreud in #3800
- perf(stacked-pr): overlap GitHub reads and report updates by @mafreud in #3801
- feat(executor): support per-worker VM memory partitions by @mafreud in #3799
- ci: add repository-wide Dart format check by @mafreud in #3796
- feat(stacked-pr): merge ancestors through the selected pull request by @mafreud in #3802
- fix(ci): default Orchard build VMs to 4 vCPUs (G-1623) by @mafreud in #3803
- fix(ci): cancel queued and running builds when PRs close (G-1624) by @mafreud in #3808
- fix(stacked-pr): flag stacks disconnected from the default branch by @mafreud in #3812
Full Changelog: v2.3.0...v2.4.0