詹金斯 - 在工作之间传递变量?

时间:2012-03-14 15:12:09

标签: continuous-integration hudson jenkins

我在jenkins有两个工作,两个都需要相同的参数。

如何使用参数运行第一个作业,以便在触发第二个作业时使用相同的参数?

12 个答案:

答案 0 :(得分:66)

您可以使用Parameterized Trigger Plugin将参数从一个任务传递到另一个任务。

您还需要添加从下游传递的上游参数。

答案 1 :(得分:29)

1.Post-Build Actions>选择“在其他项目上触发参数化构建”

2.使用value输入环境变量.Value也可以是Jenkins Build Parameters。

详细步骤见: -

https://itisatechiesworld.wordpress.com/jenkins-related-articles/jenkins-configuration/jenkins-passing-a-parameter-from-one-job-to-another/

希望它有用:)

答案 2 :(得分:18)

这里的accepted answer对我的用例不起作用。我需要能够在一个作业中动态创建参数并将它们传递给另一个作业。正如Mark McKenna提到的那样,似乎无法将变量从shell构建步骤导出到后构建操作。

我使用Parameterized Trigger Plugin通过将值写入文件并使用该文件作为要通过“添加构建后操作”导入的参数来实现解决方法。 - > '触发参数化构建......'然后选择'添加参数' - > '属性文件中的参数'。

答案 3 :(得分:12)

我认为上面的答案需要一些更新:

我试图创建一个动态目录来存储我的上游构建工件,所以我想将我的上游作业构建号传递给下游作业我尝试了上述步骤,但无法使其工作。以下是它的工作原理:

  1. 我使用复制工件插件从当前作业复制了工件。
  2. 在上游作业的后期构建操作中,我添加了变量,如" SOURCE_BUILD_NUMBER = $ {BUILD_NUMBER}"并将其配置为触发下游作业。
  3. 一切正常,但我的下游工作无法获得$ SOURCE_BUILD_NUMBER来创建目录。
  4. 所以我发现使用这个变量我必须在下游作业中定义相同的变量作为参数变量,如下图所示:
  5. enter image description here

    这是因为新版本的jenkins还要求您在下游作业中定义变量。我希望它有所帮助。

答案 4 :(得分:10)

(对于谷歌同行)

如果您使用Build Flow Plugin构建严重的管道,则可以使用DSL在作业之间传递参数:

假设一个可用的字符串参数“CVS_TAG”,以便将其传递给其他作业:

build("pipeline_begin", CVS_TAG: params['CVS_TAG'])
parallel (
   // will be scheduled in parallel.
   { build("pipeline_static_analysis", CVS_TAG: params['CVS_TAG']) },
   { build("pipeline_nonreg", CVS_TAG: params['CVS_TAG']) }
)
// will be triggered after previous jobs complete
build("pipeline_end", CVS_TAG: params['CVS_TAG'])

显示可用变量/参数的提示:

// output values
out.println '------------------------------------'
out.println 'Triggered Parameters Map:'
out.println params
out.println '------------------------------------'
out.println 'Build Object Properties:'
build.properties.each { out.println "$it.key -> $it.value" }
out.println '------------------------------------'

答案 5 :(得分:7)

除了Nigel Kirby之外,我只想添加我的答案,因为我还没有发表评论:

为了传递动态创建的参数,您还可以在'执行Shell'中导出变量。然后将其传递给其他项目的触发器参数化构建' => '预定义参数" =>给'YOUR_VAR = $ YOUR_VAR'。我的团队使用此功能将npm包版本从构建作业传递到部署作业

更新:上面只适用于Jenkins注入的参数,从shell创建的参数仍然需要使用相同的方法。例如。 echo YOU​​R_VAR = $ {YOUR_VAR}> variable.properties并传递该文件下游

答案 6 :(得分:2)

通过阅读答案,我没有看到我喜欢的其他选项也会提供它。我喜欢工作的参数化,但它并不总能很好地扩展。如果您的作业不是直接位于第一个作业的下游,而是位于管道的下游,则您实际上并不想参数化管道中的每个作业,以便能够一直传递参数。或者,如果您有大量其他作业使用的参数(特别是那些不一定与父作业或主作业相关的作业),则参数化也不起作用。

在这些情况下,我倾向于将值输出到属性文件,然后使用EnvInject插件将其注入我需要的任何作业中。这可以动态完成,这是从上面另一个仍然使用参数化作业的答案解决问题的另一种方法。该解决方案在许多情况下都能很好地扩展。

答案 7 :(得分:2)

当我不得不将pom版本传递给下游的Rundeck作业时,我遇到了同样的问题。

我所做的是通过属性文件使用参数注入:

1)通过shell在属性文件中创建属性:

构建行动:

  • 执行shell脚本
  • 注入环境变量

例如:properties definition

2)将定义的属性传递给下游作业: 后期制作行动:

  • 在其他项目上触发参数化构建
  • 添加参数:当前构建参数
  • 添加参数:预定义参数

例如:properties sending

3)然后可以在下游Rundeck作业中使用$ POM_VERSION。

/!\ Jenkins版本:1.636

/!\由于某些原因,在创建触发式构建时,必须添加选项“当前构建参数”。传递属性。

答案 8 :(得分:1)

您可以使用Hudson Groovy builder执行此操作。

管道中的第一份工作

enter image description here

管道中的第二份工作

enter image description here

答案 9 :(得分:0)

在另一篇文章中查看我的回答:

为我工作(必须在两个作业中指定参数,而不仅仅是父作业)

https://stackoverflow.com/a/40348900/2010136

答案 10 :(得分:0)

我知道了!

我花了将近2个小时的反复试验才弄清楚了。

此工作以及您将变量传递到远程作业的工作:

    def handle = triggerRemoteJob(remoteJenkinsName: 'remoteJenkins', job: 'RemoteJob' paramters: "param1=${env.PARAM1}\nparam2=${env.param2}")

使用\ n分隔两个参数,没有空格。

与 参数:'''someparams'''

我们使用 参数:“ someparams”

“ ...”是使我们获得所需变量的值的原因。 (这些是双引号,而不是两个单引号)

'''...'''或'...'不会为我们提供这些值。 (三个单引号或仅一个单引号)

这里的所有参数都在管道的开始处的environment {}块中定义,并在必要时在stage> steps> scripts中进行修改。

我还测试并发现,当您使用“ ...”时,不能使用''... ...“ ...”'''或“ ...'..'...”之类的东西,或者它的任何组合...

这里的要点是,当您在参数部分中使用“ ...”时,无法传递字符串参数。例如,这将不起作用:

    def handle = triggerRemoteJob(remoteJenkinsName: 'remoteJenkins', job: 'RemoteJob' paramters: "param1=${env.PARAM1}\nparam2='param2'")

如果要传递上述类似内容,则需要设置环境变量param2 ='param2',然后在远程触发器插件步骤的参数部分中使用$ {env.param2}

答案 11 :(得分:0)

您还可以将作业写入某处的属性文件,然后让另一个作业读取它。一种方法是通过 EnvInject 插件注入变量。