自由式项目。如何遍历多值参数

Free-style Project. How to iterate over multiple-values parameter

提问人:DonnyFlaw 提问时间:11/10/2023 最后编辑:DonnyFlaw 更新时间:11/17/2023 访问量:49

问:

在我的自由式 Project Jenkins 工作中,我有一个名为“COMPONENETS”的参数,它接受一个或多个字符串除以空格。

enter image description here

如果我在 bash 脚本阶段使用这个作为单个字符串 () 传递的参数,我可以实现我需要的东西(将被处理):first/path/to/first-*.tar.gz

<DO SOMETHING WITH> /path/to/${COMPONENTS}-*.tar.gz

但是当我尝试使用处理来更新我的作业时,例如,带有两个值()的字符串:first second

for COMPONENT in $(echo "${COMPONENTS}"); do
    <DO SOMETHING WITH> /path/to/$COMPONENT-*.tar.gz
done

这不起作用,因为值似乎是空的 - 我遇到了错误

'/path/to/-*.tar.gz': No such file or directory
'/path/to/-*.tar.gz': No such file or directory

那么我应该如何正确地遍历 Jenkins 上的列表参数呢?

bash 循环 ubuntu jenkins

评论

0赞 Inian 11/10/2023
Your 包含在 UI 中传递的整个字符串。使用链接副本中的这个答案来解决您看到的问题$COMPONENTS
0赞 DonnyFlaw 11/10/2023
@Inian 感谢您的快速回复。但问题不在于如何按空格将字符串拆分为子字符串。该循环在 Ubuntu 终端中本地正常工作,但在 Jenkins 作业的 bash 脚本中不起作用
0赞 KamilCuk 11/10/2023
I have a parameter 在哪里“有”这个参数?你在哪里设置变量?也毫无意义,只是.COMPONENTS$(echo$COMPONENTS
0赞 DonnyFlaw 11/10/2023
@KamilCuk是一个自由风格的项目 Jenkins 作业参数,我想将其传递给 bash 脚本(“执行 shell”)作业阶段。 效果不佳...COMPONENTSfor COMPONENT in ${COMPONENTS}; do
0赞 JRichardsz 11/17/2023
您是否愿意接受其他解决方案?

答:

0赞 JRichardsz 11/17/2023 #1

它有效

我尝试了您的代码,它按预期工作。逐个检查字符

echo "COMPONENTS: $COMPONENTS"

for COMPONENT in $(echo "${COMPONENTS}"); do
    echo "/path/to/$COMPONENT-*.tar.gz"
done

构建参数

enter image description here

enter image description here

Jenkins版本:2.426.1

另一种选择

这也有效,而且更简单

for COMPONENT in ${COMPONENTS}; do
    echo "/path/to/$COMPONENT-*.tar.gz"
done

结果

enter image description here

来源:https://stackoverflow.com/a/1469863/3957754

使用正则表达式

你可以用它来阐述复杂的拆分

echo $COMPONENTS | sed 's/ /\n/g' | 
while read COMPONENT; do
  echo "/path/to/$COMPONENT-*.tar.gz"
done

结果

enter image description here

来源:

槽的

如果您遇到问题,我建议使用脚本化管道,其中 groovy 可以执行任何您需要的事情:

String[] COMPONENTS = param.COMPONENTS.split("\\s");
for (String COMPONENT : COMPONENTS) {
    sh "/path/to/$COMPONENT-*.tar.gz"
}