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

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


The following commit(s) were added to refs/heads/v3-0-test by this push:
     new 033e70e8c4f [v3-0-test] Avoid too many requests when refreshing 
constraint from GitHub (#49967) (#49977)
033e70e8c4f is described below

commit 033e70e8c4f273fd2318446d6279e5b476fa725c
Author: github-actions[bot] 
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Thu May 1 00:18:19 2025 +0200

    [v3-0-test] Avoid too many requests when refreshing constraint from GitHub 
(#49967) (#49977)
    
    We started to get the 429 errors (too many requests) when refreshing
    constraints. This change should increase the limits with authentication
    (cherry picked from commit a377ffffdf924f4070d78b7ce7e733c4be8fbefb)
    
    Co-authored-by: Jarek Potiuk <ja...@potiuk.com>
---
 .github/workflows/basic-tests.yml                  |  2 ++
 ...ease-management_generate-providers-metadata.svg | 26 +++++++++++++---------
 ...ease-management_generate-providers-metadata.txt |  2 +-
 .../commands/release_management_commands.py        | 13 ++++++++---
 .../commands/release_management_commands_config.py |  5 ++++-
 dev/breeze/src/airflow_breeze/utils/github.py      | 20 ++++++++++++++---
 6 files changed, 49 insertions(+), 19 deletions(-)

diff --git a/.github/workflows/basic-tests.yml 
b/.github/workflows/basic-tests.yml
index 176921df494..7efc3deedc1 100644
--- a/.github/workflows/basic-tests.yml
+++ b/.github/workflows/basic-tests.yml
@@ -353,6 +353,8 @@ jobs:
           git remote add apache https://github.com/apache/airflow.git
           git fetch apache --tags
           breeze release-management generate-providers-metadata 
--refresh-constraints
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
       - name: "Fetch all git tags for origin"
         run: git fetch --tags >/dev/null 2>&1 || true
       - name: "Test airflow core issue generation automatically"
diff --git 
a/dev/breeze/doc/images/output_release-management_generate-providers-metadata.svg
 
b/dev/breeze/doc/images/output_release-management_generate-providers-metadata.svg
index 9c6a8105daa..4f1f26d3456 100644
--- 
a/dev/breeze/doc/images/output_release-management_generate-providers-metadata.svg
+++ 
b/dev/breeze/doc/images/output_release-management_generate-providers-metadata.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 416.0" 
xmlns="http://www.w3.org/2000/svg";>
+<svg class="rich-terminal" viewBox="0 0 1482 440.4" 
xmlns="http://www.w3.org/2000/svg";>
     <!-- Generated with Rich https://www.textualize.io -->
     <style>
 
@@ -43,7 +43,7 @@
 
     <defs>
     <clipPath 
id="breeze-release-management-generate-providers-metadata-clip-terminal">
-      <rect x="0" y="0" width="1463.0" height="365.0" />
+      <rect x="0" y="0" width="1463.0" height="389.4" />
     </clipPath>
     <clipPath 
id="breeze-release-management-generate-providers-metadata-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -87,9 +87,12 @@
 <clipPath id="breeze-release-management-generate-providers-metadata-line-13">
     <rect x="0" y="318.7" width="1464" height="24.65"/>
             </clipPath>
+<clipPath id="breeze-release-management-generate-providers-metadata-line-14">
+    <rect x="0" y="343.1" width="1464" height="24.65"/>
+            </clipPath>
     </defs>
 
-    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" 
x="1" y="1" width="1480" height="414" rx="8"/><text 
class="breeze-release-management-generate-providers-metadata-title" 
fill="#c5c8c6" text-anchor="middle" x="740" 
y="27">Command:&#160;release-management&#160;generate-providers-metadata</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" 
x="1" y="1" width="1480" height="438.4" rx="8"/><text 
class="breeze-release-management-generate-providers-metadata-title" 
fill="#c5c8c6" text-anchor="middle" x="740" 
y="27">Command:&#160;release-management&#160;generate-providers-metadata</text>
             <g transform="translate(26,22)">
             <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
             <circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -106,14 +109,15 @@
 </text><text class="breeze-release-management-generate-providers-metadata-r1" 
x="1464" y="117.6" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-providers-metadata-line-4)">
 </text><text class="breeze-release-management-generate-providers-metadata-r5" 
x="0" y="142" textLength="24.4" 
clip-path="url(#breeze-release-management-generate-providers-metadata-line-5)">╭─</text><text
 class="breeze-release-management-generate-providers-metadata-r5" x="24.4" 
y="142" textLength="427" 
clip-path="url(#breeze-release-management-generate-providers-metadata-line-5)">&#160;Generate&#160;providers&#160;metadata&#160;flags&#160;</text><text
 class="breeze-release-management-gene [...]
 </text><text class="breeze-release-management-generate-providers-metadata-r5" 
x="0" y="166.4" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-providers-metadata-line-6)">│</text><text
 class="breeze-release-management-generate-providers-metadata-r4" x="24.4" 
