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

Posted

技术标签:

【中文标题】詹金斯 - 在工作之间传递变量?【英文标题】:Jenkins - passing variables between jobs? 【发布时间】:2012-03-31 01:44:21 【问题描述】:

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

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

【问题讨论】:

我们可以使用这么多方法:一种最好的方法是使用当前作业参数,或者使用触发下游作业中的预定义参数 这个标题太混乱了。这是如何“在工作之间传递变量?”。也接受的答案是插件。太棒了! 【参考方案1】:

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

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

【讨论】:

您好,很抱歉听起来像个菜鸟,但是如果有人可以编辑它并详细说明如何使用参数化触发器插件来完成它,可以吗? 旁注:在 bash 脚本部分中创建的导出环境变量看起来不符合替换输出参数的条件(例如,'export VERSION' 不会使 'UPSTREAM_VERSION=$VERSION'取正确的值;它只是得到 '$VERSION')。 这个答案是不够的 我同意应该有某种示例如何将参数传递给目标作业。当前的参数化触发器插件页面没有提供关于此的良好信息。可能有例如传递参数时应该使用什么样的语法。 该插件似乎不再工作了。请参阅long list of open issues。我不能再用这个插件传递任何参数值了。还有其他解决方案吗?【参考方案2】:

1.Post-Build Actions > 选择“Trigger parameterized build on other projects”

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

详细步骤可以看这里:-

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

希望对你有帮助:)

【讨论】:

这个答案满足了 OP 提出的问题,不需要插件或使用 DSL。 仅供参考,这个答案仍然需要插件。 插件很棒,但是它不能传递在执行shell命令部分中设置的变量值。【参考方案3】:

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

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

【讨论】:

这是我需要的。谢谢。 如果您愿意使用 jenkins 2.x 管道,您可以使用 writeFile/stash->unstash/readFile 在作业之间复制状态数据。 slideshare.net/ericlongtx/… Checkout slide 21 为例。 如果您希望 SHELL 变量通过,这是必需的。非常感谢这个答案。【参考方案4】:

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

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

    我使用复制工件插件从当前工作中复制了工件。 在上游作业的后期构建操作中,我添加了诸如“SOURCE_BUILD_NUMBER=$BUILD_NUMBER”之类的变量并将其配置为触发下游作业。 除了我的下游作业无法获得 $SOURCE_BUILD_NUMBER 来创建目录之外,一切正常。 所以我发现要使用这个变量,我必须在下游作业中定义相同的变量作为参数变量,如下图所示:

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

【讨论】:

完全同意。这是一个强制更新,100% 完成了初始答案。 我还尝试了另外两个更受欢迎的选项,但在添加上面第 4 步中概述的额外配置之前,这两个选项都不起作用。我不需要启用复制工件即可工作。【参考方案5】:

(对于谷歌同事)

如果您正在使用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 '------------------------------------'

【讨论】:

Build Flow Plugin 已弃用,用户应迁移至wiki.jenkins-ci.org/display/JENKINS/Pipeline+Plugin【参考方案6】:

除了 Nigel Kirby 的答案之外,只需添加我的答案,因为我还不能发表评论:

为了传递一个动态创建的参数,你也可以在'Execute Shell' tile中导出变量,然后通过'Trigger parameterized build on other projects' => 'Predefined parameters' => give 'YOUR_VAR=$ YOUR_VAR'。我的团队使用此功能将 npm 包版本从构建作业传递到部署作业

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

【讨论】:

【参考方案7】:

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

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

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

构建操作:

执行一个shell脚本 注入环境变量

例如:properties definition

2) 将定义的属性传递给下游作业: 后期构建操作:

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

例如:properties sending

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

/!\詹金斯版本:1.636

/!\ 出于某种原因,在创建触发构建时,需要添加“当前构建参数”选项以传递属性。

【讨论】:

编辑:在我写的内容中发现了一个花絮。在属性定义中,它应该是: echo POM_VERSION=$POM_VERSION > play.properties 而不是: echo $POM_VERSION >> play.properties 抱歉。【参考方案8】:

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

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

【讨论】:

【参考方案9】:

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

管道中的第一个工作

管道中的第二个工作

【讨论】:

基于两个图像和外部链接的答案不是很有帮助的答案【参考方案10】:

我想通了!

经过将近 2 小时的反复试验,我终于搞定了。

这很有效,并且是您将变量传递给远程作业的方法:

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

用\n分隔两个参数,不要有空格..

相对于 参数:'''someparams'''

我们使用 参数:“一些参数”

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

''' ... ''' 或 ' ... ' 不会让我们得到这些值。 (三个单引号或一个单引号)

此处的所有参数都在管道开始处的 environment 块中定义,并在必要时在阶段>步骤>脚本中进行修改。

我也测试了,发现当你使用“...”时,你不能使用类似 ''' ...“...” ''' 或 “... '..'...” 或任意组合...

这里的问题是,当您在参数部分使用“...”时,您不能传递字符串参数;例如,这将不起作用:

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

如果你想传递类似上面的东西,你需要设置一个环境变量 param2='param2' 然后在远程触发插件步骤的参数部分使用 $env.param2

【讨论】:

【参考方案11】:

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

【讨论】:

【参考方案12】:

这可以通过 groovy 函数来完成:

上游 Jenkinsfile - 参数CREDENTIALS_ID 向下传递
pipeline 
    stage 
        steps 
            build job: "my_downsteam_job_name",
            parameters [string(name: 'CREDENTIALS_ID', value: 'other_credentials_id')]
        
    

下游 Jenkinsfile - 如果参数CREDENTIALS_ID 没有从上游传递,函数返回默认值
def getCredentialsId() 
    if(params.CREDENTIALS_ID) 
        return params.CREDENTIALS_ID;
     else 
        return "default_credentials_id";
    

pipeline 
    environment
        TEST_PASSWORD = credentials("$getCredentialsId()")
    

【讨论】:

以上是关于詹金斯 - 在工作之间传递变量?的主要内容,如果未能解决你的问题,请参考以下文章

在 Rails 中的视图之间传递变量

詹金斯全局变量

詹金斯:无法在管道阶段定义变量

詹金斯全局变量

Python 在函数之间传递变量(布尔值)

詹金斯/哈德森环境变量