9

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

在当前用例中,我们基本上将有一个模板供大量工作使用。由于超出此处范围的原因,每个作业都需要存在于自己的文件中。

到目前为止,我已经让这个工作:

工作模板.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:这似乎是错误的,因为模板定义在两个文件中被拆分,并且需要在每个作业文件中不必要地重复该行。我想让以下工作改为:

工作模板.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 列中不允许映射值

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

4

1 回答 1

10

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

工作模板.yaml

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

工作1.yaml

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

工作2.yaml

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

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

pre-build-my-other-proj-my-other-repo:

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

预建我的项目我的回购:

<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
于 2014-11-27T11:31:42.763 回答