©2016CloudBees,Inc.AllRightsReserved©2015CloudBees,Inc.AllRightsReserved
Jenkins 2.0: Организуем
тестирование в составе Continuous
Delivery
Олег Ненашев,
CloudBees, Inc.
©2016CloudBees,Inc.AllRightsReserved
• ~10 лет в R&D и автоматизации
• Фокус: электроника и встраиваемое
ПО
– Intel, Sitronics, Synopsys
• Развертывание и поддержка
больших систем автоматизации
• Автоматизация тестирования и QA
2
О себе. Бэкграунд
@oleg_nenashev
oleg-nenashev
onenashev
©2016CloudBees,Inc.AllRightsReserved
О себе. Jenkins
3
@oleg_nenashev
oleg-nenashev
onenashev
• Проект Jenkins, Core team
– Развитие ядра
– Поддержка плагинов
– Организатор митапов
– Контакт для прессы в СНГ
• Jenkins Developer в CloudBees
– CloudBees – контрибьютор Jenkins
– Помогаем строить enterprise-системы на базе
Jenkins
– CloudBees Jenkins Platform
– Поддержка 24/7
©2016CloudBees,Inc.AllRightsReserved
Кто такой Jenkins?
4
• Сервер автоматизации
• Continuous Integration
• Continuous Delivery
• DevOps
• …
• Веб-интерфейс
• Распределенная система
• Open-source (MIT)
https://jenkins.io
Сборка
Тестиро-
вание
Создание
пакетов
Установка,
развер-
тывание
Построе-
ние
отчетов,
аналитика
и другое
©2016CloudBees,Inc.AllRightsReserved
Кто такой Jenkins
• 2005: Появился как Hudson
• 2008: Duke's Choice Award
• 2011: Переименование в Jenkins
• 2012: Самый популярный сервер
непрерывной интеграции
• 2015: >100к активных
инсталляций
• 2015: 1200 плагинов 5
©2016CloudBees,Inc.AllRightsReserved
Jenkins 2.0
Выпущен 20 апреля 2016
https://jenkins-ci.org/2.0/
6
©2016CloudBees,Inc.AllRightsReserved
Jenkins 2.0. А зачем?
• Смена фокуса с CI в разработке софта
– Continuous Delivery/Deployment
– DevOps
– Everything as Code
• Проблемы User Experience в Jenkins
– Сложность настройки системы и задач
– Неполная документация
– Интеграционные проблемы
7
©2016CloudBees,Inc.AllRightsReserved
•Новый вебсайт
•Изменение базового набора плагинов
•Security-опции включены по-
умолчанию
•Улучшения UX:
– Новый мастер установки
– Улучшение страниц конфигурации задач
– Категоризация задач
•Pipeline as Code
8
Jenkins 2.0. Что внутри? http://bit.ly/jenkins20
©2016CloudBees,Inc.AllRightsReserved
Предыдущие доклады о Jenkins 2.0
•Митапы по Jenkins в Санкт-
Петербурге
– Инсайды по статусу разработки Jenkins
2.0
– О Jenkins в целом
•QA: Conference
– Jenkins 2.0 Что внутри?
9
St. Petersburg
Jenkins Meetup
@jenkins_spb
©2016CloudBees,Inc.AllRightsReserved
Сегодня…
Continuous
Delivery
10
Disclaimer:
• Презентация не является тренингом
• Презентация отражает личное мнение докладчика
• Личное мнение докладчика может не совпадать с
позицией компании или сообщества Jenkins
• Ссылки на картинки – в бэкапе
©2016CloudBees,Inc.AllRightsReserved
Было. Непрерывная Интеграция
11
http://www.osp.ru/os/2008/06/5344965/
©2016CloudBees,Inc.AllRightsReserved
Было. Непрерывная Интеграция
12
Релиз
Релиз-
кандидатОсновная ветка
Изменение 1
Изменение 2
Изменение 3
QA
мало QA
мало QA
мало QA
©2016CloudBees,Inc.AllRightsReserved
13
©2016CloudBees,Inc.AllRightsReserved
• Они начинают раньше «работать»
• Финансовый эффект достигается раньше
Зачем доставлять изменения раньше?
14
©2016CloudBees,Inc.AllRightsReserved
Как не надо делать
15
РелизОсновная ветка
Изменение 1
Изменение 2
Изменение 3
мало QA
мало QA
мало QA
“Тяп-ляп и в продакшн”
Исправляем…Исправляем…
©2016CloudBees,Inc.AllRightsReserved
Continuous Delivery
16
РелизОсновная ветка
Изменение 1
Изменение 2
Изменение 3
больше QA
больше QA
Больше QA
Быстрый
откат
©2016CloudBees,Inc.AllRightsReserved
CD для инфраструктуры…
• Инфраструктура:
– критична для проектов
– меняется вместе с кодом
– должна тестироваться
• Infrastructure As Code
• DevOps
17
©2016CloudBees,Inc.AllRightsReserved
•Короткие циклы разработки
•Всегда дедлайн
•Нет времени на юнит-тесты
•Разбиение систем на
модули
CD для разработчиков…
18
©2016CloudBees,Inc.AllRightsReserved
CD для контроля качества…
•Короткие циклы верификации
•Автоматизация всего:
– Тестирование (все типы)
– Статический анализ кода
– Контроль совместимости модулей (N-1)
– …
•Надежность контроля
– False negative опасны
19
©2016CloudBees,Inc.AllRightsReserved
Что нам нужно для CD?
•Параллелизация (что можно)
•Версионирование кода и процедур сборки
•Воспроизводимость тестов и сборок
– Чистое окружение для каждого прогона
– Тесты сами подготавливают окружение
•Тестирование на реальном релизе
– Staging-репозитории релизов
20
©2016CloudBees,Inc.AllRightsReserved
Что нужно?
Системы автоматизации!
21
©2016CloudBees,Inc.AllRightsReserved
Почему Jenkins?
22
Jenkins –
Система
Непрерывной Интеграции
Фреймворк
Автоматизации
©2016CloudBees,Inc.AllRightsReserved
23
Интеграции
>1200
плагинов
Интеграция с
сотнями тулов
Управление
процессами
автоматизации
Автоматизация
любых задач
Code & Commit Build & Config Scan & Test Release Deploy
©2016CloudBees,Inc.AllRightsReserved
Строим Delivery Pipeline. “Классический”
подход
• Failover
– Naginator-плагин
• Воспроизводимость
– Чистое окружение
– Одноразовые
виртуальные
машины
24
• Параллелизация
– Matrix Project
– Parameterized
Trigger
• Цепочки задач:
– MultiJob plugin
– Build Pipeline Plugin
• Шаблонизация:
– Template project
– Inheritance plugin
©2016CloudBees,Inc.AllRightsReserved
Классические подходы
Спагетти-автоматизация
• Зависимости
между задачами
• Трекинг
компонентов
• Сложные
конфигурации
• Дупликация
• Сложность
поддержки
• Ошибки
©2016CloudBees,Inc.AllRightsReserved
Что делать?
26
©2016CloudBees,Inc.AllRightsReserved
Pipeline as Code
27
Описание процесса сборки в виде кода
©2016CloudBees,Inc.AllRightsReserved
•Хранение [X] вместе с проектом
•Отслеживание изменений
•Тестирование [X] вместе с
проектом
[X] as code – часть Continuous Delivery
Зачем оно нужно?
28
[X] – Configuration, Documentation, Pipeline… Everything!
©2016CloudBees,Inc.AllRightsReserved
29
Automation as Code
Job DSL
Pipeline (бывш. Workflow)
По-умолчанию предлагается в Jenkins 2.0
Jenkins Job Builder
Groovy
Groovy
YAML
Ещё несколько плагинов…
©2016CloudBees,Inc.AllRightsReserved
•Groovy DSL для описания задач
•Тип задачи в Jenkins (Pipeline Job)
•Open-source экосистема для X-as-
code
Что такое Jenkins Pipeline?
30
©2016CloudBees,Inc.AllRightsReserved
31
Pipeline. Запуск скрипта из SCM
• Синтаксис на базе Groovy
• Шаги для типовых операций
• Описания задач можно хранить в SCM
• Jenkinsfile – описание задачи в корне репозитория
• Шаг git() заменяется на “checkout scm”
• http://bit.ly/pipeline-tutorial
©2016CloudBees,Inc.AllRightsReserved
Pipeline Multibranch. Пример
• Автоматическое создание задач для веток и pull-request’ов
• Независимые репортинг и история сборок
• Работает на уровне организаций
©2016CloudBees,Inc.AllRightsReserved
• Генератор шаблонов в UI
– Пользователь настраивает шаг сборки в UI
– Jenkins генерирует код для Pipeline
33
Фичи Pipeline
©2016CloudBees,Inc.AllRightsReserved
• Отображение последовательного Pipeline
• CloudBees перевела проект в OSS
34
Фичи. Pipeline Stage View
• Шаг stage()
• Логи для отдельных
стадий задачи
• Интерактивные шаги
интегрированы в UI
©2016CloudBees,Inc.AllRightsReserved
Фичи: Pipeline View Plugin
• Другое представление Pipeline
• Сейчас–релиз вне основного центра апдейтов
35
©2016CloudBees,Inc.AllRightsReserved
• Pipeline не привязан к конкретной ноде
• Параллелизация
– Команда parallel() – не нужны связки
джобов
• Множественные node() в одной задаче
– => + parallel() – запуск тестов на разных
машинах тестов на машинах
• Множественные scm() в одной задаче
• Интерактивные шаги
36
Специфика Pipeline
©2016CloudBees,Inc.AllRightsReserved
37
Пример. Параллельные тесты
…
stage ‘test'
parallel 'unit' : {
node {
unstash 'source'
sh "./gradlew :test"
stash includes: 'build/jacoco/*.exec', name: 'unitCodeCoverage'
step([$class:'JUnitResultArchiver',
testResults:'**/build/test-results/*.xml'])
}
}, 'integration': {
node {
unstash 'source'
sh "./gradlew -PhappyPath :integration-test:test"
step([$class:'JUnitResultArchiver',
testResults:'**/build/test-results/*.xml'])
}
}
©2016CloudBees,Inc.AllRightsReserved
• Устойчивость к рестарту мастера
– Pipeline хранит контекст и продолжает задачу
после рестарта
• Шаг sh() – Durable Task Plugin
– Устойчивость к разрывам сети
• Failover в случае инфраструктурных проблем
38
Pipeline. Надежность инфраструктуры
©2016CloudBees,Inc.AllRightsReserved
Pipeline. Надежность инфраструктуры
• Почти любая ошибка может быть
перехвачена и отработана
Переход на другую ноду
Node #1 Node #2. . .
. . .
for (def board : boards) {
echo "trying board " + board;
try {
node(board) {
checkout scm
sh ‘./bin/run.sh’
// Call passed => DONE
break;
}
} catch (Exception ex) {
if (ex.message.contains
("exit code 255")) {
// Fatal error
fail("Test run failed")
} } }
Пример кода
©2016CloudBees,Inc.AllRightsReserved
• Команда load() –загрузка Pipeline из файла
• Pipeline Global Library Plugin
– Входит в состав ядра Pipeline plugin
– Создает Git-репозиторий в Jenkins
– Предоставляет глобальные классы и
переменные
• Pipeline Remote Loader Plugin
– Загрузка кода Pipeline из Git/GitHub
40
Фичи. Шаблонизация
©2016CloudBees,Inc.AllRightsReserved
Pipeline. Воспроизводимость
• Staging-репозитории
– Плагины/CLI для Nexus, Artifactory, TFS, …
• «Чистые» окружения
– Нативная поддержка виртуальных машин
– Поддержка Cloud API Jenkins
o AWS, EC2, Azure, Mesos, vSphere, Docker, …
– Docker Pipeline Plugin
41
©2016CloudBees,Inc.AllRightsReserved
Docker Pipeline Plugin. Пример
• Запуск задачи внутри контейнера:
• Сборка и публикация образов:
42
©2016CloudBees,Inc.AllRightsReserved
43
Пример. CD Jenkins-бота
#!groovy
def imageName = 'jenkinsciinfra/ircbot’
node('docker') {
checkout scm
// Немного магии для получения тэга Docker-образа
sh 'git rev-parse HEAD > GIT_COMMIT'
shortCommit = readFile('GIT_COMMIT').take(6)
def imageTag = "build${shortCommit}"
stage 'Build ircbot'
withMavenEnv
(["BUILD_NUMBER=${env.BUILD_NUMBER}:${shortCommit}"]) {
sh 'make bot' // Make вызывает Maven
}
stage 'Build container'
def whale = docker.build("${imageName}:${imageTag}”)
stage 'Deploy container'
whale.push()
}
https://github.com/jenkins-infra/ircbot
©2016CloudBees,Inc.AllRightsReserved
44
ЕСТЬ ЛИ РУЧНОЕ ТЕСТИРОВАНИЕ
В CONTINUOUS DELIVERY?
©2016CloudBees,Inc.AllRightsReserved
Ручное тестирование
• На критическом пути – в идеале НЕТ
• Но:
– Прототипирование автотестов
– Исследовательское тестирование
• При CD тесты…
– выполняются после автоматического QA
– встраиваются в Delivery Pipeline
– максимально автоматизированы
45
©2016CloudBees,Inc.AllRightsReserved
46
Пример. Интерактивные шаги
// Сборка проекта из репозитория
// Инициализация тестового прогона в TestRail для QA
// Автотесты, репортинг, деплой на staging-сервер
// Отправить уведомления ручным тестировщикам
echo ’Automatic tests passed’
hipchatSend('@QATeam The build ' + buildVersion + ' has been staged: ' + stagingURL
+ '. Please Test it and report back to ' + build.url
+ '. TestRail run is here: ' + testRailRunURL)
// Подождать, пока QA подтвердят релиз
input message: 'Have manual spot-checks passed? Ready to release?'
// Релиз и нотификации
mail to: "dream_team@cloudbees.com",
subject: "Dream Product - build is released",
body: "Hi there, The new build of the product has been released. Link:» + artifactoryLink
~~~~~~Много кода~~~~~~
~~~~~~Много кода~~~~~~
©2016CloudBees,Inc.AllRightsReserved
Pipeline в CloudBees Jenkins Platform
• Частичный Continuous Delivery
• Около 100 внутренних модулей + open-source
• Тысячи сборок в день
• У нас нет тестировщиков (только SDET)
• Что мы автоматизируем?
– Проверка pull-request’ов, validated Merge
– Релизы (компоненты, инсталляторы)
– CD документации на сайты
– Интеграция компонентов (ночные сборки)
– Деплой на staging
47
©2016CloudBees,Inc.AllRightsReserved
Pipeline в CloudBees Jenkins Platform
• Что сделали?
– Весь код в SCM, минимальные настройки проектов
– Внутренняя библиотека Pipeline
– Pipeline Utility Steps
• Чего добились?
– Релиз и staging одной кнопкой
– Легко тестируем изменения в Build Flow
– Более эффективная параллелизация UI-тестов
oUI-тесты: 8 часов (на N машинах) => 1 час
oРелиз основного модуля– 3 часа
48
©2016CloudBees,Inc.AllRightsReserved
• Jenkins 2.0
– … частично решает проблемы с UI/UX
– … будет развиваться дальше
• Pipeline as Code
– … снижает затраты на поддержку
автоматизации
– … может быть применен для CD
– … может быть применен для задач QA
49
Заключение
©2016CloudBees,Inc.AllRightsReserved
• Twitter: @jenkins_ru
• Gitter: http://gitter.im/jenkinsci-ru
– QA: использование и разработка
Jenkins
• Митапы:
– Санкт-Петербург
o http://www.meetup.com/St-Petersburg-Jenkins-
Meetup/
– Москва – in progress
o http://www.meetup.com/Moscow-Jenkins-
Meetup/
– Минск (@KostyaSha, привет!)
– CloudBees спонсирует митапы
50
Русскоязычное комьюнити
Здесь может
быть Ваше лого
©2016CloudBees,Inc.AllRightsReserved
• Jenkins:
– Вебсайт: http://jenkins.io
– Jenkins 2.0: https://jenkins-ci.org/2.0/
– Jenkins и CD: https://jenkins.io/solutions/pipeline/
• Pipeline-as-Code:
– Документация: https://jenkins.io/doc/pipeline/
– Примеры: https://github.com/jenkinsci/pipeline-examples
• CloudBees:
– Вебсайт: https://www.cloudbees.com/
– CloudBees Jenkins Platform:
https://www.cloudbees.com/products/cloudbees-jenkins-platform
51
Ссылки
©2016CloudBees,Inc.AllRightsReserved©2015CloudBees,Inc.AllRightsReserved
52
©2016CloudBees,Inc.AllRightsReserved
Почему
“автоматизации”?
53
Непрерывной Интеграции
Continuous
Integration
Continuous
Delivery
DevOps
Автоматизация
бухучёта
Home
Automation
CRON с WebUI
©2016CloudBees,Inc.AllRightsReserved
Почему
“фреймворк”?
54
Система
Гибок и расширяем
Минимален «из коробки»
Требует настройки
©2016CloudBees,Inc.AllRightsReserved
55
Система
Инфра-
структура
Доку-
мен-
тация
Инфра-
структура
Конфиги
Инфра-
структура
Шаб-
лоны
Система на
базе Jenkins
©2016CloudBees,Inc.AllRightsReserved
• Multibranch Pipeline – тип задачи
– В конфигурации – ссылка на репозиторий
o Git/GitHub, BitBucket, …
– Описание проекта - Jenkinsfile
– Для всех веток – ОТДЕЛЬНЫЕ задачи в Jenkins
o Сборки при коммитах
o Независимые отчеты и Build History
– [СКОРО] – Сборка pull-request’ов
• (+) Multi-branch работает на уровне организаций в GitHub и
BitBucket
56
Фичи Pipeline. Multibranch
©2016CloudBees,Inc.AllRightsReserved
57
Multibranch Pipeline. Пример
©2016CloudBees,Inc.AllRightsReserved
58
Pipeline. Шаги
>100 шагов:
• Интеграции с плагинами
• Системные шаги
• Дополнительные библиотеки
©2016CloudBees,Inc.AllRightsReserved
59
Pipeline Remote Loader. Пример
stage 'Load files from GitHub'
def environment, helloworld
fileLoader.withGit ('https://github.com/jenkinsci/workflow-
remote-loader-plugin.git', 'master', null, '')
{
helloworld = fileLoader.load('examples/fileLoader/helloworld');
environment = fileLoader.load('examples/fileLoader/environment');
}
stage 'Run methods from the loaded content'
helloworld.printHello()
environment.dumpEnvVars()

Jenkins 2.0: Организуем тестирование в составе Continuous Delivery