如何从jenkins Powershell脚本更新Env vars

时间:2020-07-28 16:15:45

标签: 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
            }
        }
    }
}

我可以访问值,但不能更改它们,Scope是否仅限于Powershell?

1 个答案:

答案 0 :(得分:2)

通过设计,子Shell无法修改其父Shell的环境。在powershell中调用的每个shbatJenkinsfile步骤都会产生一个新的子Shell,以运行子进程。因此,在子步骤结束时,在这些步骤中声明的所有环境变量都会丢失,并且对于管道Groovy脚本不可用。

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

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

很明显,这种方法有严重的局限性,因为您一次只能运行一个命令,并且也只能在返回适当的输出用作变量的情况下运行。

另一种方法是将值写入文件,然后使用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
}