[Experimental] Split ci-amd-arm.yml into ARM canary and AMD per-PR workflows#66348
Conversation
c3a7012 to
32c769e
Compare
… wrappers Replaces the combined ci-amd-arm.yml workflow with two thin wrappers carrying the full pipeline inline: - ci-arm.yml: schedule (canary cron) + workflow_dispatch only; runs on linux/arm64. - ci-amd.yml: pull_request + push (to v3-N-test etc) + workflow_dispatch; runs on linux/amd64. No schedule for now; ARM keeps the canary slot. Each wrapper carries the full pipeline jobs identically except for platform / runner-type / triggers, so per-job UI grouping is preserved on the GitHub Actions page. The runtime cross-mapping in selective_checks.runner_type is left in place because is_disabled_integration still consumes it; the API lookup against the now-removed ci-amd-arm.yml falls back to AMD harmlessly. References to the old file name are updated in: README.md, dev/update_github_branch_config.py, ci-notification.yml, e2e-flaky-tests-report.yml, scripts/ci/analyze_e2e_flaky_tests.py, dev/README_AIRFLOW3_DEV.md, dev/README_RELEASE_AIRFLOW.md, generated/PYPI_README.md, update-constraints-on-push*.yml, release_dockerhub_image.yml.
The two CI workflow files are physical copies of each other (GH Actions has no cross-file YAML include) — they should differ only in: - header intro comment - workflow name (ARM vs AMD) - triggers (schedule vs pull_request+push) - concurrency group prefix - build-info platform / runner-type outputs - print-platform job name + echo Drift outside this set is a bug. The new `scripts/ci/prek/check_ci_workflows_in_sync.py` normalizes both files against the documented divergences (regex line rules + arch-only block removals) and asserts the rest matches byte-for-byte. Wired up as a local prek hook gated on either workflow file changing. Local UX: when run interactively, the script also diffs each file against `upstream/main` (falls back to `origin/main`, then `main`) and attributes the drift — "only ci-arm.yml changed since baseline; mirror to ci-amd.yml" with the exact diff to copy, OR "add to LINE_RULES / ARM_ONLY_BLOCK in this script if intentional". Falls back to the non-attribution view in CI / non-TTY runs. Set `FORCE_INTERACTIVE=1` to opt in from a non-TTY shell.
32c769e to
cb7492c
Compare
jscheffl
left a comment
There was a problem hiding this comment.
I would be good with this. But also have no strong opinion. That that YAML can not include, would save a lot of redundant code.. but with tooling as you provided is acceptable burden.
Backport failed to create: v3-2-test. View the failure log Run detailsNote: As of Merging PRs targeted for Airflow 3.X In matter of doubt please ask in #release-management Slack channel.
You can attempt to backport this manually by running: cherry_picker 8f93637 v3-2-testThis should apply the commit to the v3-2-test branch and leave the commit in conflict state marking After you have resolved the conflicts, you can continue the backport process by running: cherry_picker --continueIf you don't have cherry-picker installed, see the installation guide. |
…rkflows (#66348) (#66664) * Split ci-amd-arm.yml into ci-arm.yml (canary) and ci-amd.yml (per-PR) wrappers Replaces the combined ci-amd-arm.yml workflow with two thin wrappers carrying the full pipeline inline: - ci-arm.yml: schedule (canary cron) + workflow_dispatch only; runs on linux/arm64. - ci-amd.yml: pull_request + push (to v3-N-test etc) + workflow_dispatch; runs on linux/amd64. No schedule for now; ARM keeps the canary slot. Each wrapper carries the full pipeline jobs identically except for platform / runner-type / triggers, so per-job UI grouping is preserved on the GitHub Actions page. The runtime cross-mapping in selective_checks.runner_type is left in place because is_disabled_integration still consumes it; the API lookup against the now-removed ci-amd-arm.yml falls back to AMD harmlessly. References to the old file name are updated in: README.md, dev/update_github_branch_config.py, ci-notification.yml, e2e-flaky-tests-report.yml, scripts/ci/analyze_e2e_flaky_tests.py, dev/README_AIRFLOW3_DEV.md, dev/README_RELEASE_AIRFLOW.md, generated/PYPI_README.md, update-constraints-on-push*.yml, release_dockerhub_image.yml. * Add prek hook that asserts ci-arm.yml and ci-amd.yml stay in sync The two CI workflow files are physical copies of each other (GH Actions has no cross-file YAML include) — they should differ only in: - header intro comment - workflow name (ARM vs AMD) - triggers (schedule vs pull_request+push) - concurrency group prefix - build-info platform / runner-type outputs - print-platform job name + echo Drift outside this set is a bug. The new `scripts/ci/prek/check_ci_workflows_in_sync.py` normalizes both files against the documented divergences (regex line rules + arch-only block removals) and asserts the rest matches byte-for-byte. Wired up as a local prek hook gated on either workflow file changing. Local UX: when run interactively, the script also diffs each file against `upstream/main` (falls back to `origin/main`, then `main`) and attributes the drift — "only ci-arm.yml changed since baseline; mirror to ci-amd.yml" with the exact diff to copy, OR "add to LINE_RULES / ARM_ONLY_BLOCK in this script if intentional". Falls back to the non-attribution view in CI / non-TTY runs. Set `FORCE_INTERACTIVE=1` to opt in from a non-TTY shell. (cherry picked from commit 8f93637)
…llision (#66662) PR #66348 split the combined ci-amd-arm.yml into per-platform wrappers and intentionally deferred re-adding a schedule trigger to ci-amd.yml ('No schedule for now; ARM keeps the canary slot. Add a schedule: block here if/when AMD should also act as a scheduled canary'). As a result: - The AMD 'Tests (AMD)' badge on the README pointed at a workflow that hadn't run on main since 2025-10-25 (it now only runs on PRs and release-branch pushes), so the badge was stale. - The notify-slack job at the bottom of ci-amd.yml is gated on github.event_name == 'schedule' and was therefore dead code: there was no schedule trigger left to fire it. - main on AMD had no scheduled CI monitor at all (ci-notification.yml only watches v3-2-test x ci-amd.yml, and the comment there assumes ARM is reported by its own notify-slack). This change: 1. Restores the previous AMD canary cron in ci-amd.yml at minute :58 of the same hours ARM uses, so the two scheduled runs don't compete for runners at exactly the same minute. 2. Splits the README build-status row for main into two badges (AMD and ARM), drops the obsolete 2.x row (still using the legacy ci.yml), and keeps 3.x AMD-only (ARM has no v3-2-test schedule). Click-throughs go to the workflow page rather than the catch-all /actions URL. 3. Disambiguates the slack-state artifact names that ci-amd.yml, ci-arm.yml, and ci-image-checks.yml share. Before this PR the latent collision did not bite (AMD's notify-slack never fired); restoring the AMD schedule activates it. Each platform now writes its own slack-state-{tests,inventory}-<branch>-{amd,arm} artifact so the de-dup tracker in scripts/ci/slack_notification_state.py keeps independent state per platform. 4. Updates scripts/ci/prek/check_ci_workflows_in_sync.py to allow the new AMD-only schedule block and the per-platform artifact-name suffix as documented divergences. generated/PYPI_README.md is regenerated automatically by the generate-pypi-readme prek hook to mirror README.md.
…llision (#66662) (#66665) PR #66348 split the combined ci-amd-arm.yml into per-platform wrappers and intentionally deferred re-adding a schedule trigger to ci-amd.yml ('No schedule for now; ARM keeps the canary slot. Add a schedule: block here if/when AMD should also act as a scheduled canary'). As a result: - The AMD 'Tests (AMD)' badge on the README pointed at a workflow that hadn't run on main since 2025-10-25 (it now only runs on PRs and release-branch pushes), so the badge was stale. - The notify-slack job at the bottom of ci-amd.yml is gated on github.event_name == 'schedule' and was therefore dead code: there was no schedule trigger left to fire it. - main on AMD had no scheduled CI monitor at all (ci-notification.yml only watches v3-2-test x ci-amd.yml, and the comment there assumes ARM is reported by its own notify-slack). This change: 1. Restores the previous AMD canary cron in ci-amd.yml at minute :58 of the same hours ARM uses, so the two scheduled runs don't compete for runners at exactly the same minute. 2. Splits the README build-status row for main into two badges (AMD and ARM), drops the obsolete 2.x row (still using the legacy ci.yml), and keeps 3.x AMD-only (ARM has no v3-2-test schedule). Click-throughs go to the workflow page rather than the catch-all /actions URL. 3. Disambiguates the slack-state artifact names that ci-amd.yml, ci-arm.yml, and ci-image-checks.yml share. Before this PR the latent collision did not bite (AMD's notify-slack never fired); restoring the AMD schedule activates it. Each platform now writes its own slack-state-{tests,inventory}-<branch>-{amd,arm} artifact so the de-dup tracker in scripts/ci/slack_notification_state.py keeps independent state per platform. 4. Updates scripts/ci/prek/check_ci_workflows_in_sync.py to allow the new AMD-only schedule block and the per-platform artifact-name suffix as documented divergences. generated/PYPI_README.md is regenerated automatically by the generate-pypi-readme prek hook to mirror README.md. (cherry picked from commit 022e35d)
…rkflows (apache#66348) * Split ci-amd-arm.yml into ci-arm.yml (canary) and ci-amd.yml (per-PR) wrappers Replaces the combined ci-amd-arm.yml workflow with two thin wrappers carrying the full pipeline inline: - ci-arm.yml: schedule (canary cron) + workflow_dispatch only; runs on linux/arm64. - ci-amd.yml: pull_request + push (to v3-N-test etc) + workflow_dispatch; runs on linux/amd64. No schedule for now; ARM keeps the canary slot. Each wrapper carries the full pipeline jobs identically except for platform / runner-type / triggers, so per-job UI grouping is preserved on the GitHub Actions page. The runtime cross-mapping in selective_checks.runner_type is left in place because is_disabled_integration still consumes it; the API lookup against the now-removed ci-amd-arm.yml falls back to AMD harmlessly. References to the old file name are updated in: README.md, dev/update_github_branch_config.py, ci-notification.yml, e2e-flaky-tests-report.yml, scripts/ci/analyze_e2e_flaky_tests.py, dev/README_AIRFLOW3_DEV.md, dev/README_RELEASE_AIRFLOW.md, generated/PYPI_README.md, update-constraints-on-push*.yml, release_dockerhub_image.yml. * Add prek hook that asserts ci-arm.yml and ci-amd.yml stay in sync The two CI workflow files are physical copies of each other (GH Actions has no cross-file YAML include) — they should differ only in: - header intro comment - workflow name (ARM vs AMD) - triggers (schedule vs pull_request+push) - concurrency group prefix - build-info platform / runner-type outputs - print-platform job name + echo Drift outside this set is a bug. The new `scripts/ci/prek/check_ci_workflows_in_sync.py` normalizes both files against the documented divergences (regex line rules + arch-only block removals) and asserts the rest matches byte-for-byte. Wired up as a local prek hook gated on either workflow file changing. Local UX: when run interactively, the script also diffs each file against `upstream/main` (falls back to `origin/main`, then `main`) and attributes the drift — "only ci-arm.yml changed since baseline; mirror to ci-amd.yml" with the exact diff to copy, OR "add to LINE_RULES / ARM_ONLY_BLOCK in this script if intentional". Falls back to the non-attribution view in CI / non-TTY runs. Set `FORCE_INTERACTIVE=1` to opt in from a non-TTY shell.
…rkflows (#66348) (#66664) * Split ci-amd-arm.yml into ci-arm.yml (canary) and ci-amd.yml (per-PR) wrappers Replaces the combined ci-amd-arm.yml workflow with two thin wrappers carrying the full pipeline inline: - ci-arm.yml: schedule (canary cron) + workflow_dispatch only; runs on linux/arm64. - ci-amd.yml: pull_request + push (to v3-N-test etc) + workflow_dispatch; runs on linux/amd64. No schedule for now; ARM keeps the canary slot. Each wrapper carries the full pipeline jobs identically except for platform / runner-type / triggers, so per-job UI grouping is preserved on the GitHub Actions page. The runtime cross-mapping in selective_checks.runner_type is left in place because is_disabled_integration still consumes it; the API lookup against the now-removed ci-amd-arm.yml falls back to AMD harmlessly. References to the old file name are updated in: README.md, dev/update_github_branch_config.py, ci-notification.yml, e2e-flaky-tests-report.yml, scripts/ci/analyze_e2e_flaky_tests.py, dev/README_AIRFLOW3_DEV.md, dev/README_RELEASE_AIRFLOW.md, generated/PYPI_README.md, update-constraints-on-push*.yml, release_dockerhub_image.yml. * Add prek hook that asserts ci-arm.yml and ci-amd.yml stay in sync The two CI workflow files are physical copies of each other (GH Actions has no cross-file YAML include) — they should differ only in: - header intro comment - workflow name (ARM vs AMD) - triggers (schedule vs pull_request+push) - concurrency group prefix - build-info platform / runner-type outputs - print-platform job name + echo Drift outside this set is a bug. The new `scripts/ci/prek/check_ci_workflows_in_sync.py` normalizes both files against the documented divergences (regex line rules + arch-only block removals) and asserts the rest matches byte-for-byte. Wired up as a local prek hook gated on either workflow file changing. Local UX: when run interactively, the script also diffs each file against `upstream/main` (falls back to `origin/main`, then `main`) and attributes the drift — "only ci-arm.yml changed since baseline; mirror to ci-amd.yml" with the exact diff to copy, OR "add to LINE_RULES / ARM_ONLY_BLOCK in this script if intentional". Falls back to the non-attribution view in CI / non-TTY runs. Set `FORCE_INTERACTIVE=1` to opt in from a non-TTY shell. (cherry picked from commit 8f93637)
…llision (#66662) (#66665) PR #66348 split the combined ci-amd-arm.yml into per-platform wrappers and intentionally deferred re-adding a schedule trigger to ci-amd.yml ('No schedule for now; ARM keeps the canary slot. Add a schedule: block here if/when AMD should also act as a scheduled canary'). As a result: - The AMD 'Tests (AMD)' badge on the README pointed at a workflow that hadn't run on main since 2025-10-25 (it now only runs on PRs and release-branch pushes), so the badge was stale. - The notify-slack job at the bottom of ci-amd.yml is gated on github.event_name == 'schedule' and was therefore dead code: there was no schedule trigger left to fire it. - main on AMD had no scheduled CI monitor at all (ci-notification.yml only watches v3-2-test x ci-amd.yml, and the comment there assumes ARM is reported by its own notify-slack). This change: 1. Restores the previous AMD canary cron in ci-amd.yml at minute :58 of the same hours ARM uses, so the two scheduled runs don't compete for runners at exactly the same minute. 2. Splits the README build-status row for main into two badges (AMD and ARM), drops the obsolete 2.x row (still using the legacy ci.yml), and keeps 3.x AMD-only (ARM has no v3-2-test schedule). Click-throughs go to the workflow page rather than the catch-all /actions URL. 3. Disambiguates the slack-state artifact names that ci-amd.yml, ci-arm.yml, and ci-image-checks.yml share. Before this PR the latent collision did not bite (AMD's notify-slack never fired); restoring the AMD schedule activates it. Each platform now writes its own slack-state-{tests,inventory}-<branch>-{amd,arm} artifact so the de-dup tracker in scripts/ci/slack_notification_state.py keeps independent state per platform. 4. Updates scripts/ci/prek/check_ci_workflows_in_sync.py to allow the new AMD-only schedule block and the per-platform artifact-name suffix as documented divergences. generated/PYPI_README.md is regenerated automatically by the generate-pypi-readme prek hook to mirror README.md. (cherry picked from commit 022e35d)
Summary
The combined
ci-amd-arm.ymlalternated ARM and AMD on the canary slot via aruntime
RUNNERS_TYPE_CROSS_MAPPINGlookup of the previous workflow run'slabels. That worked but tied the two architectures together — one canary slot
had to flip between them, badges showed whichever ran last, notifications
spoke for both, and a runtime API call decided the platform on every push.
This change splits the file into a reusable pipeline + two thin wrappers:
_ci-pipeline.yml— reusable workflow (workflow_call) with theentire pipeline. Takes
platformandrunner-typeas inputs;build-infoechoes the inputs instead of computing them viacross-mapping. Single source of truth — no per-platform duplication.
ci-arm.yml— slim wrapper. Schedule (canary cron) +workflow_dispatch only. Calls
_ci-pipeline.ymlwithplatform: linux/arm64.ci-amd.yml— slim wrapper. pull_request + push (tov3-N-testetc)_ci-pipeline.ymlwithplatform: linux/amd64. No schedule for now; ARM keeps the canaryslot. Add a
schedule:block here if/when AMD should also act as ascheduled canary — the two workflows run in parallel with separate
concurrency groups.
The runtime cross-mapping in
selective_checks.runner_typeis left in placebecause
is_disabled_integrationstill consumes it; the API lookup againstthe now-removed
ci-amd-arm.ymlreturns nothing and falls back to AMD,which is harmless. Removing the cross-mapping entirely is a follow-up.
Reference updates (every consumer of the old file name)
README.mdanddev/update_github_branch_config.py: badges →ci-amd.yml(the workflow that runs on every push to main)
.github/workflows/ci-notification.yml:workflow-id→ci-amd.yml.github/workflows/e2e-flaky-tests-report.yml:WORKFLOW_NAME→ci-amd.ymlscripts/ci/analyze_e2e_flaky_tests.py: defaultWORKFLOW_NAME→ci-amd.ymldev/README_AIRFLOW3_DEV.md,dev/README_RELEASE_AIRFLOW.md: release-cutverification URL →
ci-amd.ymlgenerated/PYPI_README.md: regenerated fromREADME.md.github/workflows/update-constraints-on-push*.yml,release_dockerhub_image.yml: comments referring back to the old file →_ci-pipeline.ymlTest plan
prek run yamllintclean on all changed workflow filesprek run zizmorclean (template-injection on the print-platformjob's
inputs.platformwas hoisted to env;secrets: inheritreplacedwith explicit
DOCS_AWS_*/SLACK_BOT_TOKENforwarding)prek run --files <changed>clean across all hookstest_selective_checks.pytests pass (therunner_typetests still pass since they mock
requests.getand don't depend on thereal workflow file existing)
ci-amd.yml. The ARMcanary will fire on its next scheduled cron tick — if both look healthy,
ready for review.
Why draft
Posting as draft for an initial review of the architecture before letting
CI exercise it for the first time. Once the AMD run on this PR completes
green, I'll mark it ready for review.
Was generative AI tooling used to co-author this PR?
Generated-by: Claude Code (Opus 4.7) following the guidelines