This is an automated email from the ASF dual-hosted git repository.

potiuk pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/main by this push:
     new 92bbf67c362 Refuse to publish constraints when the branch moved during 
generation (#75989)
92bbf67c362 is described below

commit 92bbf67c3629d6baf9ef738e8217da78dead950d
Author: Jarek Potiuk <[email protected]>
AuthorDate: Thu Oct 29 19:44:59 2026 +0100

    Refuse to publish constraints when the branch moved during generation 
(#75989)
    
    A regular constraints refresh resolves its pins against the constraints
    branch as it is when the run starts, then commits them on top of the
    branch as it is when the run ends. When Release constraints commits a
    release candidate's pins in between, the refresh overwrote them with
    pins resolved against the older baseline, and the push still succeeded
    because it was an ordinary fast-forward.
    
    The two workflows run in different concurrency groups, so nothing
    serialised them. The publish now fails instead and asks for a re-run,
    which then starts from the candidate's constraints.
    
    Generated-by: Claude Opus 5
---
 .github/workflows/update-constraints-on-push.yml   | 28 ++++++++++++++++++++++
 ...UALLY_GENERATING_IMAGE_CACHE_AND_CONSTRAINTS.md |  6 +++++
 2 files changed, 34 insertions(+)

diff --git a/.github/workflows/update-constraints-on-push.yml 
b/.github/workflows/update-constraints-on-push.yml
index ba55e09d9eb..4c84567e23d 100644
--- a/.github/workflows/update-constraints-on-push.yml
+++ b/.github/workflows/update-constraints-on-push.yml
@@ -99,6 +99,7 @@ jobs:
       default-python-version: ${{ 
steps.selective-checks.outputs.default-python-version }}
       python-versions: ${{ steps.selective-checks.outputs.python-versions }}
       python-versions-list-as-string: ${{ 
steps.selective-checks.outputs.python-versions-list-as-string }}
+      constraints-baseline-sha: ${{ steps.constraints-baseline.outputs.sha }}
     steps:
       - name: "Cleanup repo"
         shell: bash
@@ -129,6 +130,19 @@ jobs:
           VERBOSE: "false"
           GITHUB_CONTEXT_INPUT: "${{ runner.temp }}/github_context.json"
         run: breeze ci selective-check 2>> ${GITHUB_OUTPUT}
+      # Recorded before the constraints are generated, so any commit landing 
on the branch while
+      # this run works - a release candidate's constraints above all - stops 
the publish below
+      # instead of being overwritten by pins resolved against the older 
baseline.
+      - name: "Record the constraints baseline"
+        id: constraints-baseline
+        shell: bash
+        env:
+          CONSTRAINTS_BRANCH: ${{ 
steps.selective-checks.outputs.default-constraints-branch }}
+        run: |
+          sha="$(git ls-remote "https://github.com/${GITHUB_REPOSITORY}"; \
+            "refs/heads/${CONSTRAINTS_BRANCH}" | cut -f1)"
+          echo "sha=${sha}" >> "${GITHUB_OUTPUT}"
+          echo "Constraints baseline: ${CONSTRAINTS_BRANCH} @ ${sha:-<branch 
does not exist yet>}"
       - name: "Parameters summary"
         shell: bash
         env:
@@ -217,6 +231,20 @@ jobs:
           ref: ${{ env.CONSTRAINTS_BRANCH }}
           persist-credentials: true
           fetch-depth: 0
+      - name: "Check ${{ env.CONSTRAINTS_BRANCH }} did not move while the 
constraints were generated"
+        working-directory: "constraints"
+        env:
+          BASELINE_SHA: ${{ needs.build-info.outputs.constraints-baseline-sha 
}}
+        run: |
+          current_sha="$(git rev-parse HEAD)"
+          if [[ -n "${BASELINE_SHA}" && "${current_sha}" != "${BASELINE_SHA}" 
]]; then
+            echo "::error::${CONSTRAINTS_BRANCH} moved from ${BASELINE_SHA} to 
${current_sha}" \
+              "while this run generated its constraints. Publishing would 
overwrite those commits" \
+              "with pins resolved against the older baseline. Re-run the 
workflow so it starts" \
+              "from the current branch."
+            git log --oneline "${BASELINE_SHA}..${current_sha}" || true
+            exit 1
+          fi
       - name: "Download constraints from the generate-constraints job"
         uses: 
actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333  # v8.0.2
         with:
diff --git a/dev/MANUALLY_GENERATING_IMAGE_CACHE_AND_CONSTRAINTS.md 
b/dev/MANUALLY_GENERATING_IMAGE_CACHE_AND_CONSTRAINTS.md
index cd07deec80b..b40f1f59c1d 100644
--- a/dev/MANUALLY_GENERATING_IMAGE_CACHE_AND_CONSTRAINTS.md
+++ b/dev/MANUALLY_GENERATING_IMAGE_CACHE_AND_CONSTRAINTS.md
@@ -284,6 +284,12 @@ To run it:
 
    https://github.com/apache/airflow/commits/constraints-<major>-<minor>/
 
+   If the run instead fails with "moved ... while this run generated its 
constraints", something
+   else committed to that branch while it was working - typically the `Release 
constraints`
+   workflow pinning a release candidate. The run refuses to overwrite that 
commit with pins
+   resolved against the older baseline; run it again so it starts from the 
current branch.
+   Automatic `uv.lock`-push runs behave the same way.
+
 > [!NOTE]
 > Because `v3-3-test` and `v3-3-stable` can diverge while RCs are being voted 
 > on (fixes are
 > cherry-picked to `v3-3-test`), be deliberate about which `ref` you refresh 
 > from. Refresh from

Reply via email to