你好,尝试通过阶段编写的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?
答案 0 :(得分:2)
通过设计,子Shell无法修改其父Shell的环境。在powershell
中调用的每个sh
,bat
或Jenkinsfile
步骤都会产生一个新的子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
}