Jenkins job builder:有条件地包含 builder 和 publisher
Jenkins job builder: conditionally include builder and publisher
我有一组基本相同的 Jenkins 作业。我已经创建了一个创建它们的工作模板。但是,有些拥有其他人没有的构建器(即链中的第一个不从另一个项目复制工件),而其他人则拥有其他人没有的发布者(他们并不都拥有 JUnit 测试)。
我想根据变量有条件地包含这些模块,但我找不到这样做的方法:
- 我无法使用 jinja2 模板来包含或排除列表中的一项
- 包含空变量通常会导致构建失败
- 我可以包含 yaml 文件,但我需要包含所有构建器部分,并且我需要为每个作业创建一个,这意味着很多重复
这可能吗?我想在一些工作中包括下面的评论部分。
43 builders:
44 - shell: |
45 echo Removing working directory from previous run
46 rm -rf ${{WORKSPACE}}/css-build/working
47 # - copyartifact:
48 # project: "{previous-project}"
49 # whichbuild: last-successful
50 # optional: "{copy-optional}"
51 - shell: |
52 {init-shell}
53 ${{WORKSPACE}}/css-build/build-util.sh {shell-args} ${{WORKSPACE}}/{location} -w ${{WORKSPACE}}/css-b uild/working
好吧,这是解决方法:
使用与原始名称不同的名称定义一个新模块(在本例中为生成器)。如果 omit
标签存在,什么都不做;否则,无论如何都会发生的事情。
def optional_copy(registry, xml_parent, data):
if data['omit'].lower() == 'true':
return
else:
new_data = collections.OrderedDict()
new_data['copyartifact'] = data
registry.dispatch('builder', xml_parent, new_data)
在setup.py
注册到jjb:
setup(
name='JJB config',
py_modules = ['optionals'],
entry_points={
'jenkins_jobs.builders': [
'optional-copy=optionals:optional_copy'
]
}
)
然后,在您的 yaml 中,您可以使用 optional-copy
模块和 omit
属性:
builders:
- shell: |
echo Removing working directory from previous run
rm -rf "{working-dir}"
- optional-copy:
omit: "{omit-copy}"
project: "{prev}"
whichbuild: last-successful
- shell: |
{init-shell}
${{WORKSPACE}}/css-build/build-util.sh -u {diirt-version} {shell-args} -p ${{WORKSPACE}}/{location} -w "{working-dir}"
我有一个不需要扩展作业生成器的解决方法来解决你的问题。
但它需要 jenkins 上 Conditional build step plugin 的可用性。
可选构建器示例:
- job-template
id: my-custom-template
builders:
- conditional-step:
condition-kind: always
steps: "{obj:optional_builders|[]}"
有了这个,您可以使用 optional_builders
变量(如果需要)将构建器添加到您的工作中。
jobs:
#With optional_builders
- my-custom-template:
optional_builders:
- copyartifact:
project: "{previous-project}"
whichbuild: last-successful
#Without optional_builders
- my-custom-template:
可选发布者示例:
publishers:
- conditional-publisher:
- condition-kind: always
action: "{obj:optional_publishers|[]}"
我有一组基本相同的 Jenkins 作业。我已经创建了一个创建它们的工作模板。但是,有些拥有其他人没有的构建器(即链中的第一个不从另一个项目复制工件),而其他人则拥有其他人没有的发布者(他们并不都拥有 JUnit 测试)。
我想根据变量有条件地包含这些模块,但我找不到这样做的方法:
- 我无法使用 jinja2 模板来包含或排除列表中的一项
- 包含空变量通常会导致构建失败
- 我可以包含 yaml 文件,但我需要包含所有构建器部分,并且我需要为每个作业创建一个,这意味着很多重复
这可能吗?我想在一些工作中包括下面的评论部分。
43 builders:
44 - shell: |
45 echo Removing working directory from previous run
46 rm -rf ${{WORKSPACE}}/css-build/working
47 # - copyartifact:
48 # project: "{previous-project}"
49 # whichbuild: last-successful
50 # optional: "{copy-optional}"
51 - shell: |
52 {init-shell}
53 ${{WORKSPACE}}/css-build/build-util.sh {shell-args} ${{WORKSPACE}}/{location} -w ${{WORKSPACE}}/css-b uild/working
好吧,这是解决方法:
使用与原始名称不同的名称定义一个新模块(在本例中为生成器)。如果 omit
标签存在,什么都不做;否则,无论如何都会发生的事情。
def optional_copy(registry, xml_parent, data):
if data['omit'].lower() == 'true':
return
else:
new_data = collections.OrderedDict()
new_data['copyartifact'] = data
registry.dispatch('builder', xml_parent, new_data)
在setup.py
注册到jjb:
setup(
name='JJB config',
py_modules = ['optionals'],
entry_points={
'jenkins_jobs.builders': [
'optional-copy=optionals:optional_copy'
]
}
)
然后,在您的 yaml 中,您可以使用 optional-copy
模块和 omit
属性:
builders:
- shell: |
echo Removing working directory from previous run
rm -rf "{working-dir}"
- optional-copy:
omit: "{omit-copy}"
project: "{prev}"
whichbuild: last-successful
- shell: |
{init-shell}
${{WORKSPACE}}/css-build/build-util.sh -u {diirt-version} {shell-args} -p ${{WORKSPACE}}/{location} -w "{working-dir}"
我有一个不需要扩展作业生成器的解决方法来解决你的问题。 但它需要 jenkins 上 Conditional build step plugin 的可用性。
可选构建器示例:
- job-template
id: my-custom-template
builders:
- conditional-step:
condition-kind: always
steps: "{obj:optional_builders|[]}"
有了这个,您可以使用 optional_builders
变量(如果需要)将构建器添加到您的工作中。
jobs:
#With optional_builders
- my-custom-template:
optional_builders:
- copyartifact:
project: "{previous-project}"
whichbuild: last-successful
#Without optional_builders
- my-custom-template:
可选发布者示例:
publishers:
- conditional-publisher:
- condition-kind: always
action: "{obj:optional_publishers|[]}"