y="166.4" textLength="256.2" 
clip-path="url(#breeze-release-management-generate-providers-metadata-line-6)">--refresh-constraints</text><text
 class="breeze-release-management-generate-providers-metadata-r1" x="329 [...]
-</text><text class="breeze-release-management-generate-providers-metadata-r5" 
x="0" y="190.8" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-providers-metadata-line-7)">│</text><text
 class="breeze-release-management-generate-providers-metadata-r4" x="24.4" 
y="190.8" textLength="97.6" 
clip-path="url(#breeze-release-management-generate-providers-metadata-line-7)">--python</text><text
 class="breeze-release-management-generate-providers-metadata-r1" x="329.4" 
y="190.8"  [...]
-</text><text class="breeze-release-management-generate-providers-metadata-r5" 
x="0" y="215.2" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-providers-metadata-line-8)">│</text><text
 class="breeze-release-management-generate-providers-metadata-r6" x="329.4" 
y="215.2" textLength="976" 
clip-path="url(#breeze-release-management-generate-providers-metadata-line-8)">(3.6&#160;|&#160;3.7&#160;|&#160;3.8&#160;|&#160;3.9&#160;|&#160;3.10&#160;|&#160;3.11&#160;|&#160;3.12)&#
 [...]
-</text><text class="breeze-release-management-generate-providers-metadata-r5" 
x="0" y="239.6" textLength="1464" 
clip-path="url(#breeze-release-management-generate-providers-metadata-line-9)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-release-management-generate-providers-metadata-r1" x="1464" 
y="239.6" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-providers-metad [...]
-</text><text class="breeze-release-management-generate-providers-metadata-r5" 
x="0" y="264" textLength="24.4" 
clip-path="url(#breeze-release-management-generate-providers-metadata-line-10)">╭─</text><text
 class="breeze-release-management-generate-providers-metadata-r5" x="24.4" 
y="264" textLength="195.2" 
clip-path="url(#breeze-release-management-generate-providers-metadata-line-10)">&#160;Common&#160;options&#160;</text><text
 class="breeze-release-management-generate-providers-metadata-r [...]
-</text><text class="breeze-release-management-generate-providers-metadata-r5" 
x="0" y="288.4" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-providers-metadata-line-11)">│</text><text
 class="breeze-release-management-generate-providers-metadata-r4" x="24.4" 
y="288.4" textLength="109.8" 
clip-path="url(#breeze-release-management-generate-providers-metadata-line-11)">--dry-run</text><text
 class="breeze-release-management-generate-providers-metadata-r7" x="158.6" 
y="288 [...]
-</text><text class="breeze-release-management-generate-providers-metadata-r5" 
x="0" y="312.8" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-providers-metadata-line-12)">│</text><text
 class="breeze-release-management-generate-providers-metadata-r4" x="24.4" 
