如何将Jenkins中变更文件列表逐个传递给Bash构建脚本?
解决Jenkinsfile中Groovy变量无法传递给Bash脚本的问题
问题原因
Groovy中用三重单引号(''')包裹的字符串是原始字符串,不会对其中的变量做插值处理。你在Bash脚本里写的${item}是Bash自身的变量,而这个变量在Bash环境中未定义,所以输出为空。
解决方案
有两种可靠的方式可以将Groovy变量传递给Bash脚本:
方式1:使用Groovy三重双引号字符串插值
把Bash脚本用三重双引号(""")包裹,Groovy会先将${item}替换为实际的文件路径,再传递给Bash执行。同时为避免文件名含特殊字符导致Bash解析错误,要给参数加上双引号:
changedFiles.eachWithIndex { item, idx -> echo "Changed file ${idx}: ${item}\n" sh """#!/bin/bash echo "Changed file = \"${item}\"" ./build.sh "${item}" """ }
方式2:通过环境变量传递
将Groovy变量设置为Bash的环境变量,在脚本中引用环境变量,这种方式更安全,尤其适合处理含空格、特殊字符的文件名:
changedFiles.eachWithIndex { item, idx -> echo "Changed file ${idx}: ${item}\n" sh '''#!/bin/bash echo "Changed file = $CHANGED_FILE" ./build.sh "$CHANGED_FILE" ''' env: [CHANGED_FILE: item] }
修改后的完整Jenkinsfile
以下是使用方式1的完整代码:
script { // 获取变更文件列表 changedFiles = [] for (changeLogSet in currentBuild.changeSets) { for (entry in changeLogSet.getItems()) { // 遍历每个提交 for (file in entry.getAffectedFiles()) { changedFiles.add(file.getPath()) // 添加到列表 } } } echo "Changed files: ${changedFiles}\n" sshagent(credentials : ['jenkins-bitbucket-lfs']) { changedFiles.eachWithIndex { item, idx -> echo "Changed file ${idx}: ${item}\n" sh """#!/bin/bash echo "Changed file = \"${item}\"" ./build.sh "${item}" """ } } }
内容的提问来源于stack exchange,提问作者parsley72
相关产品推荐
相关产品推荐

