如何从 jenkins Powershell 脚本更新环境变量

Gan*_*esh 4 jenkins jenkins-pipeline

您好尝试从阶段编写的 Powershell 脚本更新 jenkins Env 变量

pipeline {
    agent { label 'master' }
    environment {
        def var1    = "default_value"
        def var2    = "default var 2"
    }
    stages {
        stage ('step-1') {
            steps {
                script { 
                    powershell (returnStdout: true, script: '''
                        ${env:var1} = "changed from powershell"
                        ${env:var2} = "var2 changed from powershell"
                    ''').trim()
                }
            }
        }
        stage ("step-2"){
            steps {
                echo var1
                echo var2
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以访问值但无法更改相同的值,范围是否仅限于 Powershell?

Dib*_*tya 7

根据设计,子 shell 无法修改其父 shell 的环境。在 a 中调用的每个powershellsh或步骤都会生成一个新的子 shell 来运行子进程。因此,一旦子进程结束,这些步骤中声明的任何环境变量都会丢失,并且不可用于管道 Groovy 脚本。batJenkinsfile

当前在 a 中执行此操作的一种方法Jenkinsfile是将stdout子 shell 的 分配给 Groovy 脚本本身中的变量。

script {
    env.var1 = powershell(returnStdout: true, script: '<single command>').trim()
}
Run Code Online (Sandbox Code Playgroud)

显然,这种方法有严重的局限性,因为您一次只能运行一个命令,而且只有它返回一个适当的输出以用作变量时也是如此。

另一种方法是将值写入文件,然后使用 Groovy 脚本读取这些值以设置管道下游的环境变量。

编辑

根据您的评论,如果您stdout返回两个不同的值作为字符串,您可以尝试将它们解析为单独的值。例如:

script {
    def output = powershell(returnStdout: true, script: '''
        <command1>
        <command2>
    ''')
    println(output)
    /*Prints:
    value1
    value2
    */
    env.var1 = output.tokenize('\n')[0].trim()  \\value1
    env.var2 = output.tokenize('\n')[1].trim()  \\value2
}
Run Code Online (Sandbox Code Playgroud)

  • 您缺少“powershell(returnStdout: true,...”的结束符“)” (2认同)