部署至GCS的网站应在何时、如何捕获gsutil相关报错?
问题根因
你当前的流水线误判成功是三个环节的配置错误共同导致的:
- GitHub Actions 未实际执行部署命令,仅打印了命令日志
- Makefile 语法错误,无法正确传递部署脚本的错误状态
- 部署脚本未配置错误终止规则,单条命令失败不会中断执行也不会抛出错误码
修复方案
1. 修正GitHub Actions配置,真实执行部署命令
你当前的 workflow 配置中仅用 echo 打印了 make deploy,并未实际运行该命令,所以无论部署逻辑是否出错,流水线都会标记为成功。修改 .github/workflows/main.yml 的对应步骤:
- name: Deployment to production server run: | echo deploying new version on pierre-alexandre.io ... make deploy
GitHub Actions 默认会将返回非0退出码的命令标记为步骤失败,只要 make deploy 执行出错,流水线就会自动报错。
2. 修正Makefile的deploy目标写法
你当前把部署脚本放在了 $(shell) 函数中,这会让 make 在预处理阶段就执行脚本,且只会返回脚本的标准输出,不会传递脚本的错误状态。修改 Makefile 如下:
deploy: ./bin/deploy.sh
注意:目标下的命令行必须用Tab缩进,不能用空格,否则会触发make语法错误。如果脚本没有执行权限,先运行 chmod +x bin/deploy.sh 配置权限。
3. 给部署脚本增加严格错误检查
在 bin/deploy.sh 开头增加shell严格模式配置,只要任意命令执行失败、使用未定义变量、管道命令任意环节出错,脚本就会直接终止并返回错误码:
#!/bin/bash set -euo pipefail # 原有脚本内容保持不变 # set website config gsutil web set -m index.html -e 404.html gs://pierre-alexandre.io # add user permissions gsutil iam ch allUsers:legacyObjectReader gs://pierre-alexandre.io # copy the website files! gsutil -m rsync -d -r public_html gs://pierre-alexandre.io
修改完成后,只要gsutil相关命令报错,错误状态会依次从deploy.sh传递给make,再传递给GitHub Actions,流水线就会正确标记为失败。
内容的提问来源于stack exchange,提问作者Pierre-Alexandre
相关产品推荐
相关产品推荐

