Дженкинс Джобкинс: условно включает строителя и издателя

У меня есть набор заданий Дженкинса, которые практически одинаковы. Я создал шаблон работы, который создает их все. Однако у некоторых есть компоновщики, которых нет у других (то есть первый в цепочке не копирует артефакты из другого проекта), а у других есть издатели, которых нет у других (у них не все есть тесты 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}"
Другие вопросы по тегам