如何从Jenkins PowerShell脚本更新环境变量

4

你好,试图从Powershell脚本中的stage更新jenkins环境变量

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
            }
        }
    }
}

我可以访问值但无法更改它们,作用域仅限于PowerShell吗?

1个回答

7

按照设计,子Shell 无法修改其父Shell的环境。每次在Jenkinsfile中调用powershellshbat步骤时,都会生成一个新的子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
}

这是我的问题,我有一个PowerShell模块返回两个值,我需要使用它们,但不想进行文件操作。 - Ganesh
2
你忘记了 powershell(returnStdout: true,... 的结尾括号 ) - Trisped
@Trisped 好的,谢谢提醒!我已经纠正了。 - Dibakar Aditya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接