【问题标题】:How to override an attribute for a specific job when working with Jenkins Job Builder (JJB)使用 Jenkins Job Builder (JJB) 时如何覆盖特定作业的属性
【发布时间】:2015-09-07 16:13:09
【问题描述】:

我们有一个 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-amet
  • bar-lorem
  • bar-ipsum
  • bar-dolor
  • 酒吧坐
  • bar-amet
  • baz-lorem
  • baz-ipsum
  • baz-dolor
  • 坐坐
  • 巴兹阿梅特

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

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

【问题讨论】:

标签: jenkins jenkins-job-builder


【解决方案1】:

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

- 默认值: 名称:全球 禁用:假 - 工作模板: 名称:'build-{name}' 默认值:全局 禁用:'{obj:disabled}' - 项目: 名称:我的项目 工作: - 'build-{name}' - 项目: 名称:mydeadproject 工作: - 'build-{name}': 禁用:真

注意 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

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

  • build-mydeadproject 已禁用
  • build-myproject 已启用

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

--- 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。 IE。它会禁用作业:

  • foo-amet
  • 美食家
  • foo-ipsum
  • foo-lorem
  • 坐坐

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

【讨论】:

  • disabled: '{obj:disabled}' 帮我解决了我的问题
猜你喜欢
  • 2016-10-03
  • 1970-01-01
  • 2022-11-12
  • 1970-01-01
  • 1970-01-01
  • 2019-09-12
  • 2011-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多