tree: e1f103c19de7ef86be002f33830185a66b9c7028
  1. ci.yml
  2. codeql.yml
  3. docs.yaml
  4. iceberg_spark_test_reusable.yml
  5. label_new_issues.yml
  6. miri.yml
  7. pr_benchmark_check.yml
  8. pr_build_linux.yml
  9. pr_build_macos.yml
  10. pr_title_check.yml
  11. pyarrow_udf_test.yml
  12. README.md
  13. spark_sql_test_reusable.yml
  14. spark_sql_writer_tests.yml
  15. stale.yml
  16. take.yml
.github/workflows/README.md

GitHub Workflows

GitHub Actions only loads *.yml / *.yaml files in this directory as workflows. This README is ignored by the runner.

Pipeline overview

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

What runs when

Job in ci.ymlTriggered byPath filter source
preflightevery PR / push to main / dispatchnone (always runs)
changesevery PR / push to main / dispatchruns dev/ci/compute-changes.py
pr_build_linuxPR or push, paths matcheddev/ci/compute-changes.py
pr_build_macosPR or push, paths matcheddev/ci/compute-changes.py
pr_benchmark_checkPR or push, paths matchedbenchmark sources only
docspush to main, paths matched.asf.yaml, docs/**, docs.yaml
spark_3_5PR or push, paths matchedSpark 3.5 sources
spark_4_0PR or push, paths matchedSpark 4.0 sources
spark_3_4push, or PR with run-spark-3.4-tests labelSpark 3.4 sources
spark_4_1push, or PR with run-spark-4.1-tests labelSpark 4.1 sources
iceberg_1_10PR or push, paths matchedIceberg sources
iceberg_1_8push onlyIceberg sources
iceberg_1_9push onlyIceberg 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.

Standalone workflows (not under the umbrella)

These workflows have their own triggers because they fire on events the umbrella doesn't watch, or operate independently of the rest of CI:

FileWhy standalone
pr_title_check.ymlFires on pull_request.types: [edited] so it re-runs when a PR title is edited without a code push.
codeql.ymlSecurity scanner; weekly schedule + on every push/PR.
miri.ymlNightly Miri safety checks.
stale.ymlDaily stale-PR closer.
take.ymlIssue-comment trigger for take / untake.
label_new_issues.ymlIssue trigger to apply requires-triage.

Reusable workflows (called by ci.yml)

FileCalled from ci.yml job(s)
pr_build_linux.ymlpr_build_linux
pr_build_macos.ymlpr_build_macos
pr_benchmark_check.ymlpr_benchmark_check
docs.yamldocs
spark_sql_test_reusable.ymlspark_3_4, spark_3_5, spark_4_0, spark_4_1
iceberg_spark_test_reusable.ymliceberg_1_8, iceberg_1_9, iceberg_1_10

Modifying path filters

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.

Branch protection

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.