4

我们有一个 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-ipsum
  • 吃货
  • 坐坐
  • 富美特
  • 巴洛雷姆
  • bar-ipsum
  • 酒吧多尔
  • 酒吧坐
  • 酒吧
  • 巴兹洛雷姆
  • baz-ipsum
  • 巴兹多洛尔
  • 坐坐
  • 巴兹阿梅特

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

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

4

1 回答 1

2

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

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

- 工作模板:
    名称:'build-{name}'
    默认值:全局
    禁用:'{obj:disabled}'

- 项目:
    名称:我的项目
    工作:
      - 'build-{name}'

- 项目:
    名称:mydeadproject
    工作:
      - 'build-{name}':
          禁用:真

注意 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 已禁用
  • 启用构建我的项目

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

--- 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. jobNameFirstSegmentIE。它禁用作业:

  • 富美特
  • 吃货
  • foo-ipsum
  • 傻瓜
  • 坐坐

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

于 2015-09-08T08:17:00.100 回答