Jenkins作业生成器:如何正确地从外部文件中包含作业模板?

Jenkins作业生成器:如何正确地从外部文件中包含作业模板?,jenkins,jenkins-job-builder,Jenkins,Jenkins Job Builder,我正在调查使用(来自OpenStack)作为管理jenkins作业配置的方法。在这样做的过程中,我试图找出正确(最佳?)的方法,使用从外部文件中包含作业模板!包括自定义标记 在当前的用例中,我们将基本上有一个模板,它将被很多工作使用。每个作业都需要存在于它自己的文件中,原因不在这里 到目前为止,我已经做到了: 作业模板.yml name: 'pre-build-{proj}-{repo}' project-type: freestyle ... etc ... - job-template:

我正在调查使用(来自OpenStack)作为管理jenkins作业配置的方法。在这样做的过程中,我试图找出正确(最佳?)的方法,使用
从外部文件中包含作业模板!包括
自定义标记

在当前的用例中,我们将基本上有一个模板,它将被很多工作使用。每个作业都需要存在于它自己的文件中,原因不在这里

到目前为止,我已经做到了:

作业模板.yml

name: 'pre-build-{proj}-{repo}'
project-type: freestyle
... etc ...
- job-template:
    !include job-template.yml

- project: 
    name: job-1
    proj: my-proj
    repo: my-repo
    jobs:
      - 'build-config-{proj}-{repo}'
- job-template:
    name: 'pre-build-{proj}-{repo}'
    project-type: freestyle
    ... etc ...
!include job-template.yml

- project: 
    name: job-1
    proj: my-proj
    repo: my-repo
    jobs:
      - 'build-config-{proj}-{repo}'
- job-template:
    name: 'pre-build-{proj}-{repo}'
    builders:
        - shell: 'echo building {proj} for {repo}'
- project:
    name: job-1
    proj: my-proj
    repo: my-repo
    jobs:
        - 'pre-build-{proj}-{repo}'
- project:
    name: job-2
    proj: my-other-proj
    repo: my-other-repo
    jobs:
        - 'pre-build-{proj}-{repo}'
job-1.yml

name: 'pre-build-{proj}-{repo}'
project-type: freestyle
... etc ...
- job-template:
    !include job-template.yml

- project: 
    name: job-1
    proj: my-proj
    repo: my-repo
    jobs:
      - 'build-config-{proj}-{repo}'
- job-template:
    name: 'pre-build-{proj}-{repo}'
    project-type: freestyle
    ... etc ...
!include job-template.yml

- project: 
    name: job-1
    proj: my-proj
    repo: my-repo
    jobs:
      - 'build-config-{proj}-{repo}'
- job-template:
    name: 'pre-build-{proj}-{repo}'
    builders:
        - shell: 'echo building {proj} for {repo}'
- project:
    name: job-1
    proj: my-proj
    repo: my-repo
    jobs:
        - 'pre-build-{proj}-{repo}'
- project:
    name: job-2
    proj: my-other-proj
    repo: my-other-repo
    jobs:
        - 'pre-build-{proj}-{repo}'

这似乎是错误的,因为模板定义在这两个文件中被拆分,并且需要在每个作业文件中不必要地复制
-job template:
行。我想让以下各项发挥作用:

作业模板.yml

name: 'pre-build-{proj}-{repo}'
project-type: freestyle
... etc ...
- job-template:
    !include job-template.yml

- project: 
    name: job-1
    proj: my-proj
    repo: my-repo
    jobs:
      - 'build-config-{proj}-{repo}'
- job-template:
    name: 'pre-build-{proj}-{repo}'
    project-type: freestyle
    ... etc ...
!include job-template.yml

- project: 
    name: job-1
    proj: my-proj
    repo: my-repo
    jobs:
      - 'build-config-{proj}-{repo}'
- job-template:
    name: 'pre-build-{proj}-{repo}'
    builders:
        - shell: 'echo building {proj} for {repo}'
- project:
    name: job-1
    proj: my-proj
    repo: my-repo
    jobs:
        - 'pre-build-{proj}-{repo}'
- project:
    name: job-2
    proj: my-other-proj
    repo: my-other-repo
    jobs:
        - 'pre-build-{proj}-{repo}'
job-1.yml

name: 'pre-build-{proj}-{repo}'
project-type: freestyle
... etc ...
- job-template:
    !include job-template.yml

- project: 
    name: job-1
    proj: my-proj
    repo: my-repo
    jobs:
      - 'build-config-{proj}-{repo}'