y="312.8" textLength="109.8" 
clip-path="url(#breeze-release-management-generate-providers-metadata-line-12)">--verbose</text><text
 class="breeze-release-management-generate-providers-metadata-r7" x="158.6" 
y="312 [...]
-</text><text class="breeze-release-management-generate-providers-metadata-r5" 
x="0" y="337.2" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-providers-metadata-line-13)">│</text><text
 class="breeze-release-management-generate-providers-metadata-r4" x="24.4" 
y="337.2" textLength="73.2" 
clip-path="url(#breeze-release-management-generate-providers-metadata-line-13)">--help</text><text
 class="breeze-release-management-generate-providers-metadata-r7" x="158.6" 
y="337.2"  [...]
-</text><text class="breeze-release-management-generate-providers-metadata-r5" 
x="0" y="361.6" textLength="1464" 
clip-path="url(#breeze-release-management-generate-providers-metadata-line-14)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-release-management-generate-providers-metadata-r1" x="1464" 
y="361.6" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-providers-meta [...]
+</text><text class="breeze-release-management-generate-providers-metadata-r5" 
x="0" y="190.8" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-providers-metadata-line-7)">│</text><text
 class="breeze-release-management-generate-providers-metadata-r4" x="24.4" 
y="190.8" textLength="170.8" 
clip-path="url(#breeze-release-management-generate-providers-metadata-line-7)">--github-token</text><text
 class="breeze-release-management-generate-providers-metadata-r1" x="329.4" y=" 
[...]
+</text><text class="breeze-release-management-generate-providers-metadata-r5" 
x="0" y="215.2" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-providers-metadata-line-8)">│</text><text
 class="breeze-release-management-generate-providers-metadata-r4" x="24.4" 
y="215.2" textLength="97.6" 
clip-path="url(#breeze-release-management-generate-providers-metadata-line-8)">--python</text><text
 class="breeze-release-management-generate-providers-metadata-r1" x="329.4" 
y="215.2"  [...]
+</text><text class="breeze-release-management-generate-providers-metadata-r5" 
x="0" y="239.6" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-providers-metadata-line-9)">│</text><text
 class="breeze-release-management-generate-providers-metadata-r6" x="329.4" 
y="239.6" textLength="976" 
clip-path="url(#breeze-release-management-generate-providers-metadata-line-9)">(3.6&#160;|&#160;3.7&#160;|&#160;3.8&#160;|&#160;3.9&#160;|&#160;3.10&#160;|&#160;3.11&#160;|&#160;3.12)&#
 [...]
+</text><text class="breeze-release-management-generate-providers-metadata-r5" 
x="0" y="264" textLength="1464" 
clip-path="url(#breeze-release-management-generate-providers-metadata-line-10)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-release-management-generate-providers-metadata-r1" x="1464" 
y="264" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-providers-metadata [...]
+</text><text class="breeze-release-management-generate-providers-metadata-r5" 
x="0" y="288.4" textLength="24.4" 
clip-path="url(#breeze-release-management-generate-providers-metadata-line-11)">╭─</text><text
 class="breeze-release-management-generate-providers-metadata-r5" x="24.4" 
y="288.4" textLength="195.2" 
clip-path="url(#breeze-release-management-generate-providers-metadata-line-11)">&#160;Common&#160;options&#160;</text><text
 class="breeze-release-management-generate-providers-metada [...]
+</text><text class="breeze-release-management-generate-providers-metadata-r5" 
x="0" y="312.8" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-providers-metadata-line-12)">│</text><text
 class="breeze-release-management-generate-providers-metadata-r4" x="24.4" 
y="312.8" textLength="109.8" 
clip-path="url(#breeze-release-management-generate-providers-metadata-line-12)">--dry-run</text><text
 class="breeze-release-management-generate-providers-metadata-r7" x="158.6" 
