Skip to content

ci(integration): decide in selector jobs which suites run - #1425

Draft
auxesis wants to merge 3 commits into
ci/test-eql-selector-jobfrom
ci/integration-selector-jobs
Draft

auxesis wants to merge 3 commits into
ci/test-eql-selector-jobfrom
ci/integration-selector-jobs

Conversation

@auxesis

@auxesis auxesis commented Oct 28, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Six workflows run live suites against CipherStash: the four integration suites and the two Prisma E2E suites. Each used a workflow-level path filter, so it did not start at all on most pull requests. A workflow skipped that way leaves its required checks pending, and GitHub's documentation on required status checks says that blocks a merge.

After this change, each workflow starts on every pull request. A selector job decides whether the suite runs, and a summary job reports the result. Each suite runs for the same changes as before. A pull request from a fork still skips the suite, because a fork run gets no credentials.

This pull request is stacked on #1417. Merge that one first.

Changes

  • Workflows: integration-drizzle.yml, integration-prisma-next.yml, integration-protect-ffi.yml, integration-supabase.yml, prisma-example-readme-e2e.yml, and prisma-next-e2e.yml.
  • Selector job: first in each workflow, on ubuntu-latest. Its filter is the list the pull_request filter had. It fails when the filter gives no answer on a pull request.
  • Suite job: needs: [selector]. Its if: keeps the fork guard and adds the selector's answer. Both are written as exclusions of pull_request.
  • Summary job: last in each workflow. It passes when each needed job passed or was skipped.
  • Push lists: unchanged, with their comments. The parity test compares each one with its selector filter.
  • Shared test code: the first two commits are the same as in ci(crates): decide in selector jobs which crate checks run #1421. The second makes the guards for suite imports, binding build inputs, and auth sources read the selector filter.
  • protect-ffi test: src/integrationSuiteCi.test.ts cuts a selector's filters: block before it searches a workflow for a step. Otherwise a trigger path such as .github/actions/require-cs-secrets/** would satisfy its check for that step.
  • New test: integration-selectors.test.mjs pins what each selector decides, and that a fork pull request still skips.

Verification

  • pnpm run test:scripts: 83 files, 1,541 tests passed, 3 skipped.
  • In languages/typescript/packages/protect-ffi: vitest run src/lintWiring.test.ts src/integrationSuiteCi.test.ts passed 23 tests. tsc -p tsconfig.test.json, biome lint, and biome format passed on the changed file.
  • actionlint 1.7.12 with shellcheck 0.11.0 on the six workflows: two findings in prisma-next-e2e.yml (SC2129 and SC2034), at steps this pull request does not change. The base branch has the same two.
  • Not yet verified: a run on GitHub. This pull request changes each workflow, so each suite runs here, with credentials.

Related

Review notes

  • Look first at the new if: on one suite job. A fork pull request must still skip the suite.
  • I did not narrow any of these lists. Existing guards already derive them from the suites' imports and the binding build.
  • In workflow-paths-filter-parity.test.mjs, these pull requests edit neighbouring lines. The second to merge needs a rebase.
  • Merge queue runs select every job. Comparing a queue commit with the entry ahead of it is a separate change.

Test EQL has a selector job, and the other pull request workflows are
getting one each. Each workflow's selector must follow the same rules:
no path filter on pull_request, one dorny/paths-filter step, an output
named after each filter, every job selected on other events, a failure
when a filter gives no answer, `if:` conditions that exclude
pull_request, and a summary job that needs every other job.

workflow-selectors.test.mjs checks those rules for every workflow that
has a selector job, found by scanning. It runs the selector's own
decision script and the summary job's own check.

lib/selector.mjs holds the shared code. It reads a selector job, runs
its script, and works out which jobs a pull request runs from the files
it changes. It reads dorny's `every` quantifier and brace patterns,
which a filter needs to exclude documentation.

The parity test now compares a selector workflow's push paths with the
union of its selector filters, by what each selects from the tracked
files. That replaces Test EQL's written exemption. The dispatch test
holds every selector output open, whatever its name.
Three guards check that a workflow's path filter covers what its jobs
read: the binding build inputs, the auth binding sources, and the
sources the integration suites import. They read `on.push.paths` and
`on.pull_request.paths`. Once a workflow has a selector job, its pull
request list moves into the selector filter of each job, and those
guards would stop checking it.

They now read, per job, the lists that decide whether that job runs:
the workflow's push and pull_request lists, and the selector filter the
job reads. For a workflow without a selector job this is the same two
lists as before. They also check only the jobs that build or load the
binding, not every job in the workflow.
@changeset-bot

changeset-bot Bot commented Oct 28, 2026 •

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 88820e0

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@coderabbitai

coderabbitai Bot commented Oct 28, 2026

Copy link
Copy Markdown
Contributor

Important

Draft PR not reviewed

Draft PRs are not automatically reviewed by default.

  • Trigger a manual review

To automatically review draft PRs, update your CodeRabbit configuration:

reviews:
  auto_review:
    drafts: true
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Comment @coderabbitai help to get the list of available commands.

The four integration workflows and the two Prisma E2E workflows used a
workflow-level path filter on pull_request. A workflow that a path
filter skips leaves its required checks pending, and GitHub's
documentation on required status checks says that blocks a merge.

Each workflow now runs on every pull request. A `selector` job on a
GitHub-hosted runner decides whether the suite runs, and fails when the
filter gives no answer. A summary job ends each workflow, and passes
when every needed job passed or was skipped.

Each filter is the list the pull_request filter had. Those lists are
already checked entry by entry against what the suites import and what
the binding build hashes, and those guards now read the selector filter.
The push lists stay, with their comments, and the parity test compares
each one with its selector filter.

The suite job's `if:` keeps the fork guard and adds the selector's
answer, both written as exclusions of pull_request. A fork pull request
still skips, whatever the selector says.

integrationSuiteCi.test.ts in protect-ffi cuts the `on:` block so that a
`paths:` entry cannot satisfy a claim about a step. It now cuts a
`filters:` block too, for the same reason. integration-selectors.test.mjs
pins what each selector decides, and the fork guard.
@auxesis
auxesis force-pushed the ci/integration-selector-jobs branch from 499b346 to 88820e0 Compare October 28, 2026 12:59
@auxesis

auxesis commented Oct 28, 2026

Copy link
Copy Markdown
Contributor Author

Force-pushed: integration-selectors.test.mjs named a file under docs/plans/, which plan-docs-unread-by-tests.test.mjs forbids. It now uses docs/sdk-design-principles.md. My local run missed this because the new file was not yet tracked. pnpm run test:scripts passes with it staged: 83 files, 1,541 tests.

This branch has not been deployed

No deployments
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