- job-template:
    name: 'pre-build-{proj}-{repo}'
    project-type: freestyle
    ... etc ...
!include job-template.yml

- project: 
    name: job-1
    proj: my-proj
    repo: my-repo
    jobs:
      - 'build-config-{proj}-{repo}'
- job-template:
    name: 'pre-build-{proj}-{repo}'
    builders:
        - shell: 'echo building {proj} for {repo}'
- project:
    name: job-1
    proj: my-proj
    repo: my-repo
    jobs:
        - 'pre-build-{proj}-{repo}'
- project:
    name: job-2
    proj: my-other-proj
    repo: my-other-repo
    jobs:
        - 'pre-build-{proj}-{repo}'
后者不幸导致
-project:
行出现yaml解析错误:

yaml.scanner.ScannerError:此处不允许映射值 在“job-1.yml”第3行第10列中


有没有办法将整个模板定义放入模板文件中?如果我们需要从多个文件中提取多个模板,这将变得特别烦人。

Jenkins jobs使用一个
路径
参数,该参数可以是保存文件的目录(
job-template.yaml
job-1.yaml
job-2.yaml
。它将它们组合为单个yaml文档,因此您不需要使用
!include
。因此您可以编写:

作业模板。yaml

name: 'pre-build-{proj}-{repo}'
project-type: freestyle
... etc ...
- job-template:
    !include job-template.yml

- project: 
    name: job-1
    proj: my-proj
    repo: my-repo
    jobs:
      - 'build-config-{proj}-{repo}'
- job-template:
    name: 'pre-build-{proj}-{repo}'
    project-type: freestyle
    ... etc ...
!include job-template.yml

- project: 
    name: job-1
    proj: my-proj
    repo: my-repo
    jobs:
      - 'build-config-{proj}-{repo}'
- job-template:
    name: 'pre-build-{proj}-{repo}'
    builders:
        - shell: 'echo building {proj} for {repo}'
- project:
    name: job-1
    proj: my-proj
    repo: my-repo
    jobs:
        - 'pre-build-{proj}-{repo}'
- project:
    name: job-2
    proj: my-other-proj
    repo: my-other-repo
    jobs:
        - 'pre-build-{proj}-{repo}'
job1.yaml

name: 'pre-build-{proj}-{repo}'
project-type: freestyle
... etc ...
- job-template:
    !include job-template.yml

- project: 
    name: job-1
    proj: my-proj
    repo: my-repo
    jobs:
      - 'build-config-{proj}-{repo}'
- job-template:
    name: 'pre-build-{proj}-{repo}'
    project-type: freestyle
    ... etc ...
!include job-template.yml

- project: 
    name: job-1
    proj: my-proj
    repo: my-repo
    jobs:
      - 'build-config-{proj}-{repo}'
- job-template:
    name: 'pre-build-{proj}-{repo}'
    builders:
        - shell: 'echo building {proj} for {repo}'
- project:
    name: job-1
    proj: my-proj
    repo: my-repo
    jobs:
        - 'pre-build-{proj}-{repo}'
- project:
    name: job-2
    proj: my-other-proj
    repo: my-other-repo
    jobs:
        - 'pre-build-{proj}-{repo}'
job2.yaml

name: 'pre-build-{proj}-{repo}'
project-type: freestyle
... etc ...
- job-template:
    !include job-template.yml

- project: 
    name: job-1
    proj: my-proj
    repo: my-repo
    jobs:
      - 'build-config-{proj}-{repo}'
- job-template:
    name: 'pre-build-{proj}-{repo}'
    project-type: freestyle
    ... etc ...
!include job-template.yml

- project: 
    name: job-1
    proj: my-proj
    repo: my-repo
    jobs:
      - 'build-config-{proj}-{repo}'
- job-template:
    name: 'pre-build-{proj}-{repo}'
    builders:
        - shell: 'echo building {proj} for {repo}'
- project:
    name: job-1
    proj: my-proj
    repo: my-repo
    jobs:
        - 'pre-build-{proj}-{repo}'
- project:
    name: job-2
    proj: my-other-proj
    repo: my-other-repo
    jobs:
        - 'pre-build-{proj}-{repo}'
这将使用以下shell命令生成两个作业:

预构建我的其他项目我的其他回购:

<command>echo building my-other-proj for my-other-repo</command>
或者使用
name
参数筛选将实现的作业:

jenkins-jobs-test-config/-o/tmp/myjobs'*myproj*'
#创建预构建我的项目我的回购
#跳过预构建我的其他项目我的其他回购