jenkins - 如何从 jenkins Powershell 脚本更新环境变量
问题描述
您好尝试从阶段编写的 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?
解决方案
按照设计,子 shell 不能修改其父 shell 的环境。在 a 中调用的每个powershell
、sh
或step 都会产生一个新的子 shell 来运行子进程。因此,在这些步骤中声明的任何环境变量都会在子进程结束后立即丢失,并且对管道 Groovy 脚本不可用。bat
Jenkinsfile
目前在 a 中执行此操作的一种方法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
}
推荐阅读
- ios - GPUImage ChromaKeyBlendFilter
- c++ - 如何防止移动切片?
- python - 没有名为“rpytools”的模块?
- angular - 是否可以在 Angular7 中动态创建组件?
- go - 如何在 GO 中创建具有扩展名和属性值的证书签名请求?
- jquery - 仅当 div 包含“someText”时,Jquery 才提交表单
- windows - 错误由于错误而停止(org.apache.kafka.connect.cli.ConnectStandalone)java.lang.NoClassDefFoundError:io/debezium/util/IoUtil
- java - 如何使用 Java 获取 CSRF Token 并将其传递到 Selenium WebDriver 以自动化网站登录功能,防止自动化脚本
- rpa - 当机器人通过 Studio 运行时,Firefox 启动,但通过 Orchestrator IE 启动
- python - 在 Pandas 数据框中检索字符串的特定部分