fix(ci): ACR cleanup改到Deploy之后运行,保护当前构建tag不被误删 #614

Merged
auto-approve-bot merged 1 commits from fix/acr-cleanup-timing into develop 2026-07-19 21:24:44 +08:00
Owner

问题根因

ACR cleanup和Deploy Staging并行运行,缓存构建的web镜像(40秒完成)manifest的created时间是缓存的旧时间,ACR cleanup按created时间排序时把它当成老镜像删了。Deploy去拉的时候镜像已经不存在,报not found。

修复

  1. 调整执行顺序:ACR cleanup的needs从build-staging改为deploy-staging,确保部署成功后再清理旧镜像
  2. PROTECTED_TAG保护:当前commit对应的tag不被删除(双保险,防止缓存构建时间不准导致误删)

影响

  • Deploy Staging不再因为ACR cleanup抢跑而拉不到刚构建的镜像
  • ACR cleanup延迟到部署成功后运行,不影响部署时效
## 问题根因 ACR cleanup和Deploy Staging并行运行,缓存构建的web镜像(40秒完成)manifest的created时间是缓存的旧时间,ACR cleanup按created时间排序时把它当成老镜像删了。Deploy去拉的时候镜像已经不存在,报not found。 ## 修复 1. **调整执行顺序**:ACR cleanup的needs从build-staging改为deploy-staging,确保部署成功后再清理旧镜像 2. **PROTECTED_TAG保护**:当前commit对应的tag不被删除(双保险,防止缓存构建时间不准导致误删) ## 影响 - Deploy Staging不再因为ACR cleanup抢跑而拉不到刚构建的镜像 - ACR cleanup延迟到部署成功后运行,不影响部署时效
xiaoxia added 1 commit 2026-07-19 21:18:20 +08:00
fix(ci): ACR cleanup改到Deploy之后运行,保护当前构建tag不被误删
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 22s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m10s
CI/CD Pipeline / Validate Code Quality And Tests (pull_request) Successful in 3m14s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 4m10s
AI Code Review / AI Code Review (pull_request) Successful in 4m27s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 4m16s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 4m44s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m45s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 6m22s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 20s
b3f3f39173
问题:ACR cleanup和Deploy Staging并行运行,缓存构建的镜像manifest
created时间是旧的,被ACR cleanup当成老镜像删掉了,导致Deploy拉取
时报not found。

修复:
1. ACR cleanup的needs从build-staging改为deploy-staging,确保部署
   成功后再清理旧镜像
2. 添加PROTECTED_TAG保护机制,当前commit对应的tag不被删除(双保险)

🚀 预览环境已部署

项目 详情
PR号 #614
预览链接 https://pr-614.preview.xiaoxiajianji.com
API环境 staging

💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。

🔄 每次提交新代码后预览环境会自动更新。

🗑️ PR 关闭或合并后,预览环境会自动清理。

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #614 | | 预览链接 | [https://pr-614.preview.xiaoxiajianji.com](https://pr-614.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
Collaborator

代码审查结果 - PR #614

⚠️ 问题(2个需要修改)

  1. scripts/ci/acr_cleanup.py 第285行:Tag匹配逻辑存在风险,startswith 可能导致保护失效。

    • 原因:ACR中的镜像Tag通常包含仓库前缀(如 repo/image:sha)或仅仅是Tag名(如 sha)。如果 t["tag"] 返回的是完整镜像名,使用 startswith(sha) 将无法匹配,导致当前构建的镜像被误删。即使Tag仅为 sha,使用 startswith 也会错误匹配以该SHA开头的其他Tag(如 sha-timestamp)。
    • 后果:当前正在构建/部署的镜像可能被清理脚本误删,导致部署失败或运行时拉取不到镜像。
    • 建议:确认 t["tag"] 的格式。如果是完整镜像名,建议使用 endswith(":" + protected_tag)in 操作符;如果确定Tag名即为SHA,建议使用 == 进行精确匹配。
  2. .gitea/workflows/ci-pipeline.yml 第911行:作业依赖变更可能导致清理任务被跳过。

    • 原因:将依赖从 build-staging 改为 deploy-staging 意味着只有当部署成功时才会执行清理。虽然代码中增加了 PROTECTED_TAG 保护机制,理论上可以在构建后立即运行清理,但此变更引入了新的风险。
    • 后果:如果 deploy-staging 阶段失败,清理任务将不会执行。长期来看,这可能导致旧镜像堆积,存储空间无法释放,除非有其他定时清理任务。
    • 建议:评估清理任务的定位。如果是维护性任务,建议保持依赖 build-staging 或独立运行;必须确认 deploy-staging 失败时是否需要跳过清理。

