如何在Job DSL中将Jenkins参数作为参数传递给从文件读取的shell脚本
问题原因
你原有写法语法不合法:readFileFromWorkspace的返回值是build.sh的文本内容,直接和${CHOICE_PARAMETER_VALUE}拼接不符合Groovy语法规则,且即使拼接成功,变量也不会作为参数传递给脚本,只会被识别为普通的shell命令片段执行,必然报错。
解决方案
根据你的使用场景选择对应写法即可:
场景1:脚本已存在于Jenkins执行节点的文件系统中(和GUI配置场景一致)
直接对应GUI的写法转写为Job DSL语法即可,注意用单引号包裹命令,避免Groovy提前解析Jenkins变量:
steps { shell('/path/to/script ${CHOICE_PARAMETER_VALUE}') }
这里的${CHOICE_PARAMETER_VALUE}会在作业实际运行时由Jenkins替换为用户选择的参数值,和GUI配置效果完全一致。
场景2:需要读取Job DSL工作区的脚本文件内联执行(必须使用readFileFromWorkspace的场景)
如果你的build.sh是存放在Job DSL执行时的工作区,需要读取内容作为内联脚本执行,可以用bash -s配合here-doc的方式将Jenkins变量作为位置参数传入脚本:
steps { shell('bash -s ${CHOICE_PARAMETER_VALUE} <<\'EOF\'\n' + readFileFromWorkspace('build.sh') + '\nEOF') }
逻辑说明:
bash -s表示从标准输入读取脚本内容,后续追加的内容会作为位置参数(对应脚本内的$1/$2...)传递给脚本<<'EOF'格式的here-doc会原样包裹读取到的脚本内容,避免脚本内的特殊字符被意外转义- 单引号包裹的
${CHOICE_PARAMETER_VALUE}不会被Groovy提前解析,会留到作业运行时由Jenkins替换为实际值
如果需要传递多个参数,按顺序在bash -s后追加变量即可:
shell('bash -s ${PARAM1} ${PARAM2} ${PARAM3} <<\'EOF\'\n' + readFileFromWorkspace('build.sh') + '\nEOF')
内容的提问来源于stack exchange,提问作者mel
相关产品推荐
相关产品推荐

