This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch v3-4-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/v3-4-test by this push:
new f2840d11795 [v3-4-test] Run the dependency upgrade summary beside the
tests instead of after them (#76251) (#76438)
f2840d11795 is described below
commit f2840d117953b114a9f92851066ab54ca2fcc3ee
Author: Jarek Potiuk <[email protected]>
AuthorDate: Wed Nov 4 15:51:34 2026 +0100
[v3-4-test] Run the dependency upgrade summary beside the tests instead of
after them (#76251) (#76438)
The "Deps" jobs need only the CI images, but as part of finalize-tests they
waited for every test
to finish and then ran for up to 17 minutes: on a canary, finalize-tests
started at minute 59 and
the run ended at minute 78, with the image-cache push done at minute 69. In
their own workflow,
started once the CI images are built, they finish long before the tests.
The CI passed gate and
check-timed-out-jobs need them, so a failing summary still fails the run as
before.
(cherry picked from commit d7711340f848a5dcdd5f7326c3ebe6dea56bab16)
Generated-by: Claude Opus 5
---
.github/workflows/ci-amd.yml | 15 +++
.github/workflows/ci-arm.yml | 15 +++
.github/workflows/dependency-upgrade-summary.yml | 104 +++++++++++++++++++++
.github/workflows/finalize-tests.yml | 60 ------------
dev/breeze/tests/test_dependency_upgrade_report.py | 4 +-
5 files changed, 137 insertions(+), 61 deletions(-)
diff --git a/.github/workflows/ci-amd.yml b/.github/workflows/ci-amd.yml
index 6acd387f3f8..7bfa615e13b 100644
--- a/.github/workflows/ci-amd.yml
+++ b/.github/workflows/ci-amd.yml
@@ -1526,6 +1526,19 @@ jobs:
# breaking framework release should not stop finalize-tests from pushing
the image cache.
if: needs.build-info.outputs.run-agent-framework-tests == 'true'
+ dependency-upgrade-summary:
+ name: Dependency upgrade summary
+ needs: [build-info, build-ci-images]
+ uses: ./.github/workflows/dependency-upgrade-summary.yml
+ permissions:
+ contents: read
+ with:
+ runners: ${{ needs.build-info.outputs.runner-type }}
+ platform: ${{ needs.build-info.outputs.platform }}
+ python-versions: ${{ needs.build-info.outputs.python-versions }}
+ upgrade-to-newer-dependencies: ${{
needs.build-info.outputs.upgrade-to-newer-dependencies }}
+ use-uv: ${{ needs.build-info.outputs.use-uv }}
+
finalize-tests:
name: Finalize tests
permissions:
@@ -1602,6 +1615,7 @@ jobs:
- build-ts-sdk-docs
- check-run-needed
- ci-image-checks
+ - dependency-upgrade-summary
- finalize-tests
- gate
- generate-constraints
@@ -1670,6 +1684,7 @@ jobs:
- check-run-needed
- check-timed-out-jobs
- ci-image-checks
+ - dependency-upgrade-summary
- finalize-tests
- gate
- generate-constraints
diff --git a/.github/workflows/ci-arm.yml b/.github/workflows/ci-arm.yml
index 09b0967b490..fa068f1ee74 100644
--- a/.github/workflows/ci-arm.yml
+++ b/.github/workflows/ci-arm.yml
@@ -1402,6 +1402,19 @@ jobs:
# breaking framework release should not stop finalize-tests from pushing
the image cache.
if: needs.build-info.outputs.run-agent-framework-tests == 'true'
+ dependency-upgrade-summary:
+ name: Dependency upgrade summary
+ needs: [build-info, build-ci-images]
+ uses: ./.github/workflows/dependency-upgrade-summary.yml
+ permissions:
+ contents: read
+ with:
+ runners: ${{ needs.build-info.outputs.runner-type }}
+ platform: ${{ needs.build-info.outputs.platform }}
+ python-versions: ${{ needs.build-info.outputs.python-versions }}
+ upgrade-to-newer-dependencies: ${{
needs.build-info.outputs.upgrade-to-newer-dependencies }}
+ use-uv: ${{ needs.build-info.outputs.use-uv }}
+
finalize-tests:
name: Finalize tests
permissions:
@@ -1478,6 +1491,7 @@ jobs:
- build-ts-sdk-docs
- check-run-needed
- ci-image-checks
+ - dependency-upgrade-summary
- finalize-tests
- generate-constraints
- migration-round-trip
@@ -1545,6 +1559,7 @@ jobs:
- check-run-needed
- check-timed-out-jobs
- ci-image-checks
+ - dependency-upgrade-summary
- finalize-tests
- generate-constraints
- migration-round-trip
diff --git a/.github/workflows/dependency-upgrade-summary.yml
b/.github/workflows/dependency-upgrade-summary.yml
new file mode 100644
index 00000000000..626f594940c
--- /dev/null
+++ b/.github/workflows/dependency-upgrade-summary.yml
@@ -0,0 +1,104 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+---
+# Checks how far the constraints are behind the newest releases. It needs only
the CI images, so it
+# runs beside the tests instead of after them: in finalize-tests it added up
to 17 minutes to the
+# end of a canary run. dependency-upgrade-report.yml reads the inputs it saves
on canaries on main.
+name: Dependency upgrade summary
+on: # yamllint disable-line rule:truthy
+ workflow_call:
+ inputs:
+ runners:
+ description: "The array of labels (in json form) determining runners."
+ required: true
+ type: string
+ platform:
+ description: "Platform for the build - 'linux/amd64' or 'linux/arm64'"
+ required: true
+ type: string
+ python-versions:
+ description: "JSON-formatted array of Python versions to check"
+ required: true
+ type: string
+ upgrade-to-newer-dependencies:
+ description: "Whether to upgrade to newer dependencies (true/false)"
+ required: true
+ type: string
+ use-uv:
+ description: "Whether to use uv"
+ required: true
+ type: string
+permissions:
+ contents: read
+jobs:
+ dependency-upgrade-summary:
+ runs-on: ${{ format(fromJSON(inputs.runners)[0], '4+8', '16+32') }}
+ if: inputs.upgrade-to-newer-dependencies == 'true' && inputs.platform ==
'linux/amd64'
+ name: "Deps ${{ matrix.python-version }}:${{ matrix.constraints-mode }}"
+ strategy:
+ matrix:
+ python-version: ${{ fromJson(inputs.python-versions) }}
+ constraints-mode: ["constraints", "constraints-source-providers",
"constraints-no-providers"]
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ steps:
+ - name: "Cleanup repo"
+ shell: bash
+ run: sudo rm -rf ${GITHUB_WORKSPACE}/*
+ - name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 #
v7.0.1
+ with:
+ persist-credentials: false
+ - name: "Prepare breeze & CI image: ${{ matrix.python-version }}"
+ uses: ./.github/actions/prepare_breeze_and_image
+ with:
+ platform: ${{ inputs.platform }}
+ python: ${{ matrix.python-version }}
+ use-uv: ${{ inputs.use-uv }}
+ make-mnt-writeable-and-cleanup: true
+ # Scheduled and dispatched canaries on main leave the explanations to
dependency-upgrade-report.yml
+ # and save the constraints they checked for it. Saving them never fails
this step.
+ - name: "Deps: ${{ matrix.python-version }}:${{ matrix.constraints-mode
}}"
+ shell: bash
+ run: |
+ REPORT_ARGS=(--explain-why)
+ if [[ "${INDEPENDENT_REPORT}" == "true" ]]; then
+ REPORT_ARGS=(--no-explain-why --save-constraints-to
files/dependency-report)
+ fi
+ breeze release-management constraints-version-check \
+ --python "${MATRIX_PYTHON_VERSION}" \
+ --airflow-constraints-mode "${MATRIX_CONSTRAINTS_MODE}"
"${REPORT_ARGS[@]}"
+ env:
+ MATRIX_PYTHON_VERSION: "${{ matrix.python-version }}"
+ MATRIX_CONSTRAINTS_MODE: "${{ matrix.constraints-mode }}"
+ INDEPENDENT_REPORT: >-
+ ${{ github.ref == 'refs/heads/main' &&
+ (github.event_name == 'schedule' || github.event_name ==
'workflow_dispatch') }}
+ VERBOSE: "false"
+ - name: "Upload dependency report inputs"
+ if: >-
+ !cancelled() &&
hashFiles('files/dependency-report/constraints-commit.txt') != ''
+ continue-on-error: true
+ uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9
# v7.0.2
+ with:
+ name: "dependency-report-inputs-${{ matrix.python-version }}-${{
matrix.constraints-mode }}\
+ -${{ inputs.use-uv }}-${{ github.run_attempt }}"
+ path: files/dependency-report/
+ if-no-files-found: error
+ retention-days: 2
+ overwrite: true
diff --git a/.github/workflows/finalize-tests.yml
b/.github/workflows/finalize-tests.yml
index 262cc2b9a66..52926b1028d 100644
--- a/.github/workflows/finalize-tests.yml
+++ b/.github/workflows/finalize-tests.yml
@@ -125,66 +125,6 @@ jobs:
- name: "Diff in constraints for Python: ${{
inputs.python-versions-list-as-string }}"
run: ./scripts/ci/constraints/ci_diff_constraints.sh
- # Constraint commits are now handled by the dedicated
update-constraints-on-push workflow
- # triggered when uv.lock changes are pushed to main/test branches.
- dependency-upgrade-summary:
- runs-on: ${{ format(fromJSON(inputs.runners)[0], '4+8', '16+32') }}
- needs: [update-constraints]
- if: inputs.upgrade-to-newer-dependencies == 'true' && inputs.platform ==
'linux/amd64'
- name: "Deps ${{ matrix.python-version }}:${{ matrix.constraints-mode }}"
- strategy:
- matrix:
- python-version: ${{ fromJson(inputs.python-versions) }}
- constraints-mode: ["constraints", "constraints-source-providers",
"constraints-no-providers"]
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- steps:
- - name: "Cleanup repo"
- shell: bash
- run: sudo rm -rf ${GITHUB_WORKSPACE}/*
- - name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 #
v7.0.1
- with:
- persist-credentials: false
- - name: "Prepare breeze & CI image: ${{ matrix.python-version }}"
- uses: ./.github/actions/prepare_breeze_and_image
- with:
- platform: ${{ inputs.platform }}
- python: ${{ matrix.python-version }}
- use-uv: ${{ inputs.use-uv }}
- make-mnt-writeable-and-cleanup: true
- # Scheduled and dispatched canaries on main leave the explanations to
dependency-upgrade-report.yml
- # and save the constraints they checked for it. Saving them never fails
this step.
- - name: "Deps: ${{ matrix.python-version }}:${{ matrix.constraints-mode
}}"
- shell: bash
- run: |
- REPORT_ARGS=(--explain-why)
- if [[ "${INDEPENDENT_REPORT}" == "true" ]]; then
- REPORT_ARGS=(--no-explain-why --save-constraints-to
files/dependency-report)
- fi
- breeze release-management constraints-version-check \
- --python "${MATRIX_PYTHON_VERSION}" \
- --airflow-constraints-mode "${MATRIX_CONSTRAINTS_MODE}"
"${REPORT_ARGS[@]}"
- env:
- MATRIX_PYTHON_VERSION: "${{ matrix.python-version }}"
- MATRIX_CONSTRAINTS_MODE: "${{ matrix.constraints-mode }}"
- INDEPENDENT_REPORT: >-
- ${{ github.ref == 'refs/heads/main' &&
- (github.event_name == 'schedule' || github.event_name ==
'workflow_dispatch') }}
- VERBOSE: "false"
- - name: "Upload dependency report inputs"
- if: >-
- !cancelled() &&
hashFiles('files/dependency-report/constraints-commit.txt') != ''
- continue-on-error: true
- uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9
# v7.0.2
- with:
- name: "dependency-report-inputs-${{ matrix.python-version }}-${{
matrix.constraints-mode }}\
- -${{ inputs.use-uv }}-${{ github.run_attempt }}"
- path: files/dependency-report/
- if-no-files-found: error
- retention-days: 2
- overwrite: true
-
push-buildx-cache-to-github-registry:
name: Push Regular Image Cache ${{ inputs.platform }}
needs: [update-constraints]
diff --git a/dev/breeze/tests/test_dependency_upgrade_report.py
b/dev/breeze/tests/test_dependency_upgrade_report.py
index 489d88d71c5..e8752e5bc29 100644
--- a/dev/breeze/tests/test_dependency_upgrade_report.py
+++ b/dev/breeze/tests/test_dependency_upgrade_report.py
@@ -97,7 +97,9 @@ def load_workflow(path):
def summary_steps():
- steps =
load_workflow("workflows/finalize-tests.yml")["jobs"]["dependency-upgrade-summary"]["steps"]
+ steps =
load_workflow("workflows/dependency-upgrade-summary.yml")["jobs"]["dependency-upgrade-summary"][
+ "steps"
+ ]
return {step["name"]: step for step in steps}