如何让GitLab CI Runner获取docker-compose启动cypress服务的退出码
问题根因
默认docker-compose up命令的退出码仅代表命令本身是否成功执行,不会透传内部服务进程的退出码,所以即使Cypress服务返回了非0退出码,GitLab Runner拿到的docker-compose up命令返回值仍然是0,会始终判定任务成功。
解决方案
根据你的使用场景可以任选以下任意一种配置:
方案1:使用up命令透传指定服务退出码
在原命令基础上添加--abort-on-container-exit和--exit-code-from参数即可:
docker-compose -f devops/e2e/docker-compose.yml up --abort-on-container-exit --exit-code-from cypress cypress
参数说明:
--abort-on-container-exit:任意关联容器停止时,直接终止所有正在运行的容器--exit-code-from cypress:将cypress服务的退出码作为整个docker-compose up命令的最终退出码返回
方案2:改用run命令执行服务(更适合CI场景)
docker-compose run默认会前台执行指定服务,执行结束后直接返回服务本身的退出码,同时还会自动标记容器执行结束后自动清理:
docker-compose -f devops/e2e/docker-compose.yml run --rm cypress
注意事项
- 确保
devops/e2e/docker-compose.yml中cypress服务的restart策略设置为no,不要配置为always/on-failure,否则Cypress服务退出后会自动重启,导致CI任务一直阻塞无法结束。 - 配置完成后可先在本地验证:构造一个失败的Cypress用例,执行修改后的命令,随后执行
echo $?,如果返回值为1则代表退出码透传生效,配置到GitLab CI中即可正常识别失败状态。
内容的提问来源于stack exchange,提问作者mammad
相关产品推荐
相关产品推荐

