首页 > 解决方案 > 在同一个 repo 中对两个不同的作业使用相同的 Jenkinsfile

问题描述

我有两个单独的 Jenkins 作业,它们将在一个存储库上运行:我的 Jenkinsfile 有一个步骤将在启用此属性的情况下运行:enableZeroDownTime. 第二个 Jenkins 作业的目的是在enableZeroDownTime禁用此属性的情况下运行该步骤。有谁知道我如何使用相同的 Jenkinsfile 来控制它?我可以使用基于任何属性文件的一些参数来传递它吗?我真的很困惑。

stage('CreateCustomer') {
            steps {
                script {
                   common.runStage("@CreateCustomer")
                   common.runStage("@SetOnboardingCustomerManifest")
                   common.runStage("@enableZeroDownTime")
                }
            }
        }

标签: jenkinsjenkins-plugins

解决方案


解决方案

我目前运行多个使用相同 Jenkinsfile 的管道。有条件地执行阶段的更改是微不足道的。

stage('CreateCustomer') {
   when {
      environment name: 'enableZeroDownTime', value: 'true'
   }

   steps {
      script {
         common.runStage("@CreateCustomer")
         common.runStage("@SetOnboardingCustomerManifest")
         common.runStage("@enableZeroDownTime")
       }
   }
}

CreateCustomer阶段只会在 enableZeroDownTime 参数设置为 true 时运行(可以是值为 true 的字符串参数,也可以是布尔参数)。

这里的技巧是你不能parameters{}块添加到你的声明性管道中。例如,如果您有以下情况

parameters {
    string(name: 'enableZeroDownTime', defaultValue: 'true') 
}

两个管道都将默认为 true。如果您有以下情况

parameters {
    string(name: 'enableZeroDownTime', defaultValue: '') 
}

两个管道都将默认为空白默认值。

即使您在创建后手动将不同的默认值保存到管道中,下次运行时也会使用空白默认值覆盖它。

相反,您只需parameters{}完全删除该块并通过 Web 界面手动添加参数

通过 Web 交互参数化 Jenkins 管道

此外...

此外,可以让两个管道使用具有不同参数的相同 Jenkinsfile。例如,假设管道 A 有一个默认为 true 的enableZeroDownTime参数,而管道 B 根本没有参数。在这种情况下,您可以添加一个同名的环境变量并将值设置为等于以下三元表达式

environment {
    enableZeroDownTime = "${params.enableZeroDownTime != null ? "${params.enableZeroDownTime}" : false}"
}

然后,您可以在 when 声明性(或管道中的任何位置)中引用此参数,而不必担心管道会引发空指针异常。


推荐阅读