GitHub Actions only loads *.yml / *.yaml files in this directory as workflows. This README is ignored by the runner.
A single umbrella workflow (ci.yml) orchestrates everything that runs on pull requests and pushes to main. The umbrella runs cheap preflight checks first, computes which heavy jobs are relevant to the change, and only then fans out to the long-running test/build workflows. Each long workflow is a workflow_call reusable invoked from the umbrella.
pull_request | push to main | workflow_dispatch
|
v
+-----------------------+
| preflight | ubuntu-slim
| (RAT, prettier, |
| missing-suites, |
| actionlint) |
+-----------+-----------+
| on success
v
+-----------------------+
| changes | ubuntu-slim
| (compute-changes.py: |
| one boolean per |
| heavy job) |
+-----------+-----------+
|
+-----------+-----------+-----------+-----------+-----------+-----------+
| | | | | | |
v v v v v v v
pr_build_ pr_build_ pr_benchmark_ docs spark_3_5 spark_4_0 iceberg_1_10
linux macos check (push) (PR+push) (PR+push) (PR+push)
(PR+push) (PR+push) (PR+push)
| | |
v v v
spark_3_4 / spark_4_1 iceberg_1_8 / 1_9
(push or PR + label) (push only)
reusable workflows invoked via `uses:`:
pr_build_linux.yml spark_sql_test_reusable.yml
pr_build_macos.yml iceberg_spark_test_reusable.yml
pr_benchmark_check.yml
docs.yaml
Job in ci.yml | Triggered by | Path filter source |
|---|---|---|
preflight | every PR / push to main / dispatch | none (always runs) |
changes | every PR / push to main / dispatch | runs dev/ci/compute-changes.py |
pr_build_linux | PR or push, paths matched | dev/ci/compute-changes.py |
pr_build_macos | PR or push, paths matched | dev/ci/compute-changes.py |
pr_benchmark_check | PR or push, paths matched | benchmark sources only |
docs | push to main, paths matched | .asf.yaml, docs/**, docs.yaml |
spark_3_5 | PR or push, paths matched | Spark 3.5 sources |
spark_4_0 | PR or push, paths matched | Spark 4.0 sources |
spark_3_4 | push, or PR with run-spark-3.4-tests label | Spark 3.4 sources |
spark_4_1 | push, or PR with run-spark-4.1-tests label | Spark 4.1 sources |
iceberg_1_10 | PR or push, paths matched | Iceberg sources |
iceberg_1_8 | push only | Iceberg sources |
iceberg_1_9 | push only | Iceberg sources |
A heavy job appears in the PR‘s checks list as a skipped entry whenever its path filter or event criteria don’t match. Skipped checks count as passing for branch protection.
These workflows have their own triggers because they fire on events the umbrella doesn't watch, or operate independently of the rest of CI:
| File | Why standalone |
|---|---|
pr_title_check.yml | Fires on pull_request.types: [edited] so it re-runs when a PR title is edited without a code push. |
codeql.yml | Security scanner; weekly schedule + on every push/PR. |
miri.yml | Nightly Miri safety checks. |
stale.yml | Daily stale-PR closer. |
take.yml | Issue-comment trigger for take / untake. |
label_new_issues.yml | Issue trigger to apply requires-triage. |
ci.yml)| File | Called from ci.yml job(s) |
|---|---|
pr_build_linux.yml | pr_build_linux |
pr_build_macos.yml | pr_build_macos |
pr_benchmark_check.yml | pr_benchmark_check |
docs.yaml | docs |
spark_sql_test_reusable.yml | spark_3_4, spark_3_5, spark_4_0, spark_4_1 |
iceberg_spark_test_reusable.yml | iceberg_1_8, iceberg_1_9, iceberg_1_10 |
Each long workflow's “what files trigger me” rules live in the FILTERS dict at the top of dev/ci/compute-changes.py. The changes job in ci.yml invokes that script and the gate if: on each long job consumes needs.changes.outputs.<name>. When adding a new test suite or moving sources, update the relevant filter entry there.
Required-check names changed when these workflows were consolidated. The umbrella exposes per-job names like CI / pr_build_linux / Lint, CI / spark_3_5 / linux-test (...), etc. Update repository branch protection rules to point at the new names; the old standalone workflow names (Spark SQL Tests (Spark 3.5), PR Build (Linux), ...) no longer exist as top-level workflows.