fix: 部署脚本 worker health-cmd 未转义导致 staging 部署失败回滚 #1806

Merged
xiaoxia merged 1 commits from fix/deploy-script-pid-escape into develop 2026-09-08 22:41:28 +08:00
Owner

问题

staging 部署流水线 Deploy Staging job 失败,所有新版本镜像拉取成功后,容器启动阶段报错并自动回滚:

sh: 491: pid: parameter not set
FAIL xiaoxia-worker-staging: not created
ERROR: 1 个容器启动失败 → 自动回滚

根因

scripts/ci_staging_deploy.sh 开启了 set -eu。worker 容器的 --health-cmd 使用双引号包裹:

--health-cmd "sh -c "for pid in /proc/[0-9]*/cmdline; do if grep -ql celery "$pid" ...

其中的 $pid 被外层部署脚本在 docker run 参数展开阶段提前求值。pid 在该作用域未定义,set -u 下直接报 parameter not set 并终止,worker 容器未创建 → 部署判定失败 → 回滚到旧版本。

该 health-cmd 是 #1803 周期 Worker 健康检查修复(commit e4ac3983)引入。

修复

将 health-cmd 内 $pid 转义为 \$pid,透传到容器内由 healthcheck shell 展开:

--health-cmd "sh -c "for pid in /proc/[0-9]*/cmdline; do if grep -ql celery "\$pid" ...
  • 主部署段(504 行)与回滚段(195 行)两处一并修复
  • 已用 bash -n 语法检查 + 模拟 set -eu 展开验证:外层不再报错,容器内收到的 health-cmd 正确保留字面量 $pid

此修复同时解除 #1805(AI数字人 v3)合入后的 staging 部署阻塞。

🤖 Generated with Claude Code

## 问题 staging 部署流水线 Deploy Staging job 失败,所有新版本镜像拉取成功后,容器启动阶段报错并自动回滚: ``` sh: 491: pid: parameter not set FAIL xiaoxia-worker-staging: not created ERROR: 1 个容器启动失败 → 自动回滚 ``` ## 根因 `scripts/ci_staging_deploy.sh` 开启了 `set -eu`。worker 容器的 `--health-cmd` 使用双引号包裹: ```sh --health-cmd "sh -c "for pid in /proc/[0-9]*/cmdline; do if grep -ql celery "$pid" ... ``` 其中的 **$pid** 被外层部署脚本在 `docker run` 参数展开阶段提前求值。`pid` 在该作用域未定义,`set -u` 下直接报 `parameter not set` 并终止,worker 容器未创建 → 部署判定失败 → 回滚到旧版本。 该 health-cmd 是 #1803 周期 Worker 健康检查修复(commit e4ac3983)引入。 ## 修复 将 health-cmd 内 `$pid` 转义为 `\$pid`,透传到容器内由 healthcheck shell 展开: ```sh --health-cmd "sh -c "for pid in /proc/[0-9]*/cmdline; do if grep -ql celery "\$pid" ... ``` - 主部署段(504 行)与回滚段(195 行)两处一并修复 - 已用 bash -n 语法检查 + 模拟 set -eu 展开验证:外层不再报错,容器内收到的 health-cmd 正确保留字面量 $pid 此修复同时解除 #1805(AI数字人 v3)合入后的 staging 部署阻塞。 🤖 Generated with [Claude Code](https://claude.com/claude-code)
xiaoxia added 1 commit 2026-09-08 22:17:14 +08:00
fix: 部署脚本 worker health-cmd 中 $pid 未转义导致 staging 部署失败回滚
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 2s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 2s
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
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 / Retag skipped Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (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 / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 25s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 25s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 1m6s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m19s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m56s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 2m42s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 4m5s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 6m30s
AI Code Review / AI Code Review (pull_request) Successful in 6m34s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 10m59s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 23m1s
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 / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Has been skipped
CI/CD Pipeline / CI Gate (pull_request) Successful in 1s
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 5s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 1m9s
cb3bc04c83
ci_staging_deploy.sh 开启 set -eu,worker 容器 --health-cmd 双引号内的
$pid 被外层部署脚本提前展开(pid 未定义)→ 'pid: parameter not set' →
worker 容器 docker run 失败 → 判定部署失败并自动回滚。

将 health-cmd 内 $pid 转义为 \$pid,使其透传到容器内由 healthcheck shell
展开(for pid in /proc/[0-9]*/cmdline)。回滚段(195行)与主部署段(504行)
两处一并修复。

🤖 Generated with [Claude Code](https://claude.com/claude-code)

🚀 预览环境已部署

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

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

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

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

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

🗑️ 预览环境已清理

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

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

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