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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 07:04:56