Jenkins Job Builder:项目级变量

Per*_*tra 3 jenkins jenkins-job-builder

在 JJB 中,您可以像这样定义项目级变量:

- defaults:
    name: global
    git_url: "git@....."

- project
    name: some-test
    jobs:
      - test-{name}

- job-template
    name: test-{name}
    scm:
      - git:
          url: "{git_url}"
          branches:
            - master
Run Code Online (Sandbox Code Playgroud)

我的问题是,我必须在默认级别对 git_url 的值进行硬编码,还是可以使用某种 JJB 机制在作业加载/执行时将其引入?

我问的原因是包含这些 JJB 作业的 yaml 脚本可用于定义 TEST、QA 和 PROD。最好只指向一个包含 git_url 值和任何其他全局变量值的属性文件。我看了看:http : //docs.openstack.org/infra/jenkins-job-builder/definition.html?highlight=default#defaults,我没有看到任何机制。

小智 6

如果我正确理解您的问题,则在单个 yaml 文件的上下文中还有两种其他方法可用

方法一:git_url在项目层面设置

- project
    name: some-test
    git_url: "git@dogs.net:woof/bark.git"
    jobs:
      - test-{name}:

- job-template
    name: test-{name}
    scm:
      - git:
          url: "{git_url}"
          branches:
            - master
Run Code Online (Sandbox Code Playgroud)

这里git_url是在项目级别设置的。这种方法允许您定义具有不同值的第二个项目git_url,即

- project
    name: some-other-test
    git_url: "git@cats.net:meow/meow.git"
    jobs:
      - test-{name}:
Run Code Online (Sandbox Code Playgroud)

方法二:git_url在job-template实例级别设置

- project
    name: some-test
    jobs:
      - test-{name}:
        git_url: "git@....."

- job-template
    name: test-{name}
    scm:
      - git:
          url: "{git_url}"
          branches:
            - master
Run Code Online (Sandbox Code Playgroud)

git_url是在指定作业模板的实际实例上设置的。如果你的名字job-template不仅仅是{name}它的名字,这将允许你jobs在项目级别的列表中创建它的多个实例,即

- project
    name: some-test
    git_url: "git@....."
    jobs:
      - test-{name}-{type}:
        type: 'cat'
      - test-{name}-{type}:
        type: 'dog'

- job-template
    name: test-{name}-{type}
    display-name: 'Test for {type} projects'
    scm:
      - git:
          url: "{git_url}"
          branches:
            - master
Run Code Online (Sandbox Code Playgroud)

关于 TEST、QA 和 PROD 的思考

您还提到您需要某种外部属性文件来区分 TEST、QA 和 PROD 环境。为了解决这个问题,让我们考虑四个不同的文件,project.yaml, defaults/TEST.yaml, defaults/QA.yamldefaults/PROD.yaml其内容列举如下。

project.yaml

- project
    name: some-test
    jobs:
      - test-{name}:
Run Code Online (Sandbox Code Playgroud)

defaults/TEST.yaml

- defaults:
    name: global
    git_url: "git@dogs.net:woof/test.git"
Run Code Online (Sandbox Code Playgroud)

defaults/QA.yaml

- defaults:
    name: global
    git_url: "git@dogs.net:woof/qa.git"
Run Code Online (Sandbox Code Playgroud)

defaults/PROD.yaml

- defaults:
    name: global
    git_url: "git@dogs.net:woof/prod.git"
Run Code Online (Sandbox Code Playgroud)

好的,所以这些不是很好的例子,因为你可能不会为每个环境有一个不同的 git 存储库,但我不想因为偏离你原来的例子太远而使事情复杂化。

使用 JJB,您可以在命令行上指定多个 YAML 文件(我不想使示例或其解释复杂化,但您也可以指定充满 JJB yaml 的目录)。要区分 Jenkins 作业的 TEST、QA 和 PROD 部署,您可以执行以下操作:

jenkins-jobs project.yaml:defaults/TEST.yaml
Run Code Online (Sandbox Code Playgroud)

对于您的测试环境。

jenkins-jobs project.yaml:defaults/QA.yaml
Run Code Online (Sandbox Code Playgroud)

适用于您的 qa 环境。

jenkins-jobs project.yaml:defaults/PROD.yaml
Run Code Online (Sandbox Code Playgroud)

适用于您的生产环境。

希望有帮助。