GitHub Actions脚本问题:正则匹配失败未执行else分支仍报错
解决GitHub Actions脚本中grep未匹配时触发退出的问题
问题分析
你的需求是检查非prod文件中是否存在ref=master,匹配到则报错,全部未匹配则输出“All is good”并正常通过。当前脚本的核心问题是:
启用set -euo pipefail后,grep -q在未匹配到内容时会返回非零值,触发set -e直接终止脚本,导致后续的else分支完全无法执行。同时原脚本的result变量始终为0,即使发现违规内容也无法向GitHub Actions传递错误状态。
修改后的脚本
set -euo pipefail FILE_PATTERNS="myfile/[A-Za-z]+/(tr1|gf6|ty6|ppl)/.*" regex="ref=master" result=0 # 将变更文件转为数组,兼容含空格的文件名 readarray -t changed_files <<< "${{ steps.changed-files.outputs.all_changed_files }}" for file in "${changed_files[@]}"; do # 跳过prod规则匹配的文件 if [[ "${file}" =~ $FILE_PATTERNS ]]; then continue fi # 用if语句直接捕获grep返回值,避免触发set -e退出 if grep -q "${regex}" "${file}"; then echo "Error: Found '${regex}' in non-prod file ${file}" result=1 # 标记错误状态 fi done # 遍历完成后统一输出最终状态 if [[ $result -eq 0 ]]; then echo "All is good" else exit $result # 以错误状态退出,让GitHub Actions标记为失败 fi exit $result
关键修改说明
- 规避
set -e触发的强制退出:将grep命令直接放入if条件判断中,if会自动处理命令的返回码,不会触发set -e导致脚本提前终止。 - 兼容含空格的文件名:使用
readarray -t将变更文件列表转为数组,避免文件名带空格时被错误拆分。 - 统一错误状态管理:遍历所有文件后再输出最终结果,避免每个非匹配文件都重复输出“All is good”;同时只要发现违规内容就将
result设为1,确保GitHub Actions能识别错误。 - 明确错误反馈:报错时输出具体的违规文件路径,便于定位问题。
内容的提问来源于stack exchange,提问作者MSa'ad
相关产品推荐
相关产品推荐

