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

ephraimanierobi pushed a commit to branch v3-1-test
in repository https://gitbox.apache.org/repos/asf/airflow.git

commit 49d08fe87b652ef4e38400bb86d5291cc0d053d5
Author: github-actions[bot] 
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Thu Jan 8 22:04:43 2026 +0100

    [v3-1-test] Fix flaky release command (#60284) (#60291)
    
    (cherry picked from commit a037560f85f1ae98691b30877c976bedb8e8a504)
    
    Co-authored-by: Rahul Vats <[email protected]>
---
 .../src/airflow_breeze/commands/release_command.py | 77 +++++++++++++++-------
 1 file changed, 55 insertions(+), 22 deletions(-)

diff --git a/dev/breeze/src/airflow_breeze/commands/release_command.py 
b/dev/breeze/src/airflow_breeze/commands/release_command.py
index a66dd38c52f..8b0926fdf41 100644
--- a/dev/breeze/src/airflow_breeze/commands/release_command.py
+++ b/dev/breeze/src/airflow_breeze/commands/release_command.py
@@ -18,6 +18,8 @@ from __future__ import annotations
 
 import os
 import re
+import time
+from subprocess import CalledProcessError
 
 import click
 
@@ -27,19 +29,42 @@ from airflow_breeze.utils.confirm import confirm_action
 from airflow_breeze.utils.console import console_print
 from airflow_breeze.utils.path_utils import AIRFLOW_ROOT_PATH
 from airflow_breeze.utils.run_utils import run_command
+from airflow_breeze.utils.shared_options import get_dry_run
 
 # Pattern to match Airflow release versions (e.g., "3.0.5")
 RELEASE_PATTERN = 
re.compile(r"^(?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)$")
 
 
+SVN_NUM_TRIES = 3
+
+
 def clone_asf_repo(working_dir):
     if confirm_action("Clone ASF repo?"):
         run_command(["rm", "-rf", f"{working_dir}/asf-dist"], check=True)
-        run_command(
-            ["svn", "checkout", "--depth=immediates", 
"https://dist.apache.org/repos/dist";, "asf-dist"],
-            check=True,
-            dry_run_override=False,
-        )
+
+        # SVN checkout with retries
+        for attempt in range(SVN_NUM_TRIES):
+            try:
+                run_command(
+                    [
+                        "svn",
+                        "checkout",
+                        "--depth=immediates",
+                        "https://dist.apache.org/repos/dist";,
+                        "asf-dist",
+                    ],
+                    check=True,
+                    dry_run_override=False,
+                )
+                break
+            except CalledProcessError:
+                if attempt == SVN_NUM_TRIES - 1:
+                    raise
+                console_print(
+                    f"[warning]SVN checkout failed. Retrying! {SVN_NUM_TRIES - 
attempt - 1} tries left."
+                )
+                time.sleep(5)
+
         dev_dir = f"{working_dir}/asf-dist/dev/airflow"
         release_dir = f"{working_dir}/asf-dist/release/airflow"
         run_command(["svn", "update", "--set-depth", "infinity", dev_dir], 
dry_run_override=False, check=True)
@@ -401,26 +426,34 @@ def airflow_release(version, task_sdk_version):
     # Clone the asf repo
     os.chdir("..")
     working_dir = os.getcwd()
-    clone_asf_repo(working_dir)
     svn_dev_repo = f"{working_dir}/asf-dist/dev/airflow"
     svn_release_repo = f"{working_dir}/asf-dist/release/airflow"
-    console_print("SVN dev repo root:", svn_dev_repo)
-    console_print("SVN release repo root:", svn_release_repo)
-
-    # Find the latest release candidate for the given version
-    console_print()
-    console_print("Finding latest release candidate from SVN dev directory...")
-    release_candidate = find_latest_release_candidate(version, svn_dev_repo, 
component="airflow")
-    if not release_candidate:
-        exit(f"No release candidate found for version {version} in SVN dev 
directory")
 
-    task_sdk_release_candidate = None
-    if task_sdk_version:
-        task_sdk_release_candidate = find_latest_release_candidate(
-            task_sdk_version, svn_dev_repo, component="task-sdk"
-        )
-        if not task_sdk_release_candidate:
-            exit(f"No Task SDK release candidate found for version 
{task_sdk_version} in SVN dev directory")
+    if get_dry_run():
+        # Skip SVN clone in dry-run mode - use placeholder RCs for testing the 
workflow
+        console_print("[info]Skipping SVN operations in dry-run mode")
+        release_candidate = f"{version}rc1"
+        task_sdk_release_candidate = f"{task_sdk_version}rc1" if 
task_sdk_version else None
+    else:
+        clone_asf_repo(working_dir)
+        console_print("SVN dev repo root:", svn_dev_repo)
+        console_print("SVN release repo root:", svn_release_repo)
+
+        console_print()
+        console_print("Finding latest release candidate from SVN dev 
directory...")
+        release_candidate = find_latest_release_candidate(version, 
svn_dev_repo, component="airflow")
+        if not release_candidate:
+            exit(f"No release candidate found for version {version} in SVN dev 
directory")
+
+        task_sdk_release_candidate = None
+        if task_sdk_version:
+            task_sdk_release_candidate = find_latest_release_candidate(
+                task_sdk_version, svn_dev_repo, component="task-sdk"
+            )
+            if not task_sdk_release_candidate:
+                exit(
+                    f"No Task SDK release candidate found for version 
{task_sdk_version} in SVN dev directory"
+                )
 
     console_print()
     console_print("Airflow Release candidate:", release_candidate)

Reply via email to