diff --git a/.gitea/workflows/auto-merge.yml b/.gitea/workflows/auto-merge.yml index 97c85a970..e2e924cdb 100644 --- a/.gitea/workflows/auto-merge.yml +++ b/.gitea/workflows/auto-merge.yml @@ -7,7 +7,7 @@ on: jobs: auto-merge: - runs-on: ubuntu-latest + runs-on: saas timeout-minutes: 10 steps: - name: Checkout code @@ -16,22 +16,45 @@ jobs: GITHUB_TOKEN: ${{ github.token }} run: | set -eu - archive_url="${GITHUB_API_URL}/repos/${GITHUB_REPOSITORY}/archive/${GITHUB_SHA}.tar.gz" - for i in 1 2 3 4 5; do - if wget --header="Authorization: token ${GITHUB_TOKEN}" -O /tmp/repo.tar.gz "$archive_url" 2>&1; then - break - fi - if [ "$i" -lt 5 ]; then - wait=$((2 ** i)) - echo "Checkout failed (attempt $i/5), retrying in ${wait}s..." - sleep "$wait" - else - echo "Checkout failed after 5 attempts" - exit 1 - fi - done - tar -xzf /tmp/repo.tar.gz --strip-components=1 -C . - rm -f /tmp/repo.tar.gz + python3 - <<'PY' + import io, os, tarfile, time, urllib.request, urllib.error + url = f"{os.environ['GITHUB_API_URL']}/repos/{os.environ['GITHUB_REPOSITORY']}/{os.environ['GITHUB_SHA']}.tar.gz" + request = urllib.request.Request(url, headers={"Authorization": f"token {os.environ['GITHUB_TOKEN']}"}) + last_err = None + for attempt in range(5): + try: + with urllib.request.urlopen(request, timeout=120) as response: + archive = response.read() + break + except urllib.error.HTTPError as e: + last_err = e + if e.code >= 500 and attempt < 4: + wait = 2 ** attempt + print(f"Checkout HTTP {e.code}, retrying in {wait}s (attempt {attempt+1}/5)...") + time.sleep(wait) + continue + raise + except Exception as e: + last_err = e + if attempt < 4: + wait = 2 ** attempt + print(f"Checkout error: {e}, retrying in {wait}s (attempt {attempt+1}/5)...") + time.sleep(wait) + continue + raise + else: + raise last_err + with tarfile.open(fileobj=io.BytesIO(archive), mode='r:gz') as tar: + top_prefix = tar.getmembers()[0].name.split('/', 1)[0] + '/' + for member in tar.getmembers(): + name = member.name + if name == top_prefix[:-1]: + continue + if name.startswith(top_prefix): + member.name = name[len(top_prefix):] + if member.name: + tar.extract(member, '.') + PY - name: Auto merge develop PRs run: |