如何将Jenkins更改的文件列表传递给bash脚本?

utugiqy6  于 2023-08-03  发布在  Jenkins
关注(0)|答案(2)|浏览(89)

我使用this answer获取Jenkins作业中更改的文件列表。我现有的Jenkinsfile看起来像这样:

script {
    sshagent(credentials : ['jenkins-bitbucket-lfs']) {
        sh '''#!/bin/bash
        ./build.sh
        '''
    }
}

字符串
如果我从上面的答案中添加代码,我会得到已更改文件的列表。但我不知道如何将列表一次传递给一个文件。我试过了

script {
    // get the list of changed files
    changedFiles = []
    for (changeLogSet in currentBuild.changeSets) {
        for (entry in changeLogSet.getItems()) { // for each commit in the detected changes
            for (file in entry.getAffectedFiles()) {
                changedFiles.add(file.getPath()) // add changed file to list
            }
        }
    }
    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}
            '''
        }
    }
}


Groovy中报告了文件列表和单个文件,但bash中的参数为空。我怎么才能让它工作?

uubf1zoe

uubf1zoe1#

我觉得是你的语法。Jenkins使用引号的方式对我来说很模糊,但我认为当使用三重引号('''...''')时,你只能访问环境变量,而使用三重双引号("""..."""),你可以访问脚本中的每个变量(在同一作用域中声明)。

hec6srdp

hec6srdp2#

据我所知,groovy生成的变量在shell环境中是不能直接访问的。您需要使用脚本块 Package 它们,或者通过定义全局变量来存储它们。你也可以把它们放到一个临时文本文件中,然后用shell命令从那里读取。这个例子是这样的

stages {
            stage('configure'){
                steps{
                    script{
                    env.deployBranch = sh(script:'''echo $branch''', returnStdout: true).trim()
                    env.deployService = sh(script:'''echo $service''', returnStdout: true).trim()
                    echo """${env.deployBranch}"""
                    }
                }
            }

字符串
然后使用定义的变量传递到shell中。

相关问题