y="312 [...]
+</text><text class="breeze-release-management-generate-providers-metadata-r5" 
x="0" y="337.2" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-providers-metadata-line-13)">│</text><text
 class="breeze-release-management-generate-providers-metadata-r4" x="24.4" 
y="337.2" textLength="109.8" 
clip-path="url(#breeze-release-management-generate-providers-metadata-line-13)">--verbose</text><text
 class="breeze-release-management-generate-providers-metadata-r7" x="158.6" 
y="337 [...]
+</text><text class="breeze-release-management-generate-providers-metadata-r5" 
x="0" y="361.6" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-providers-metadata-line-14)">│</text><text
 class="breeze-release-management-generate-providers-metadata-r4" x="24.4" 
y="361.6" textLength="73.2" 
clip-path="url(#breeze-release-management-generate-providers-metadata-line-14)">--help</text><text
 class="breeze-release-management-generate-providers-metadata-r7" x="158.6" 
y="361.6"  [...]
+</text><text class="breeze-release-management-generate-providers-metadata-r5" 
x="0" y="386" textLength="1464" 
clip-path="url(#breeze-release-management-generate-providers-metadata-line-15)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-release-management-generate-providers-metadata-r1" x="1464" 
y="386" textLength="12.2" 
clip-path="url(#breeze-release-management-generate-providers-metadata [...]
 </text>
     </g>
     </g>
diff --git 
a/dev/breeze/doc/images/output_release-management_generate-providers-metadata.txt
 
