Pull to refresh

Использование Docker-контейнеров как Jenkins-нод

Reading time3 min
Views23K
Эта статья описывает использование контейнеров docker как отдельные ноды для системы непрерывной интеграции, в данном случае jenkins. Кому лень читать tl; dr
Для сборки нашего проекта в RPM и DEB пакеты мы используем Jenkins, на что выделена специальная машина.

Сначала мы собирали наш проект только для CentOS 6. Далее добавилась поддержка CentOS 5, и оказалось что зависимости от конкретных версий библиотек не дают работать тем же бинарникам под разными версиями CentOS, понадобилась сборка разных RPM. Это было решено добавлением в jenkins ноды с CentOS 5, которой служила виртуалка на VirtualBox. Потом добавилась поддержка Suse, а потом и Debian.

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


Используя Jenkins для непрерывной интеграции можно подключить ноды с нужными операционками и назначить задачи на них, тут есть несколько вариантов:
  • Арендовать инстансы/компьютеры и использовать их как ноды
  • Использовать стандартную виртуализацию (гипервизор)
  • Контейнеры (lxc, jail etc)

Преимущества контейнеров перед виртуальными машинами очевидны в данном случае (оперативная память общая, динамически-меняющаяся, большое количество поднятых контейнеров не тормозит систему в отличии от виртуальных машин), а Docker добавляет к ним такие важные моменты как:

  • Для сборки проекта запускается собственно скрипт сборки, и больше ничего. Тогда как при использовании виртуальной машины будут запущены все системные процессы и демоны, что отъедает ресурсы хоста.
  • «Дешевое» создание большого количества независимых клонов машин — иногда для сборки проекта нужна изолированная среда для сборки.


Docker как нода в jenkins



Для jenkins-слейва нам нужны:
  1. Java
  2. Точка входа — ssh
  3. Инструменты для сборки


Точка входа нужна для запуска процесса в docker-е и сохранении файловой системы внутри сессии сборки (LXC использует процесс init, но нам вся система ни к чему). Так как jenkins-у все равно понадобится SSH для общения с нодой, этот демон и будет точкой входа.

Для сборки машины Docker предлагает использовать Dockerfile-файлы с инструкциями по сборке машины.

В этом репозитории: https://github.com/antigluk/docker-jenkins-slave сейчас доступны правила сборки для 
  • CentOS 5
  • CentOS 6
  • Suse 12
  • Debian 6


Пулл-реквесты с новыми системами, и исправлениями в скриптах приветствуются:)

Сборка и использование



Предполагается, что у вас установлен Docker и Jenkins

1) Установите в Jenkins Swarm Plugin (он позволяет слейвам добавляться в Jenkins автоматически используя API)
2)  $ git clone git@github.com:antigluk/docker-jenkins-slave.git; cd docker-jenkins-slave
3) Перейдите в папку с правилами для нужной системы
    $ cd centos6
4)  $ sudo bash build.sh


Когда соберется образ, вы сможете добавлять сколько угодно нод данного типа:

    sudo bash add_slave.sh SlaveName


После выполнения этой команды вы должны увидеть новую ноду на Jenkins-e.

Теперь, для использования новой ноды достаточно указать в тегах для сборки нужной задачи «docker-tagname" — название тега это название системы с полной версией, список тегов можно посмотреть на специальной странице в вики
Tags:
Hubs:
Total votes 12: ↑12 and ↓0+12
Comments16

Articles