GitLab CI流水线脚本无法正确将命令输出赋值给自定义变量
问题根因
两个核心问题导致GitLab流水线中覆盖率提取逻辑失效:
- GitLab Runner 默认使用
/bin/sh(多数Linux发行版下为POSIX标准的dash,非Bash)执行脚本命令,代码中<<< $RES是Bash独有的here-string语法,sh环境无法识别,sed未接收到待处理的文本内容,正则替换完全不生效。 - Jest输出覆盖率报告时,汇总表格默认可能输出到stderr流,现有写法仅捕获stdout流内容,RES变量中未存储「All files」对应的覆盖率汇总行,自然无法提取到数值。
修复方法
替换不兼容POSIX标准的语法,同时合并捕获标准错误流内容,修改后可直接在流水线运行的脚本如下:
script: - echo "running test coverage" - RES="$(npm test -- --coverage --watchAll=false 2>&1)" - TOTAL="$(echo "$RES" | sed -E 's/^.*All files \| ([^ ]+) \| .*$/\1/')" - echo "Current test coverage is :" - echo "$TOTAL"
如果执行后仍提取不到数值,可临时加一行echo "$RES"打印全量输出,确认覆盖率行的实际格式后微调正则即可,适配性更强的提取写法如下,可兼容分隔符前后空格数量不一致的场景:
TOTAL="$(echo "$RES" | grep 'All files' | sed -E 's/.*\|[[:space:]]*([0-9]+\.[0-9]+)[[:space:]]*\|.*/\1/')"
如果不想修改原有Bash语法,也可在Job配置中显式指定使用Bash执行脚本:
test_coverage_job: variables: SHELL: "/bin/bash" script: # 原有脚本逻辑
内容的提问来源于stack exchange,提问作者leo
相关产品推荐
相关产品推荐

