fix(ci): deploy脚本直接使用完整registry镜像名,修复watchtower自动更新 #611

Merged
auto-approve-bot merged 1 commits from fix/deploy-registry-image-names into develop 2026-07-19 20:15:55 +08:00
Owner

问题

Deploy脚本pull完整registry路径的镜像后,re-tag成本地短名(如 xiaoxia-saas-api:xxx),然后用短名启动容器。

导致watchtower监控容器时,去 docker.io(默认registry)查找短名镜像,找不到就不会自动更新,watchtower形同虚设。

修复

Staging Deploy

  • 删除 docker tag re-tag步骤
  • 容器启动直接使用完整registry路径镜像(xiaoxia-registry.cn-hangzhou.cr.aliyuncs.com/xiaoxiakeji/xiaoxia-saas-*
  • rollback逻辑自动适配(从docker inspect读取的也是完整路径)

Production Deploy

  • 从base64内嵌脚本改为独立脚本文件 scripts/ci_production_deploy.sh(可维护、可review)
  • 同样使用完整registry路径启动容器
  • 保留资源限制(API/Worker 2核2G,Web 0.5核512M)
  • 新增自动回滚能力(和staging一致)

影响

  • CI配置变更,不影响业务代码
  • 生产部署脚本从base64黑盒变为可读文件,降低维护成本
  • watchtower可正确监控所有容器并自动更新
## 问题 Deploy脚本pull完整registry路径的镜像后,re-tag成本地短名(如 xiaoxia-saas-api:xxx),然后用短名启动容器。 导致watchtower监控容器时,去 docker.io(默认registry)查找短名镜像,找不到就不会自动更新,watchtower形同虚设。 ## 修复 ### Staging Deploy - 删除 `docker tag` re-tag步骤 - 容器启动直接使用完整registry路径镜像(`xiaoxia-registry.cn-hangzhou.cr.aliyuncs.com/xiaoxiakeji/xiaoxia-saas-*`) - rollback逻辑自动适配(从docker inspect读取的也是完整路径) ### Production Deploy - 从base64内嵌脚本改为独立脚本文件 `scripts/ci_production_deploy.sh`(可维护、可review) - 同样使用完整registry路径启动容器 - 保留资源限制(API/Worker 2核2G,Web 0.5核512M) - 新增自动回滚能力(和staging一致) ## 影响 - CI配置变更,不影响业务代码 - 生产部署脚本从base64黑盒变为可读文件,降低维护成本 - watchtower可正确监控所有容器并自动更新
xiaoxia added 1 commit 2026-07-19 20:10:05 +08:00
fix(ci): deploy脚本直接使用完整registry镜像名,删除re-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 / 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 / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (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 25s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 52s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 3m0s
CI/CD Pipeline / Validate Code Quality And Tests (pull_request) Successful in 2m44s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 3m30s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 4m3s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m28s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 5m49s
AI Code Review / AI Code Review (pull_request) Successful in 6m1s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 18s
223912ec0c
- staging deploy: 移除 docker tag 成本地名步骤,直接用完整ACR路径启动容器
- production deploy: 从base64内嵌改为外部脚本文件,同样使用完整registry路径
- 修复watchtower自动更新失效问题(短镜像名导致watchtower去docker.io查找)
- 提高deploy脚本可维护性(production不再是base64黑盒)

🚀 预览环境已部署

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

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

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

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

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #611 | | 预览链接 | [https://pr-611.preview.xiaoxiajianji.com](https://pr-611.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
auto-approve-bot approved these changes 2026-07-19 20:14:09 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

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

CI全绿,自动审批通过。

CI全绿,自动审批通过。
auto-approve-bot merged commit ab46a0a1cc into develop 2026-07-19 20:15:55 +08:00
auto-approve-bot deleted branch fix/deploy-registry-image-names 2026-07-19 20:15:55 +08:00
Collaborator

代码审查结果 - PR #611

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

  1. scripts/ci_production_deploy.sh 第357行 & scripts/ci_staging_deploy.sh 第250行:Shell脚本语法错误,行尾多了一个双引号。

    • 问题描述:代码为 echo "All images pulled."",末尾多余的引号会导致Shell解析失败(Syntax Error),脚本将在此处中断退出,导致部署失败。
    • 后果:生产环境和Staging环境的部署流程均无法完成。
  2. .gitea/workflows/ci-pipeline.yml 第819行:远程命令注入安全风险。

    • 问题描述:在SSH命令中直接拼接变量:"IMAGE_TAG='${GITHUB_REF_NAME}' ACR_USERNAME='${ACR_USERNAME}' ACR_PASSWORD='${ACR_PASSWORD}' sh"。如果 ACR_PASSWORD 或其他变量中包含单引号('),将破坏Shell命令结构,导致远程代码执行(RCE)或命令解析失败。
    • 后果:可能被利用在生产服务器上执行任意恶意命令,或因密码含特殊字符导致部署失败。
    • 修改建议:建议将敏感变量通过环境变量传递(如果SSH配置允许),或者使用Base64编码传递变量并在脚本内部解码,避免直接在Shell命令字符串中拼接。
  3. scripts/ci_production_deploy.sh 第443行:日志输出端口与实际映射端口不一致。

    • 问题描述:日志输出 echo "Web: http://127.0.0.1:3001",但在第426行的 docker run 命令中,端口映射为 -p 127.0.0.1:3002:80
    • 后果:运维人员根据日志信息检查服务时,会访问错误的端口(3001),导致误判服务不可用。

💡 建议(1个可选)

  1. scripts/ci_production_deploy.sh 第429行:变量引用建议加引号防止路径空格问题。
    • 具体内容LEGACY_VOLUME 的赋值使用了未加引号的变量 ${LEGACY_ASSETS_DIR}。虽然当前路径是固定的系统路径,但为了脚本健壮性,建议写成 LEGACY_VOLUME="-v \"${LEGACY_ASSETS_DIR}:...:ro""。

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


🤖 由 AI 代码审查机器人自动生成 | 2026-07-19 20:16:06 | 模型:

## 代码审查结果 - PR #611 ### ⚠️ 问题(3个需要修改) 1. **scripts/ci_production_deploy.sh 第357行 & scripts/ci_staging_deploy.sh 第250行**:Shell脚本语法错误,行尾多了一个双引号。 - **问题描述**:代码为 `echo "All images pulled.""`,末尾多余的引号会导致Shell解析失败(Syntax Error),脚本将在此处中断退出,导致部署失败。 - **后果**:生产环境和Staging环境的部署流程均无法完成。 2. **.gitea/workflows/ci-pipeline.yml 第819行**:远程命令注入安全风险。 - **问题描述**:在SSH命令中直接拼接变量:`"IMAGE_TAG='${GITHUB_REF_NAME}' ACR_USERNAME='${ACR_USERNAME}' ACR_PASSWORD='${ACR_PASSWORD}' sh"`。如果 `ACR_PASSWORD` 或其他变量中包含单引号(`'`),将破坏Shell命令结构,导致远程代码执行(RCE)或命令解析失败。 - **后果**:可能被利用在生产服务器上执行任意恶意命令,或因密码含特殊字符导致部署失败。 - **修改建议**:建议将敏感变量通过环境变量传递(如果SSH配置允许),或者使用Base64编码传递变量并在脚本内部解码,避免直接在Shell命令字符串中拼接。 3. **scripts/ci_production_deploy.sh 第443行**:日志输出端口与实际映射端口不一致。 - **问题描述**:日志输出 `echo "Web: http://127.0.0.1:3001"`,但在第426行的 `docker run` 命令中,端口映射为 `-p 127.0.0.1:3002:80`。 - **后果**:运维人员根据日志信息检查服务时,会访问错误的端口(3001),导致误判服务不可用。 ### 💡 建议(1个可选) 1. **scripts/ci_production_deploy.sh 第429行**:变量引用建议加引号防止路径空格问题。 - **具体内容**:`LEGACY_VOLUME` 的赋值使用了未加引号的变量 `${LEGACY_ASSETS_DIR}`。虽然当前路径是固定的系统路径,但为了脚本健壮性,建议写成 `LEGACY_VOLUME="-v \"${LEGACY_ASSETS_DIR}:...:ro"`"。 --- ✅ 格式检查通过 | ❌ 逻辑审查需修改 | ⚠️ 建议关注性能 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-07-19 20:16:06 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->

🗑️ 预览环境已清理

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

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

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