使用 Jenkins Job Builder (JJB) 时如何覆盖特定作业的属性

mos*_*ted 5 jenkins jenkins-job-builder

我们有一个 Jenkins 设置(目前未使用 Jenkins Job Builder 进行管理),其中每个 Web 项目都有 5 个非常相似的 Jenkins 作业。这是一个简化的 Jenkins Job Builder yaml 文件,可以满足我们的需求:

- defaults:
    name: global
    project-type: 'freestyle'
    disabled: false
    buildTargets: 'build'
- job-template:
    name: '{jobNameFirstSegment}-{jobNameSecondSegment}'
    defaults: global
    builders:
      - ant:
          targets: '{buildTargets}'
          buildfile: 'build.xml'
- project:
    name: lorem
    jobNameFirstSegment:
      - foo:
          displayNameFirstSegment: 'Foo'
          urlGitRepository: 'git@bitbucket.org:mycompany/foo.git'
      - bar:
          displayNameFirstSegment: 'Bar'
          urlGitRepository: 'git@bitbucket.org:mycompany/bar.git'
      - baz:
          displayNameFirstSegment: 'Baz'
          urlGitRepository: 'git@bitbucket.org:mycompany/baz.git'
    jobNameSecondSegment:
      - lorem:
          buildTargets: 'build-lorem'
      - ipsum:
          buildTargets: 'build-ipsum'
      - dolor:
          buildTargets: 'build-dolor'
      - sit:
          buildTargets: 'build-sit'
      - amet:
          buildTargets: 'build-amet'
    jobs:
      - '{jobNameFirstSegment}-{jobNameSecondSegment}'
Run Code Online (Sandbox Code Playgroud)

此 yaml 文件会生成 15 个 Jenkins 作业 - 所有作业均未禁用:

  • 福洛雷姆
  • foo-ipsum
  • 食物多洛尔
  • 坐坐
  • 富阿梅特
  • 巴尔洛雷姆
  • 巴伊普苏姆
  • 酒吧多洛尔
  • 酒吧坐
  • 巴阿梅特
  • 巴兹洛雷姆
  • 巴兹伊普苏姆
  • 巴兹多洛尔
  • 巴兹坐
  • 巴扎阿梅特

这种设置是否可以禁用特定的 Jenkins 作业?我无法找到如何覆盖例如 Jenkins 作业“foo-lorem”的“禁用”属性。如何才能实现这一目标?

事实上,如果需要,我们需要能够覆盖任何 Jenkins 作业的任何属性。这可行吗?如何?

Ant*_*sso 2

在作业模板中,您想要添加一个disabled从参数获取其值的属性。defaults参数默认值可在和级别设置project。所以理论上你可以在工作级别传递残疾人值:

- 默认值:
    名称:全球
    禁用:假

- 工作模板:
    名称:'构建-{名称}'
    默认值:全局
    禁用:'{obj:禁用}'

- 项目:
    名称:我的项目
    工作:
      - '构建-{名称}'

- 项目:
    名称: mydeadproject
    工作:
      - '构建-{名称}':
          禁用:真

注意 obj: 前缀是按原样传递布尔值。结果发现 JJB 中存在特定于参数的问题disabled,因此您需要使用不同的变量(我prevent_run在下面命名它):

- defaults:
    name: global
    prevent_run: false

- job-template:
    name: 'build-{name}'
    defaults: global
    disabled: '{obj:prevent_run}'

- project:
    name: myproject
    jobs: 
      - 'build-{name}'

- project:
    name: mydeadproject
    jobs:
      - 'build-{name}':
          prevent_run: true
Run Code Online (Sandbox Code Playgroud)

在全局默认情况下,变量 Prevent_run 设置为 false 并传递到项目和作业模板。对于最后一个作业,将更具体的值传递给 mydeadproject。上面的代码片段生成了两个作业:

  • 禁用 build-mydeadproject
  • 启用构建我的项目

您可以在示例模板中重复使用相同的技巧:

--- reference.yaml  2015-09-08 09:27:56.000000000 +0200
+++ foo.yaml    2015-09-08 10:02:38.000000000 +0200
@@ -1,11 +1,13 @@
 - defaults:
     name: global
     project-type: 'freestyle'
-    disabled: false
+    prevent_run: false
     buildTargets: 'build'
+
 - job-template:
     name: '{jobNameFirstSegment}-{jobNameSecondSegment}'
     defaults: global
+    disabled: '{obj:prevent_run}'
     builders:
       - ant:
Run Code Online (Sandbox Code Playgroud)

然后,您可以prevent_run: true根据每个作业传递:

- project:
    name: lorem
    jobNameFirstSegment:
      - foo:
          displayNameFirstSegment: 'Foo'
          urlGitRepository: 'git@bitbucket.org:mycompany/foo.git'
          prevent_run: true
Run Code Online (Sandbox Code Playgroud)

foo这会禁用具有的值的所有作业jobNameFirstSegment。IE。它会禁用以下作业:

  • 富阿梅特
  • 食物多洛尔
  • foo-ipsum
  • 福洛雷姆
  • 坐坐

当一个项目实现时,会创建变量的笛卡尔积来生成作业。这里无法将参数传递给特定的值对。