Статьи

Управление рабочими процессами с Дженкинсом и Докером

докер-workflow.png

Большинство реальных трубопроводов более сложны, чем канонический поток BUILD → TEST → STAGE → PRODUCTION. Эти конвейеры часто имеют этапы, которые не должны запускаться, если не выполнены определенные условия, в то время как другие должны запускаться, только если условия первого не выполнены. Jenkins Workflow помогает создавать эти конвейеры, позволяя Jenkins лучше представлять и обслуживать сложные развертывания.

Плагин Jenkins Workflow Docker еще больше расширяет эти рабочие процессы, обеспечивая первоклассную поддержку образов и контейнеров Docker. Этот плагин позволяет Jenkins создавать / выпускать образы Docker и использовать контейнеры Docker для настраиваемых и воспроизводимых подчиненных сред.

Что такое Докер?

Docker — это проект с открытым исходным кодом, который предоставляет платформу для создания и доставки приложений с использованием контейнеров. Эта платформа позволяет разработчикам легко создавать стандартизированные среды, которые гарантируют, что среда тестирования совпадает с производственной средой, а также предоставляют легкое решение для виртуализации приложений.

Docker-контейнеры — это облегченные среды выполнения, которые состоят из приложения и его зависимостей. Эти контейнеры работают «на металле» машины, что позволяет им избежать 1-5% загрузки ЦП и 5-10% загрузки памяти, связанных с традиционными технологиями виртуализации. Они также могут быть созданы из доступного только для чтения шаблона, называемого образом Docker.  

Образы Docker могут быть созданы из определения среды, называемого Dockerfile, или из работающего контейнера Docker, который был зафиксирован как образ. Как только образ Docker существует, его можно отправить в реестр, такой как Docker Hub, и из этого образа можно создать контейнер, создав среду выполнения с гарантированным набором инструментов и приложений, установленных на нем. Аналогично, контейнеры могут быть переданы в изображения, которые затем передаются в Docker Hub. 

Что такое рабочий процесс?

Jenkins Workflow — это новый плагин, который позволяет Jenkins рассматривать непрерывную доставку как первоклассный тип работы в Jenkins. Рабочий процесс позволяет пользователям определять процессы рабочих процессов в одном месте, избегая необходимости координировать потоки между несколькими заданиями сборки. Это может быть особенно важно в сложных корпоративных средах, где работа, релизы и зависимости должны координироваться между командами. Рабочие процессы определяются как сценарий Groovy либо в задании Workflow, либо регистрируются в рабочей области из внешнего репозитория, такого как Git.

Докер для простоты

В двух словах, плагин CloudBees Docker Workflow добавляет специальную точку входа с именем Docker, которую можно использовать в любом скрипте Workflow Groovy. Он предлагает ряд функций для создания и использования образов и контейнеров Docker, которые, в свою очередь, могут использоваться для упаковки и развертывания приложений или в качестве сред сборки для Jenkins.

Вообще говоря, существует две области функциональности: использование собственных образов Docker или созданных мировым сообществом для упрощения автоматизации сборки; и создание и тестирование новых изображений. Некоторым проектам понадобятся оба аспекта, и вы можете следовать за полным проектом, который использует оба: см. Демонстрационное руководство

Среда и рабочий процесс сборки Jenkins

Прежде чем углубляться в детали, полезно узнать историю настройки сред сборки в Jenkins. Большинство сборок проектов имеют какие-то ограничения на компьютере, который может запустить сборку. Даже если скрипт сборки (например, Ant build.xml) теоретически самодостаточен и не зависит от платформы, вы должны начать где-нибудь и сказать, какие инструменты вы ожидаете использовать.

Поскольку многим людям нужно было сделать это, еще в 2009 году я работал с Kohsuke Kawaguchi и Tom Huybrechts, чтобы добавить средство к предшественнику Jenkins — Hudson — для «инструментов». Теперь администратор Jenkins может перейти на страницу конфигурации системы и сказать, что Ant 1.9.0 и JDK 1.7.0_67 следует предлагать проектам, которые хотят их, поэтому загружайте и устанавливайте их с общедоступных сайтов по запросу.

В традиционном задании это становится опцией раскрывающегося меню на экране конфигурации проекта, а в рабочем процессе вы можете использовать шаг инструмента:

node(‘libqwerty’) {
 withEnv([“PATH=${tool ‘Ant 1.9.0’}/bin:${env.PATH}”]) {
   sh ‘ant dist-package’
 }
 archive ‘app.zip’
}

