Jenkins Job-Builder:如何正确地包含外部文件中的作业模板?

时间:2014-11-27 03:00:30

标签: jenkins jenkins-job-builder

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

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

到目前为止,我已经开始工作了:

作业-template.yml

name: 'pre-build-{proj}-{repo}'
project-type: freestyle
... etc ...

作业-1.yml

- job-template:
    !include job-template.yml

- project: 
    name: job-1
    proj: my-proj
    repo: my-repo
    jobs:
      - 'build-config-{proj}-{repo}'

这似乎是错误的,因为模板定义会在两个文件中分开,并且需要在每个作业文件中不必要地复制-job-template:行。我希望以下工作:

作业-template.yml

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

作业-1.yml

!include job-template.yml

- project: 
    name: job-1
    proj: my-proj
    repo: my-repo
    jobs:
      - 'build-config-{proj}-{repo}'

后者很遗憾导致- project:行上的yaml解析错误:

  

yaml.scanner.ScannerError:此处不允许使用映射值     在" job-1.yml",第3行,第10列

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

1 个答案:

答案 0 :(得分:10)

Jenkins-jobs采用path参数,该参数可以是包含文件的目录(job-template.yamljob-1.yamljob-2.yaml。它会将它们组合为单个YAML文档,所以你不需要使用!include。所以你可以写:

<强>作业-template.yaml

- job-template:
    name: 'pre-build-{proj}-{repo}'
    builders:
        - shell: 'echo building {proj} for {repo}'

<强> job1.yaml

- project:
    name: job-1
    proj: my-proj
    repo: my-repo
    jobs:
        - 'pre-build-{proj}-{repo}'

<强> job2.yaml

- project:
    name: job-2
    proj: my-other-proj
    repo: my-other-repo
    jobs:
        - 'pre-build-{proj}-{repo}'

这将使用以下shell命令生成两个作业:

预集结我-另一PROJ-MY-其他回购:

<command>echo building my-other-proj for my-other-repo</command>

预集结MY-PROJ-MY-回购:

<command>echo building my-proj for my-repo</command>

假设文件位于目录config/中,您可以使用以下命令生成它们:

jenkins-jobs test config/ -o /tmp/myjobs

或者使用name参数来过滤将要实现的作业:

jenkins-jobs test config/ -o /tmp/myjobs '*my-proj*'
# Creates pre-build-my-proj-my-repo
# Skips pre-build-my-other-proj-my-other-repo