From 1637a09735979423869c10a7c323aa49a9c3b50e Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Mon, 31 Aug 2026 17:32:28 +0800 Subject: [PATCH 1/2] =?UTF-8?q?perf(ci):=20=E6=B5=81=E6=B0=B4=E7=BA=BF?= =?UTF-8?q?=E7=AC=AC=E4=B8=80=E6=89=B9=E6=8F=90=E9=80=9F=20=E2=80=94=20?= =?UTF-8?q?=E7=A7=BB=E9=99=A4=E5=86=97=E4=BD=99checkout=EF=BC=8C=E8=A7=A3?= =?UTF-8?q?=E9=99=A4=E5=81=87=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 改动1: 移除 check-frontend-only / check-push-paths / ci-gate 的 Checkout step - 这三个 job 只用 Gitea API + 环境变量,不读取本地代码 - Report CI trace 改为直接下载 ci_trace_report.py 改动2: integration-tests needs 从 5 个减到 2 个 - 不再等 validate-* 完成,unit-tests 结束后立即开始 改动3: step_checkout.sh 流式下载优化 注: unit-tests 的 Install ffmpeg step 保留(测试 fixture 需要 ffmpeg) --- .gitea/workflows/ci-pipeline.yml | 29 +++--------------------- scripts/ci/step_checkout.sh | 39 ++++++++++++++++++++------------ 2 files changed, 28 insertions(+), 40 deletions(-) diff --git a/.gitea/workflows/ci-pipeline.yml b/.gitea/workflows/ci-pipeline.yml index dca9c415b..0e3a48ca3 100755 --- a/.gitea/workflows/ci-pipeline.yml +++ b/.gitea/workflows/ci-pipeline.yml @@ -81,12 +81,6 @@ jobs: skip_backend: ${{ steps.check.outputs.skip_backend }} skip_frontend: ${{ steps.check.outputs.skip_frontend }} steps: - - name: Checkout code - shell: sh - env: - GITHUB_TOKEN: ${{ github.token }} - run: | - curl -sfH "Authorization: token $GITHUB_TOKEN" -o /tmp/_ci_checkout.sh "${GITHUB_API_URL}/repos/${GITHUB_REPOSITORY}/raw/scripts/ci/step_checkout.sh?ref=${GITHUB_SHA}" && bash /tmp/_ci_checkout.sh - name: Check changed files id: check shell: bash @@ -125,7 +119,7 @@ jobs: [ ${{ job.status }} = "success" ] || STATUS="error" START_TIME="" [ -f /tmp/ci_job_start_time ] && START_TIME=$(cat /tmp/ci_job_start_time) - python3 scripts/ci/ci_trace_report.py --service xiaoxia-saas-ci --status $STATUS --start-time "$START_TIME" || true + curl -sfH "Authorization: token ${GITHUB_TOKEN:-$GITEA_TOKEN}" -o /tmp/_ci_trace.py "${GITHUB_API_URL}/repos/${GITHUB_REPOSITORY}/raw/scripts/ci/ci_trace_report.py?ref=${GITHUB_SHA}" 2>/dev/null && python3 /tmp/_ci_trace.py --service xiaoxia-saas-ci --status $STATUS --start-time "$START_TIME" || true validate-code-quality: needs: dedupe-check @@ -495,9 +489,6 @@ jobs: needs: - check-frontend-only - dedupe-check - - validate-code-quality - - validate-type-check - - validate-migration env: DATABASE_URL: postgresql+psycopg://postgres:postgres@host.docker.internal:5432/xiaoxia_saas USE_IN_MEMORY_DB: 'false' @@ -858,12 +849,6 @@ jobs: skip_backend: ${{ steps.check.outputs.skip_backend }} skip_frontend: ${{ steps.check.outputs.skip_frontend }} steps: - - name: Checkout code - shell: sh - env: - GITHUB_TOKEN: ${{ github.token }} - run: | - curl -sfH "Authorization: token $GITHUB_TOKEN" -o /tmp/_ci_checkout.sh "${GITHUB_API_URL}/repos/${GITHUB_REPOSITORY}/raw/scripts/ci/step_checkout.sh?ref=${GITHUB_SHA}" && bash /tmp/_ci_checkout.sh - name: Check changed paths id: check shell: bash @@ -881,7 +866,7 @@ jobs: [ ${{ job.status }} = "success" ] || STATUS="error" START_TIME="" [ -f /tmp/ci_job_start_time ] && START_TIME=$(cat /tmp/ci_job_start_time) - python3 scripts/ci/ci_trace_report.py --service xiaoxia-saas-ci --status $STATUS --start-time "$START_TIME" || true + curl -sfH "Authorization: token ${GITHUB_TOKEN:-$GITEA_TOKEN}" -o /tmp/_ci_trace.py "${GITHUB_API_URL}/repos/${GITHUB_REPOSITORY}/raw/scripts/ci/ci_trace_report.py?ref=${GITHUB_SHA}" 2>/dev/null && python3 /tmp/_ci_trace.py --service xiaoxia-saas-ci --status $STATUS --start-time "$START_TIME" || true build-staging: name: Build Staging ${{ matrix.service_display }} Image @@ -1896,14 +1881,6 @@ jobs: - build-pr timeout-minutes: 3 steps: - - name: Checkout code - shell: sh - env: - GITHUB_TOKEN: ${{ github.token }} - run: | - curl -sfH "Authorization: token $GITHUB_TOKEN" -o /tmp/_ci_checkout.sh \ - "${GITHUB_API_URL}/repos/${GITHUB_REPOSITORY}/raw/scripts/ci/step_checkout.sh?ref=${GITHUB_SHA}" && bash /tmp/_ci_checkout.sh - - name: Evaluate CI Gate id: gate shell: bash @@ -2065,4 +2042,4 @@ jobs: [ "${{ steps.gate.outputs.gate_result }}" = "success" ] || STATUS="error" START_TIME="" [ -f /tmp/ci_job_start_time ] && START_TIME=$(cat /tmp/ci_job_start_time) - python3 scripts/ci/ci_trace_report.py --service xiaoxia-saas-ci --status $STATUS --start-time "$START_TIME" || true + curl -sfH "Authorization: token ${GITHUB_TOKEN:-$GITEA_TOKEN}" -o /tmp/_ci_trace.py "${GITHUB_API_URL}/repos/${GITHUB_REPOSITORY}/raw/scripts/ci/ci_trace_report.py?ref=${GITHUB_SHA}" 2>/dev/null && python3 /tmp/_ci_trace.py --service xiaoxia-saas-ci --status $STATUS --start-time "$START_TIME" || true diff --git a/scripts/ci/step_checkout.sh b/scripts/ci/step_checkout.sh index cfe0de57f..2092b928f 100755 --- a/scripts/ci/step_checkout.sh +++ b/scripts/ci/step_checkout.sh @@ -1,18 +1,39 @@ #!/bin/sh -# CI 公共步骤:Checkout 代码(带重试) +# CI 公共步骤:Checkout 代码(流式下载+解压,带重试) # 用法:直接 source 或调用,需要 GITHUB_TOKEN 环境变量 set -eu python3 - <<'PY' -import io, os, tarfile, time, urllib.request, urllib.error +import io, os, sys, tarfile, time, urllib.request, urllib.error + url = f"{os.environ['GITHUB_API_URL']}/repos/{os.environ['GITHUB_REPOSITORY']}/archive/{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 + # 流式读取:先读少量数据确认连接成功,再大块读取 + first_chunk = response.read(8192) + buf = io.BytesIO() + buf.write(first_chunk) + while True: + chunk = response.read(65536) + if not chunk: + break + buf.write(chunk) + buf.seek(0) + with tarfile.open(fileobj=buf, mode='r:gz') as tar: + root_prefix = tar.getmembers()[0].name.split('/', 1)[0] + '/' + for member in tar.getmembers(): + name = member.name + if name == root_prefix[:-1]: + continue + if name.startswith(root_prefix): + member.name = name[len(root_prefix):] + if member.name: + tar.extract(member, '.') + break except urllib.error.HTTPError as e: last_err = e if e.code >= 500 and attempt < 4: @@ -31,14 +52,4 @@ for attempt in range(5): raise else: raise last_err -with tarfile.open(fileobj=io.BytesIO(archive), mode='r:gz') as tar: - root_prefix = tar.getmembers()[0].name.split('/', 1)[0] + '/' - for member in tar.getmembers(): - name = member.name - if name == root_prefix[:-1]: - continue - if name.startswith(root_prefix): - member.name = name[len(root_prefix):] - if member.name: - tar.extract(member, '.') PY -- 2.54.0 From 2d0ff927e849241ac5b8384843db57ba0337d256 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Mon, 31 Aug 2026 17:57:59 +0800 Subject: [PATCH 2/2] chore: trigger fresh CI run --- scripts/ci/step_checkout.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/ci/step_checkout.sh b/scripts/ci/step_checkout.sh index 2092b928f..6d1ac877d 100755 --- a/scripts/ci/step_checkout.sh +++ b/scripts/ci/step_checkout.sh @@ -53,3 +53,4 @@ for attempt in range(5): else: raise last_err PY +# CI pipeline speedup batch 1 -- 2.54.0