Хотя это немного лучше, это все равно оставляет много места для ошибок. Что если вам понадобится Ant 1.9.3 — вы ждете администратора Jenkins? Если вы хотите масштабировать до сотен сборок в день, кто будет обслуживать все эти машины?

Четкие, воспроизводимые среды сборки с помощью Docker

Благодаря Docker разработчик проекта может легко опробовать стандартный образ, ориентированный на разработку, в Docker Hub или написать специальный файл с коротким файлом Docker:

FROM webratio/ant:1.9.4
RUN apt-get install libqwerty-devel=1.4.0

Теперь разработчик проекта полностью контролирует среду сборки. Прошли времена «да, это изменение скомпилировано на моей машине»; любой может запустить образ Docker на своем ноутбуке, чтобы получить среду, идентичную той, которую использует Jenkins для запуска сборки.

К сожалению, если другим проектам нужны другие изображения, администратору Jenkins придется снова подключиться, чтобы настроить дополнительные облака. Также досадно, что перед использованием образа вам нужно немного его настроить, чтобы убедиться, что он запускает демон SSH с предсказуемым входом пользователя в систему и версию Java, достаточно новую для запуска подчиненных Jenkins.

Что если все эти хлопоты просто ушли? Допустим, администраторы Jenkins гарантировали только одно:

Если вы попросите построить на ведомом устройстве с докером меток, то Docker будет установлен.

и приступил к подключению нескольких дюжин грубых, но ванильных облачных рабов Linux. В CloudBees Docker Workflow вы можете использовать эти серверы сборки по мере их поступления.

// OK, here we come
node(‘docker’) {
 // My project sources include both build.xml and a Dockerfile to run it in.
 git ‘https://git.mycorp.com/myproject.git’
 // Ready?
 docker.build(‘mycorp/ant-qwerty:latest’).inside {
   sh ‘ant dist-package’
 }
 archive ‘app.zip’
}

Вложенные в несколько строк Groovy инструкции очень мощны. Сначала мы использовали docker.build, чтобы создать свежий образ из определения Dockerfile. Если вы довольны изображением, нет необходимости даже в этом:

node(‘docker’) {
 git ‘https://git.mycorp.com/myproject.git’
 docker.image(‘webratio/ant:1.9.4’).inside {
   sh ‘ant dist-package’
 }
 archive ‘app.zip’
}

docker.image просто просит загрузить именованное изображение из реестра, в данном случае общедоступного Hub. .inside просит запустить изображение в новом одноразовом контейнере, а затем запустить другие шаги сборки внутри него. Так что Дженкинс действительно работает за кулисами docker exec abc123 ant dist-package. Немаловажным моментом является то, что каталог вашего единого рабочего пространства проекта прозрачно доступен внутри или снаружи контейнера, поэтому вам не нужно ни копировать исходники, ни копировать продукты сборки. Контейнеру не нужно запускать подчиненный агент Jenkins, поэтому его не нужно «заражать» установкой Java или учетной записью пользователя jenkins.

Легко адаптируемые CD-конвейеры

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

def buildIn(env) {
 node(‘docker’) {
   git ‘https://git.mycorp.com/myproject.git’
   docker.image(env).inside {
     sh ‘ant dist-package’
   }
 }
}
parallel older: {
 buildIn ‘webratio/ant:1.9.3’
}, newer: {
 buildIn ‘webratio/ant:1.9.4’
}

Упрощенное развертывание приложений

Пока что все, о чем я говорил, предполагает, что Docker — это «просто» лучший способ настроить ясную, воспроизводимую и быструю среду сборки, но основное использование Docker — это упрощение развертывания приложений в рабочей среде. Мы уже видели, как docker.build создает образы, но вы также захотите протестировать их и у Дженкинса. Для этого вы можете запустить изображение, выполняя некоторые тесты. И вы можете .push изображение в общедоступный или внутренний, защищенный паролем реестр Docker, где он готов для производственных систем для его развертывания.

Попробуй сам

Посмотрите демонстрационный скрипт, чтобы увидеть все вышеупомянутые варианты использования в действии. Эта демонстрация демонстрирует, что вы можете использовать несколько одновременно работающих контейнеров для проверки взаимодействия между системами.

В будущем мы, возможно, захотим использовать Docker Compose, чтобы упростить настройку и демонтаж сложных сборок программного обеспечения, все из простого сценария рабочего процесса Jenkins, использующего автономные технологии. Вы можете даже сохранить этот скрипт потока в системе управления версиями, так что все интересное в том, как создается проект, контролируется несколькими небольшими текстовыми файлами.

Заключительные мысли

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

Загрузите CJE 15.05 или установите CloudBees Docker Workflow на любой сервер Jenkins 1.596+ и начните сегодня!