Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Jenkins-задачи как код. Как управлять большим к...

Jenkins-задачи как код. Как управлять большим количеством задач и ничего не бояться

Jenkins — замечательный инструмент для создания системы непрерывной интеграции или автоматизации процессов разработки. Но, к сожалению, по мере того как число задач растёт, поддерживать их становится практически невозможно.

Для решения этой проблемы существуют инструменты JobDSL и Jenkins Job Builder, которые позволяют описать задачи Jenkins в виде кода и управлять ими легко и просто.

Avatar for Pavel Shchetska

Pavel Shchetska

May 11, 2017

Other Decks in Technology

Transcript

  1. Щетько Павел 11 мая 2017 Санкт-Петербург Jenkins-задачи как код.
 Как

    управлять большим количеством задач и ничего не бояться.
  2. Вызовы • Ручное создание и настройка задач Jenkins • Управление

    большим количеством Jenkins задач • Большее количество изменений в конфигурации • Человеческий фактор • Создание большего количества похожих задач в Jenkins • Управление несколькими экземплярами Jenkins • Не самый удобный графический интерфейс
  3. Решения • XML • Jenkins CLI + BASH • Jenkins

    REST API • Другие скрипты
  4. Конфигурация как код • Системы контроля версий • Код ревью

    • Уникальность кода, повторное использование • Модульное тестирование • CI/CD для CI/CD? :-)
  5. Jenkins Job Builder • Jenkins Job Builder — решение от

    OpenStack, которое использует простое описание заданий Jenkins в формате YAML/JSON и использует их для конфигурации задач в Jenkins.
  6. Возможности • Управлять задачами в удобном для чтения текстовом формате

    и хранить их в системе контроля версий • Управление задачами удаленно • Поддержка шаблонов • Легко управлять задачами с похожими конфигурациями
  7. Пример -job:
 name: jenkins-spb
 project-type: freestyle
 description: 'Jenkins SPb'
 wrappers:


    - timestamps
 builders:
 - shell: |
 #!/bin/bash 
 echo "Hello Jenkins SPb" 
 sleep 3 <project>
 <actions/>
 <description>Jenkins SPb</description>
 <keepDependencies>false</keepDependencies>
 <properties/>
 <scm class="hudson.scm.NullSCM"/>
 <canRoam>true</canRoam>
 <disabled>false</disabled>
 <blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
 <blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
 <triggers/>
 <concurrentBuild>false</concurrentBuild>
 <builders>
 <hudson.tasks.Shell>
 <command>#!/bin/bash echo "Hello Jenkins SPb" sleep 3</command>
 </hudson.tasks.Shell>
 </builders>
 <publishers/>
 <buildWrappers>
 <hudson.plugins.timestamper.TimestamperBuildWrapper plugin="[email protected]"/>
 </buildWrappers>
 </project>
  8. Как я могу начать? • Установить Jenkins Job Builder
 


    pip install jenkins-job-builder jenkins-job-builder-addons
 • Создать проект
 .
 |-- README.md
 |-- job_builder.ini # конфигурационный файл для Jenkins Job Builder
 |-- jobs # описание задач в формате YAML или JSON
 | `-- job.yaml
 |-- resources # ресурсы для задач
 | `-- script.sh
 `-- templates # шаблоны задач
 |-- folder-template.yaml
 `-- job-template.yaml
  9. JOB_BUILDER.INI [job_builder]
 ignore_cache=True
 keep_descriptions=False
 include_path=.:scripts:~/git/
 recursive=False
 exclude=.*:manual:./development
 allow_duplicates=False
 
 [jenkins]


    user=jenkins
 password=1234567890abcdef1234567890abcdef
 url=https://jenkins.example.com
 query_plugins_info=False
 
 [hipchat]
 authtoken=dummy
 
 [stash]
 username=user
 password=pass * по умолчанию Jenkins Job Builder ожидает ini-файл в ~/.config/jenkins_jobs/jenkins_jobs.ini
  10. Выполнение • Проверяем
 jenkins-jobs test <path to yams or json>


    jenkins-jobs test -o output <path to yaml or json>
 • Создаем или Обновляем
 jenkins-jobs --conf <path to jenkins_jobs.ini> update <path to yaml or json>
 • Удаляем
 jenkins-jobs --conf <path to jenkins_jobs.ini> delete
  11. Job DSL Job DSL представляет собой достаточно сильный инструмент для

    управления задачами и состоит из: • Domain-specific language (DSL) на Groovy. • Jenkins плагина, который исполняет сценарии с описанием и управляет текущими задачами.
  12. Domain-specific language • Java код
 import static mars.Direction.*;
 import mars.Robot;


    
 public class Command {
 public static void main(String[] args) {
 Robot robot = new Robot();
 robot.move(left);
 }
 } • DSL
 move left Источник: http://2013.jokerconf.com/presentations/groovy_dsl_dlya_plugin-ov_-_rasshireniya_chelovecheskim_yazykom.pdf
  13. Возможности DSL • Скрипты через Groovy • Полный контроль над

    XML, все что есть в config.xml возможно через DSL • Вспомогательные методы для стандартных конфигураций задач (scm, triggers, build steps)
  14. Пример DSL сценария job('jenkins-spb') {
 description('Jenkins SPb')
 
 wrappers {


    timestamps()
 }
 
 steps {
 shell("""#!/bin/bash
 echo "Hello Jenkins SPb"
 sleep 3
 """)
 } } <project>
 <actions/>
 <description>Jenkins SPb</description>
 <keepDependencies>false</keepDependencies>
 <properties/>
 <scm class="hudson.scm.NullSCM"/>
 <canRoam>true</canRoam>
 <disabled>false</disabled>
 <blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
 <blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
 <triggers/>
 <concurrentBuild>false</concurrentBuild>
 <builders>
 <hudson.tasks.Shell>
 <command>#!/bin/bash echo "Hello Jenkins SPb" sleep 3</command>
 </hudson.tasks.Shell>
 </builders>
 <publishers/>
 <buildWrappers>
 <hudson.plugins.timestamper.TimestamperBuildWrapper plugin="[email protected]"/>
 </buildWrappers>
 </project>
  15. <project> <builders> <hudson.plugins.gradle.Gradle> <description/> <switches>-Dtiming-multiple=5</switches> <tasks>test</tasks> <rootBuildScriptDir/> <buildFile/> <useWrapper>true</useWrapper> <wrapperScript>gradlew</wrapperScript>

    </hudson.plugins.gradle.Gradle> </builders> </project> Что делать если нужного плагина нет в описании? job('example') { configure { project -> project / builders << 'hudson.plugins.gradle.Gradle' { description '' switches '-Dtiming-multiple=5' tasks 'test' rootBuildScriptDir '' buildFile '' useWrapper 'true' wrapperScript 'gradlew' } } }
  16. Интеграция с IDEA IDEA позволяет поддерживать пользовательские Groovy DSL. def

    ctx = context(pathRegexp: /.*\/jobs\/.*groovy/)
 contributor(ctx, {
 delegatesTo(findClass('javaposse.jobdsl.dsl.DslFactory'))
 })
  17. Job DSL как проект Gradle • Job DSL Gradle -

    Тестирование - Простая отладка - Проверка слитя кода - Инструменты для работы REST API •Структура проекта . ;<< jobs # DSL скрипты ;<< resources # ресурсы для DSL скриптов ;<< src = ;<< main = = ;<< groovy # Дополнительные классы = = @<< resources = = @<< idea.gdsl # IDE support for IDEA = @<< test = @<< groovy @<< build.gradle # файл сборки https://github.com/sheehan/job-dsl-gradle-example
  18. Возможности плагина • DSL может быть описан непосредственно в задаче

    • DSL может быть помещен в систему контроля версий и опрошен на предмет изменений стандартными инструментами Jenkins • Одновременно может быть использовано несколько DSLs сценариев • При изменении шаблона задачи будут обновлены • Удалять/Отключать/Игнорировать устаревшие задачи
  19. Источники • Документация по Jenkins Job Builder: http://docs.openstack.org/infra/jenkins-job-builder/index.html • Jenkins

    Job DSL Wiki: https://github.com/sheehan/job-dsl-gradle-example/wiki • Jenkins + Groovy with the job DSL plugin: http://sheehan.github.io/job-dsl-slides • Job DSL с Gradle: https://github.com/sheehan/job-dsl-gradle-example