Дженкинс Джобкинс: условно включает строителя и издателя
У меня есть набор заданий Дженкинса, которые практически одинаковы. Я создал шаблон работы, который создает их все. Однако у некоторых есть компоновщики, которых нет у других (то есть первый в цепочке не копирует артефакты из другого проекта), а у других есть издатели, которых нет у других (у них не все есть тесты 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
2 ответа
У меня есть обходной путь для вашей проблемы, который не требует продления работы строителя. Но для этого требуется доступность плагина условной сборки на jenkins.
Пример для необязательных сборщиков:
- 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|[]}"
Ну, вот обходной путь:
Определите новый модуль (в данном случае это будет сборщик) с именем, отличным от оригинала. Если 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)
Зарегистрируйте это в jjb в setup.py
:
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}"