是否可以覆盖作业 DSL 参数?

Is it possible to override a Job DSL parameter?

我们使用 Jenkins Job DSL 插件在代码中配置我们的所有作业,并且经常使用本地 Jenkins 暂存环境在部署更改之前进行测试。我们不希望整个数百个工作开始在本地构建,但我们确实希望确保 DSL 有效并且所有工作都正确创建。

有没有办法覆盖 triggerscm 参数,使其在我们所有的 groovy 文件中在本地成为空操作?我相信我可以编写一个执行此操作的自定义库文件,但随后我必须向每个 groovy 文件添加一个导入行以导入我们的自定义 scm 定义,这并不理想。

澄清一下,我正在寻找一种方法来优雅地或通过猴子修补代码来覆盖某些定义,这样我们就不必要求更改每个 groovy 文件和作业定义,其中有很多。

您可以构建作业并对其进行配置disabled

job('example') {
    disabled()
}

然后您可以激活您要手动测试的作业。

同样的方法也适用于其他工作类型。

对我有用的是:

  1. 添加一个 returns true/false 的函数,这取决于它是 运行 在生产环境还是测试环境中,基于当前的主机名。例如。我有生产实例 运行 作为 jenkins.mydomain.com,测试 jenkins 作为 jenkins-test.mydomain.com.
  2. 根据
  3. 在作业定义中添加if/then/else

例如像这样:

将其放入 JenkinsInstance.groovy:

import jenkins.model.*

// Representing the Jenkins server instance
class JenkinsInstance {
    // Determine if we're executing on a Jenkins production instance.
    static Boolean isProd() {
        if (Jenkins.getInstance().getRootUrl() ==~ ".*jenkins\.mydomain\..*") {
          return true
        } else {
          return false
        }
    }
}

创建工作的 DSL 脚本如下所示

import JenkinsInstance

freeStyleJob("myjobname") {
  if (JenkinsInstance.isProd()) {
    scm {
       git {
       ...
       }
    }
  } else {
    scm {
    }
  }
}

如果要确保 DSL 有效,请编写一些单元测试。您可以查看一些示例 or here. Especially this test will tell you, if everything can be generated without any issues. If you want to generate them locally anyway to test if the build itself completes, you can use a system groovy script after your SeedJob generated all the configurations, to disable all automatic triggers. Here 是有关如何执行此操作的示例。