b/dev/breeze/doc/images/output_release-management_generate-providers-metadata.txt
index 8d686a6b365..e885738de07 100644
--- 
a/dev/breeze/doc/images/output_release-management_generate-providers-metadata.txt
+++ 
b/dev/breeze/doc/images/output_release-management_generate-providers-metadata.txt
@@ -1 +1 @@
-572b36905a967caed880209b60618ede
+d4630907f51e9f17d442492905a3c47d
diff --git 
a/dev/breeze/src/airflow_breeze/commands/release_management_commands.py 
b/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
index 96957d40df2..d89c089286e 100644
--- a/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
@@ -53,6 +53,7 @@ from airflow_breeze.commands.common_options import (
     option_debug_resources,
     option_dry_run,
     option_github_repository,
+    option_github_token,
     option_historical_python_version,
     option_include_not_ready_providers,
     option_include_removed_providers,
@@ -2657,7 +2658,9 @@ def generate_issue_content_core(
 
 
 def get_all_constraint_files(
-    refresh_constraints: bool, python_version: str
+    refresh_constraints: bool,
+    python_version: str,
+    github_token: str | None = None,
 ) -> tuple[list[str], dict[str, str]]:
     if refresh_constraints:
         shutil.rmtree(CONSTRAINTS_CACHE_PATH, ignore_errors=True)
@@ -2669,6 +2672,7 @@ def get_all_constraint_files(
                 if not download_constraints_file(
                     airflow_version=airflow_version,
                     python_version=python_version,
+                    github_token=github_token,
                     include_provider_dependencies=True,
                     output_file=CONSTRAINTS_CACHE_PATH
                     / 
f"constraints-{airflow_version}-python-{python_version}.txt",
@@ -2703,15 +2707,18 @@ def load_constraints(python_version: str) -> dict[str, 
dict[str, str]]:
     is_flag=True,
     help="Refresh constraints before generating metadata",
 )
+@option_github_token
 @option_historical_python_version
 @option_dry_run
 @option_verbose
-def generate_providers_metadata(refresh_constraints: bool, python: str | None):
+def generate_providers_metadata(refresh_constraints: bool, github_token: str | 
None, python: str | None):
     metadata_dict: dict[str, dict[str, dict[str, str]]] = {}
     if python is None:
         python = DEFAULT_PYTHON_MAJOR_MINOR_VERSION
     all_airflow_releases, airflow_release_dates = get_all_constraint_files(
-        refresh_constraints=refresh_constraints, python_version=python
+        refresh_constraints=refresh_constraints,
+        python_version=python,
+        github_token=github_token,
     )
     constraints = load_constraints(python_version=python)
 
diff --git 
a/dev/breeze/src/airflow_breeze/commands/release_management_commands_config.py 
b/dev/breeze/src/airflow_breeze/commands/release_management_commands_config.py
index a641322940e..c820901f063 100644
--- 
a/dev/breeze/src/airflow_breeze/commands/release_management_commands_config.py
+++ 
b/dev/breeze/src/airflow_breeze/commands/release_management_commands_config.py
@@ -376,7 +376,10 @@ RELEASE_MANAGEMENT_PARAMETERS: dict[str, list[dict[str, 
str | list[str]]]] = {
         }
     ],
     "breeze release-management generate-providers-metadata": [
-        {"name": "Generate providers metadata flags", "options": 
["--refresh-constraints", "--python"]}
+        {
+            "name": "Generate providers metadata flags",
+            "options": ["--refresh-constraints", "--github-token", "--python"],
+        }
     ],
     "breeze release-management start-rc-process": [
         {
diff --git a/dev/breeze/src/airflow_breeze/utils/github.py 
b/dev/breeze/src/airflow_breeze/utils/github.py
index 516af2fdced..445ceecd2d6 100644
--- a/dev/breeze/src/airflow_breeze/utils/github.py
+++ b/dev/breeze/src/airflow_breeze/utils/github.py
@@ -40,13 +40,16 @@ def get_ga_output(name: str, value: Any) -> str:
     return f"{output_name}={printed_value}"
 
 
-def download_file_from_github(tag: str, path: str, output_file: Path, timeout: 
int = 60) -> bool:
+def download_file_from_github(
+    tag: str, path: str, output_file: Path, github_token: str | None = None, 
timeout: int = 60
+) -> bool:
     """
     Downloads a file from GitHub repository of Apache Airflow
 
     :param tag: tag to download from
     :param path: path of the file relative to the repository root
     :param output_file: Path where the file should be downloaded
+    :param github_token: GitHub token to use for authentication
     :param timeout: timeout in seconds for the download request, default is 60 
seconds
     :return: whether the file was successfully downloaded (False if the file 
is missing or error occurred)
     """
@@ -56,7 +59,12 @@ def download_file_from_github(tag: str, path: str, 
output_file: Path, timeout: i
     get_console().print(f"[info]Downloading {url} to {output_file}")
     if not get_dry_run():
         try:
-            response = requests.get(url, timeout=timeout)
+            # add github token to the request if provided
+            headers = {}
+            if github_token:
+                headers["Authorization"] = f"Bearer {github_token}"
+                headers["X-GitHub-Api-Version"] = "2022-11-28"
+            response = requests.get(url, headers=headers, timeout=timeout)
             if response.status_code == 403:
                 get_console().print(
                     f"[error]The {url} is not accessible.This may be caused by 
either of:\n"
@@ -139,13 +147,18 @@ def get_active_airflow_versions(confirm: bool = True) -> 
tuple[list[str], dict[s
 
 
 def download_constraints_file(
-    airflow_version: str, python_version: str, include_provider_dependencies: 
bool, output_file: Path
+    airflow_version: str,
+    python_version: str,
+    github_token: str | None,
+    include_provider_dependencies: bool,
+    output_file: Path,
 ) -> bool:
     """
     Downloads constraints file from GitHub repository of Apache Airflow
 
     :param airflow_version: airflow version
     :param python_version: python version
+    :param github_token: GitHub token
     :param include_provider_dependencies: whether to include provider 
dependencies
     :param output_file: the file where to store the constraint file
     :return: true if the file was successfully downloaded
@@ -158,6 +171,7 @@ def download_constraints_file(
     return download_file_from_github(
         tag=constraints_tag,
         path=constraints_file_path,
+        github_token=github_token,
         output_file=output_file,
     )
 

Reply via email to