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

Наш опыт управления агентами Jenkins: Ansible, ...

Наш опыт управления агентами Jenkins: Ansible, Swarm Plugin и Jenkins Pipeline Libraries

Рассказ о том, как мы перестали добавлять агентов через Jenkins UI, навели порядок в инфраструктуре и перенесли свой опыт в Jenkins Pipeline Libraries. Поговорим о связке Ansible + Swarm plugin, а также немного о best practices для получения стабильных сборок и большей уверенности, что проблема “не на нашей стороне”

Nikolay Rumyantsev

February 27, 2018
Tweet

Other Decks in Programming

Transcript

  1. SPb Jenkins Meetup #10 в Dell EMC Pipeline, средства разработки

    и управление агентами February 27, 2018
  2. Наш опыт управления агентами Jenkins: Ansible, Swarm Plugin и Jenkins

    Pipeline Libraries Николай Румянцев [email protected] izzekil @ https://gitter.im/jenkinsci-ru/public
  3. © Copyright 2018 Dell Inc. 3 @jenkins_spb Setup • 1

    мастер • 70 агентов (Linux only) • >100 пользователей • >100 сборок в день
  4. © Copyright 2018 Dell Inc. 4 @jenkins_spb Типичные проблемы •

    Сборка упала, потому что закончилось место на диске. • Тесты упали с out of memory, потому что остался зависший процесс с прошлой сборки. • Почему Job A привязана к агенту B? • Добавляем новые агенты: доступны ли с них все необходимые ресурсы: Git, файл-сервер, Jenkins, Artifactory, Docker registry и т.п. • Плановое и внеплановое обновление конфигурации хостов.
  5. © Copyright 2018 Dell Inc. 5 @jenkins_spb Мы хотим •

    Четко сформулированные требования для процессов: – Software, hardware, доступность сетевых ресурсов • Управление конфигурацией хостов: – Добавить новые, обновить используемые, проверить актуальность
  6. © Copyright 2018 Dell Inc. 6 @jenkins_spb Ищем решение: виртуальные

    машины • Контроль над конфигурацией, включая hardware • Чистейшее окружение • ...
  7. © Copyright 2018 Dell Inc. 7 @jenkins_spb Ищем решение: виртуальные

    машины • Контроль над конфигурацией, включая hardware • Чистейшее окружение • ... • Но: – Наш парк ВМ хостится в 3 private cloud – Для двух из них нет поддержки со стороны Jenkins. – К третьему доступ только через техподдержку. – Загрузка новых образов ВМ – боль. Используем статические ВМ
  8. © Copyright 2018 Dell Inc. 8 @jenkins_spb Ищем решение: Docker

    • Версионированная, изолированная конфигурация, чистое окружение. • Надежно подчищает процессы! • В Jenkins это: – Предварительное создание контейнера (Yet Another Docker Plugin) – Создание контейнера, как шаг в job (Docker Pipeline Plugin) • Как управлять хостами с Docker?
  9. © Copyright 2018 Dell Inc. 9 @jenkins_spb Ищем решение: Ansible

    & Co • Контроль над хостами • Не зависит от средства виртуализации
  10. © Copyright 2018 Dell Inc. 10 @jenkins_spb К чему пришли

    • Docker: – Для доставки окружения и изоляции исполнения – С помощью обертки (как у разработчиков): def devkitsh(cmd) { sh “echo $cmd | docker run /bin/bash” } • Ansible для управления хостами – Базовая конфигурация: сертификаты, сетевые настройки, проверка доступности сетевых ресурсов – Software: Docker, Python, Java • Что делать с настройками агентов в самом Jenkins?
  11. © Copyright 2018 Dell Inc. 11 @jenkins_spb Jenkins Swarm Plugin

    • Как он работает: – Ставим плагин на мастер, качаем клиент на агент – Запускаем клиент, дожидаемся соединения – Jenkins создает агента автоматически – При остановке клиента агент удаляется • Запуск клиента: java -jar swarm-client.jar Аргументы: – Labels, #executors, корневая директория, имя, и т.п. – Доступ к Jenkins: ip/autodiscovery, логин/пароль – Прочие J A ssh J SSH slave JNLP, Swarm slave A
  12. © Copyright 2018 Dell Inc. 12 @jenkins_spb Ansible + Jenkins

    Swarm Plugin • Конфигурируем сервис, управляющий swarm client: ExecStart={{ swarm_shell_command }} Restart=always RestartSec=10 • Строка запуска: – labelsFile – изменение лейблов не приведет к рестарту. Список лейблов пишем сами: с хоста + из инвентори. – disableClientsUniqueId + deleteExistingClients – красивые имена агентов, запрет двух агентов с одной машины – retry 0 – для этого есть systemd – Xmx для Java
  13. © Copyright 2018 Dell Inc. 13 Ansible + Jenkins Swarm

    Plugin [generic_build_hosts] 10.0.0.[11:50] [generic_build_hosts:vars] swarm_labels="build_host parallel_tests" [service_nodes] 10.0.0.[1:10] [service_nodes:vars] swarm_executors=7 swarm_jvm_opts="-Xmx2048m" swarm_labels="service_node xml_parsing" [swarm_agents:children] generic_build_hosts service_nodes [swarm_agents:vars] swarm_master="https://example.com/jenkins/" master_jnlp_port=9999 jenkins_swarm_slave=True
  14. © Copyright 2018 Dell Inc. 14 Ansible + Jenkins Swarm

    Plugin [generic_build_hosts] 10.0.0.[11:50] [generic_build_hosts:vars] swarm_labels="build_host parallel_tests" [service_nodes] 10.0.0.[1:10] [service_nodes:vars] swarm_executors=7 swarm_jvm_opts="-Xmx2048m" swarm_labels="service_node xml_parsing" [swarm_agents:children] generic_build_hosts service_nodes [swarm_agents:vars] swarm_master="https://example.com/jenkins/" master_jnlp_port=12345 jenkins_swarm_slave=True - hosts: swarm_agents name: Manage Jenkins agent via swarm plugin roles: - { role: create_jenkins_swarm_agent, when: jenkins_swarm_agent } - { role: remove_jenkins_swarm_agent, when: not jenkins_swarm_agent }
  15. © Copyright 2018 Dell Inc. 15 Ansible + Jenkins REST

    API # update agent labels via REST API as a workaround for JENKINS-47391 - when: "labels_file.changed and not service_config.changed" block: - name: update labels. get agent config uri: method: GET return_content: yes url: "{{ swarm_agent_config_url }}" user: "{{ swarm_username }}" password: "{{ swarm_password }}" force_basic_auth: yes register: agent_config_xml - name: update labels. post agent config uri: method: POST ... body: "{{ agent_config_xml.content | regex_replace('<label>.*</label>', '<label>' + label_string + '</label>') }}"
  16. © Copyright 2018 Dell Inc. 16 @jenkins_spb Ansible + Jenkins

    Swarm Plugin (2) Процесс: – Ansible inventory файл в Git – Запускаем Ansible по расписанию – Новый хост –> коммит в inventory –> очередной запуск Ansible –> хост в строю – Добавление в Jenkins - только после успешной конфигурации – При непрохождении проверки хосты не удаляем, просто сообщаем в Slack
  17. © Copyright 2018 Dell Inc. 17 @jenkins_spb На доработку •

    Cинхронизировать Ansible и Jenkins через REST API: – Mark offline -> Wait until idle -> Restart. • Не запускать Ansible на хосте, конфигурируемом этим же Ansible. Пилим сук. • Удаление агента в один шаг
  18. © Copyright 2018 Dell Inc. 18 @jenkins_spb Третий элемент: Jenkins

    Pipelines • Очистка workspace до и после void node(final String label, final Closure body) { steps.node(label) { this.withTimestamps { // workaround for JENKINS-33478 String cleanCommand = 'rm -rf .devkit' sh(cleanCommand); deleteDir() try { body.call() } finally { sh(cleanCommand); deleteDir() } } } }
  19. © Copyright 2018 Dell Inc. 19 @jenkins_spb Третий элемент: Jenkins

    Pipelines (2) • Очистка всех кэшей, Docker images • Передача данных через stash/unstash, archive/wget
  20. © Copyright 2018 Dell Inc. 20 @jenkins_spb Третий элемент: Jenkins

    Pipelines (3) • Унификация агентов: – Single-executor: сборка и ресурсоемкие тесты – Multiple-executor: тесты по сети, манипуляции с git, bash, python, curl вне docker.
  21. © Copyright 2018 Dell Inc. 21 @jenkins_spb Takeaways • Для

    статических ВМ: Ansible + Docker • Конфигурируем агенты через код • Моем workspace перед билдом (и после!) Полезные ссылки • Swarm Plugin: https://plugins.jenkins.io/swarm • Yet Another Docker Plugin: https://plugins.jenkins.io/yet-another-docker-plugin • Using Docker with Pipeline: https://jenkins.io/doc/book/pipeline/docker/