You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 15:18:23