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

Jenkins CI/CD中Groovy向Bash传递数组丢失值的解决方法

问题解决:Jenkins Groovy传数组到Bash脚本仅获第一个值

问题原因

你当前的Groovy代码拼接数组后导出环境变量时未加引号,导致Bash解析命令时出现错误:
Groovy生成的实际Bash命令是:

export MY_USERS=user1 user2 user3

Bash会将其解析为把MY_USERS赋值为user1,然后将user2、user3当作独立命令执行,因此SCRIPT_USERS只能拿到第一个值。

解决方案

方案1:给环境变量值加引号(最简单的修改)

修改Groovy代码,在拼接后的用户列表外层添加单引号,确保Bash将整个字符串视为一个变量值:

def users = ["user1","user2","user3"]
sh """
export MY_USERS='${users.join(' ')}'
./start.sh
"""

对应的start.sh代码保持遍历逻辑,同时给变量加引号避免用户名称含空格的情况:

SCRIPT_USERS="$MY_USERS"

for user in $SCRIPT_USERS; do
  $PARAMS $K6 run "$user.js" -o xk6-influxdb \
  --out "web-dashboard=port=0&report=$DIR/${user}.html" &
done

方案2:传递Bash格式的数组(更规范)

如果需要严格按数组处理,可在Groovy中直接生成Bash数组格式的变量:

def users = ["user1","user2","user3"]
sh """
# 将Groovy数组转为Bash数组,每个元素加单引号避免空格问题
export MY_USERS=(${users.collect { "'$it'" }.join(' ')})
./start.sh
"""

然后在start.sh中用Bash数组的遍历方式,确保每个元素被正确识别:

# 遍历Bash数组
for user in "${MY_USERS[@]}"; do
  # 移除eval,直接执行命令,减少安全风险
  $PARAMS $K6 run "$user.js" -o xk6-influxdb \
  --out "web-dashboard=port=0&report=$DIR/${user}.html" &
done

方案3:直接传递位置参数(最可靠)

跳过环境变量,直接将用户列表作为命令行参数传给start.sh,避免环境变量的解析问题:
Groovy代码修改:

def users = ["user1","user2","user3"]
# 将数组元素作为参数传给start.sh
sh "./start.sh ${users.join(' ')}"

start.sh中直接使用位置参数$@遍历:

# $@代表所有传入的命令行参数,加引号确保每个元素独立
for user in "$@"; do
  $PARAMS $K6 run "$user.js" -o xk6-influxdb \
  --out "web-dashboard=port=0&report=$DIR/${user}.html" &
done

内容的提问来源于stack exchange,提问作者stupid_beaver

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 21:04:56