💡 建议(1个可选)

  1. scripts/ci/acr_cleanup.py 第283行:环境变量获取建议增加日志。
    • 内容:在获取 PROTECTED_TAG 后,建议打印日志确认该变量是否被正确传入,便于排查CI环境变量传递问题。

格式检查通过 | 逻辑审查需修改 | ⚠️ 建议关注性能


🤖 由 AI 代码审查机器人自动生成 | 2026-07-19 21:22:47 | 模型:

## 代码审查结果 - PR #614 ### ⚠️ 问题(2个需要修改) 1. **scripts/ci/acr_cleanup.py 第285行**:Tag匹配逻辑存在风险,`startswith` 可能导致保护失效。 - **原因**:ACR中的镜像Tag通常包含仓库前缀(如 `repo/image:sha`)或仅仅是Tag名(如 `sha`)。如果 `t["tag"]` 返回的是完整镜像名,使用 `startswith(sha)` 将无法匹配,导致当前构建的镜像被误删。即使Tag仅为 `sha`,使用 `startswith` 也会错误匹配以该SHA开头的其他Tag(如 `sha-timestamp`)。 - **后果**:当前正在构建/部署的镜像可能被清理脚本误删,导致部署失败或运行时拉取不到镜像。 - **建议**:确认 `t["tag"]` 的格式。如果是完整镜像名,建议使用 `endswith(":" + protected_tag)` 或 `in` 操作符;如果确定Tag名即为SHA,建议使用 `==` 进行精确匹配。 2. **.gitea/workflows/ci-pipeline.yml 第911行**:作业依赖变更可能导致清理任务被跳过。 - **原因**:将依赖从 `build-staging` 改为 `deploy-staging` 意味着只有当部署成功时才会执行清理。虽然代码中增加了 `PROTECTED_TAG` 保护机制,理论上可以在构建后立即运行清理,但此变更引入了新的风险。 - **后果**:如果 `deploy-staging` 阶段失败,清理任务将不会执行。长期来看,这可能导致旧镜像堆积,存储空间无法释放,除非有其他定时清理任务。 - **建议**:评估清理任务的定位。如果是维护性任务,建议保持依赖 `build-staging` 或独立运行;必须确认 `deploy-staging` 失败时是否需要跳过清理。 ### 💡 建议(1个可选) 1. **scripts/ci/acr_cleanup.py 第283行**:环境变量获取建议增加日志。 - **内容**:在获取 `PROTECTED_TAG` 后,建议打印日志确认该变量是否被正确传入,便于排查CI环境变量传递问题。 --- ✅ 格式检查通过 | ❌ 逻辑审查需修改 | ⚠️ 建议关注性能 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-07-19 21:22:47 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
auto-approve-bot approved these changes 2026-07-19 21:23:05 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

CI全绿,自动审批通过。
auto-approve-bot approved these changes 2026-07-19 21:23:05 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

CI全绿,自动审批通过。
auto-approve-bot merged commit 91e3080371 into develop 2026-07-19 21:24:44 +08:00
auto-approve-bot deleted branch fix/acr-cleanup-timing 2026-07-19 21:24:44 +08:00

🗑️ 预览环境已清理

PR #614 已关闭或合并,对应的预览环境已被清理。

如有需要,可以重新打开 PR 来重新生成预览环境。

🗑️ **预览环境已清理** PR #614 已关闭或合并,对应的预览环境已被清理。 > 如有需要,可以重新打开 PR 来重新生成预览环境。
Sign in to join this conversation.