fix(ci): 修复 CNB dash 不兼容的健康检查循环#9
CI 日志显示 compose 成功:
Container mc-test-db Started Container mc-test-redis Started sh: 6: Syntax error: "&&" unexpected
CNB runner 的默认 /bin/sh 是 dash(Debian 家族),不是 bash。之前 .cnb.yml 里写的内联循环包含 &&、$() 嵌套 || 等语法,在 dash 里解析失败。
&&
$()
||
把健康检查循环抽到独立脚本 scripts/ci-wait-healthy.sh:
scripts/ci-wait-healthy.sh
sh
#!/bin/sh
set -eu
docker inspect -f '{{.State.Health.Status}}'
sh -n scripts/ci-wait-healthy.sh
dash -n scripts/ci-wait-healthy.sh
docker compose up -d
dash scripts/ci-wait-healthy.sh mc-test-db mc-test-redis
PR #8 把 Testcontainers 换成 docker-compose 的方案本身是对的——CI 日志证明 compose 成功起来了。只是后面的 shell 脚本写法不兼容 dash。这是一次 runner 环境适配的小洞。
CI 日志根因
CI 日志显示 compose 成功:
CNB runner 的默认 /bin/sh 是 dash(Debian 家族),不是 bash。之前 .cnb.yml 里写的内联循环包含
&&、$()嵌套||等语法,在 dash 里解析失败。修复
把健康检查循环抽到独立脚本
scripts/ci-wait-healthy.sh:sh语法,明确 shebang#!/bin/shset -eu严格模式docker inspect -f '{{.State.Health.Status}}'探测,不依赖复杂的管道解析本地验证
sh -n scripts/ci-wait-healthy.sh语法合法dash -n scripts/ci-wait-healthy.shdash 语法合法docker compose up -d→dash scripts/ci-wait-healthy.sh mc-test-db mc-test-redis→ 4 秒内返回 healthy与 PR #8 的关系
PR #8 把 Testcontainers 换成 docker-compose 的方案本身是对的——CI 日志证明 compose 成功起来了。只是后面的 shell 脚本写法不兼容 dash。这是一次 runner 环境适配的小洞。