如何在声明性Jenkins管道中的阶段之间传递变量?
如何在声明性管道中的阶段之间传递变量 在脚本化管道中,我收集的过程是写入临时文件,然后将文件读入变量 如何在声明性管道中实现这一点 例如,我希望根据shell操作创建的变量触发不同作业的生成如何在声明性Jenkins管道中的阶段之间传递变量?,jenkins,jenkins-pipeline,Jenkins,Jenkins Pipeline,如何在声明性管道中的阶段之间传递变量 在脚本化管道中,我收集的过程是写入临时文件,然后将文件读入变量 如何在声明性管道中实现这一点 例如,我希望根据shell操作创建的变量触发不同作业的生成 stage("stage 1") { steps { sh "do_something > var.txt" // I want to get var.txt into VAR } } stage("stage 2") { steps {
stage("stage 1") {
steps {
sh "do_something > var.txt"
// I want to get var.txt into VAR
}
}
stage("stage 2") {
steps {
build job: "job2", parameters[string(name: "var", value: "${VAR})]
}
}
如果要使用文件(因为脚本是生成所需值的工具),可以使用readFile
,如下所示。如果没有,请将sh
与script
选项一起使用,如下所示:
// Define a groovy local variable, myVar.
// A global variable without the def, like myVar = 'initial_value',
// was required for me in older versions of jenkins. Your mileage
// may vary. Defining the variable here maybe adds a bit of clarity,
// showing that it is intended to be used across multiple stages.
def myVar = 'initial_value'
pipeline {
agent { label 'docker' }
stages {
stage('one') {
steps {
echo "1.1. ${myVar}" // prints '1.1. initial_value'
sh 'echo hotness > myfile.txt'
script {
// OPTION 1: set variable by reading from file.
// FYI, trim removes leading and trailing whitespace from the string
myVar = readFile('myfile.txt').trim()
}
echo "1.2. ${myVar}" // prints '1.2. hotness'
}
}
stage('two') {
steps {
echo "2.1 ${myVar}" // prints '2.1. hotness'
sh "echo 2.2. sh ${myVar}, Sergio" // prints '2.2. sh hotness, Sergio'
}
}
// this stage is skipped due to the when expression, so nothing is printed
stage('three') {
when {
expression { myVar != 'hotness' }
}
steps {
echo "three: ${myVar}"
}
}
}
}
简单地说:
pipeline {
parameters {
string(name: 'custom_var', defaultValue: '')
}
stage("make param global") {
steps {
tmp_param = sh (script: 'most amazing shell command', returnStdout: true).trim()
env.custom_var = tmp_param
}
}
stage("test if param was saved") {
steps {
echo "${env.custom_var}"
}
}
}
我有一个类似的问题,因为我希望一个特定的管道提供变量,而其他许多管道使用它来获取这些变量 我创建了一个my set env variables管道
script
{
env.my_dev_version = "0.0.4-SNAPSHOT"
env.my_qa_version = "0.0.4-SNAPSHOT"
env.my_pp_version = "0.0.2"
env.my_prd_version = "0.0.2"
echo " My versions [DEV:${env.my_dev_version}] [QA:${env.my_qa_version}] [PP:${env.my_pp_version}] [PRD:${env.my_prd_version}]"
}
我可以在另一个管道中重用这些变量,即我的set env variables测试
script
{
env.dev_version = "NOT DEFINED DEV"
env.qa_version = "NOT DEFINED QA"
env.pp_version = "NOT DEFINED PP"
env.prd_version = "NOT DEFINED PRD"
}
stage('inject variables') {
echo "PRE DEV version = ${env.dev_version}"
script
{
def variables = build job: 'my-set-env-variables'
def vars = variables.getBuildVariables()
//println "found variables" + vars
env.dev_version = vars.my_dev_version
env.qa_version = vars.my_qa_version
env.pp_version = vars.my_pp_version
env.prd_version = vars.my_prd_version
}
}
stage('next job') {
echo "NEXT JOB DEV version = ${env.dev_version}"
echo "NEXT JOB QA version = ${env.qa_version}"
echo "NEXT JOB PP version = ${env.pp_version}"
echo "NEXT JOB PRD version = ${env.prd_version}"
}
您也可以使用
def myVar
,然后将其与echo${myVar}
一起使用,如果您想将配置放在文件的顶部;)写入文件不是很邪恶,也会创建不需要的diskio吗?你是对的@Dirkos,但是有一种更好的方法来实现请求,而不涉及文件读/写。看到这个答案,我将从另一个答案重新发布我的评论,但我建议在第二阶段使用with env
包装器,以便您可以在sh
的上下文中使用该变量。否则,它将打印一个空字符串。Jenkins 2.124至少是这样。@ConradB只要在并行阶段之前设置变量(在上面的示例中,阶段“三”是您需要并行完成工作的地方),在这里使用该技术应该可以很好地工作。对于写和读部分,有shash/unstash。顺便说一句,使用,根据@KatieS指向的文档,参数{}组中定义的参数被访问为${params.custom_var},而不是${env.custom_var}。两者都可以工作,但是是一个不同的变量,可以包含不同的值。但是您使用参数{}bloc的解决方案对我来说很好,我通过${params.custom_var}访问它们,我错了。参数{}用于所使用的提供的参数,并且似乎是不可变的,尝试在管道中设置它们(除了在参数{}中为它们指定默认值之外)将使阶段失败,而不会出现任何错误消息。因此,env.custom_var是一个不错的选择。在这种情况下,可以省略参数{}块。这在多个Jenkins文件中起作用。我试图做的是将repo上的最新提交从build.JenksinsFile传递到deploy.JenkinsFile?是否在参数中插入类似${workspace}的内容?类似字符串(名称:“custom_var”,默认值:“${workspace}/a”)不确定这将如何工作。我不认为不使用“脚本”步骤就可以直接在“步骤”块中设置变量。