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

时间:2015-09-07 16:13:10

标签: 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}'

这个yaml文件导致15个Jenkins作业 - 所有这些都没有被禁用:

  • FOO-LOREM
  • FOO-ipsum的
  • FOO-悲
  • FOO-坐
  • FOO-阿梅特
  • 杆LOREM
  • 杆ipsum的
  • 杆悲
  • 杆坐
  • 杆阿梅特
  • 巴兹-LOREM
  • 巴兹-ipsum的
  • 巴兹-悲
  • 巴兹-坐
  • 巴兹-阿梅特

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

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

1 个答案:

答案 0 :(得分:1)

在作业模板中,您希望添加一个disabled属性,该属性从参数中获取其值。参数默认值可以设置为defaultsproject级别。因此理论上你可以在工作级别传递禁用值:

- defaults:
    name: global
    disabled: false

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

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

- project:
    name: mydeadproject
    jobs:
      - 'build-{name}':
          disabled: true

注意obj:prefix是按原样传递布尔值。事实证明,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

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

  • build-mydeadproject disabled
  • build-myproject enabled

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

--- 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:

然后,您可以按工作传递prevent_run: true

- project:
    name: lorem
    jobNameFirstSegment:
      - foo:
          displayNameFirstSegment: 'Foo'
          urlGitRepository: 'git@bitbucket.org:mycompany/foo.git'
          prevent_run: true

禁用foo值为jobNameFirstSegment的所有作业。 I. e。它会禁用作业:

  • FOO-阿梅特
  • FOO-悲
  • FOO-ipsum的
  • FOO-LOREM
  • FOO-坐

实现项目时,会创建变量的笛卡尔积以生成作业。这里没有办法将参数传递给特定的值。