Мы все знаем, что каждая организация содержит много сборочных машин, когда есть большие и тяжелые проекты, которые строятся постоянно. Эти машины сборки не представляют собой ничего особенного, это просто физическая машина с коммуникацией, созданной между этим и сервером Jenkins. Всякий раз, когда необходимо выполнить сборку, запускается задание с сервера Jenkins, и сервер Jenkins запускает задание на компьютере сборки, обозначенном меткой. Эти машины сборки, которые мы создаем и подключаем к серверу Jenkins, называются подчиненными. Каждый из подчиненных будет иметь метку, которая будет идентифицироваться сервером Jenkins для запуска задания.
С прибытием контейнеров, нет необходимости в отдельной сборке физических машин. Мы можем настроить Jenkins для запуска наших заданий в одном из создаваемых контейнеров; задание запускается внутри контейнера и уничтожается после завершения. В этой статье мы увидим, как мы можем запустить контейнер Docker в качестве нашего ведомого устройства и выполнить задание внутри ведомого устройства.
В этой статье мы увидим, как мы можем настроить Jenkins для запуска контейнера Docker всякий раз, когда мы хотим запустить задание. У нас будет Jenkins, работающий на другой машине, и подчиненные контейнеры Docker, созданные на другой машине.
Вам также может понравиться: Начните с Jenkins 2.0 с помощью Docker
Настройте Docker для включения удаленного API
Удаленный API позволяет нам выполнять команды Docker с использованием API. Добавьте приведенное ниже содержимое в файл /etc/docker/daemon.json
Оболочка
1
[root@ip-172-31-26-225 docker]# cat /etc/docker/daemon.json
2
{
3
"log-level":"warn",
4
"hosts": ["unix:///var/run/docker.sock","tcp://0.0.0.0:2375"]
5
}
Перезапустите демон Docker и сервер Docker с помощью команды: sudo systemctl daemon-reloadsudo systemctl restart docker.service
Подтвердите удаленный API, сделав вызов:
Оболочка
xxxxxxxxxx
1
[root@ip-172-31-26-225 docker]# curl localhost:2375/version
2
{"Version":"1.13.1","ApiVersion":"1.26","MinAPIVersion":"1.12","GitCommit":"8633870/1.13.1","GoVersion":"go1.9.4","Os":"linux","Arch":"amd64","KernelVersion":"3.10.0-862.3.2.el7.x86_64","BuildTime":"2018-09-28T19:45:08.749348837+00:00","PkgVersion":"docker-1.13.1-75.git8633870.el7.centos.x86_64"}
Используйте команду curl и получите доступ к « http: // localhost: 2375 / version », и если мы увидим, что результат работает.
Для этой статьи я взял экземпляр AWS EC2 с IP-адресом «3.17.134.39». установил Docker и настроил Docker API.
Со стороны Jenkins установите плагин Docker из раздела «Управление Jenkins -> Управление плагинами». После того, как мы установим плагин, мы увидим запись, добавленную в «Управление Jenkins -> Настройка системы» под названием «облако».
Настройте «Сведения о Docker Cloud», как показано ниже:
В приведенной выше конфигурации URI хоста Docker является важным. Это та же машина, на которой я хочу запустить свои подчиненные контейнеры Docker. В моем случае я взял экземпляр AWS EC2 с IP-адресом «3.17.134.39». URI хоста Docker: «tcp: //3.17.134.39: 2375». Это та же конфигурация хоста, что и на первом этапе. Установите флажок «Включено». Вы можете оставить остальные поля такими, какие они есть.
Важно убедиться, что удаленный API работает, нажав кнопку «Проверить соединение». Как только он возвращает версию и значения версии API, как показано на рисунке выше, все работает нормально.
После настройки облака Docker нам необходимо настроить шаблон Docker, который находится под облаком Docker на той же странице.
Есть много конфигураций, которые нам нужно сделать в этом шаблоне. Метка — это первое, что нам нужно настроить. Сначала дайте имя полю метки; это то же имя, которое мы будем использовать в работе для запуска проекта. Я дал метку «ведомый», и когда я сконфигурирую задание Jenkins, я назначу имя метки в задании «ведомый», чтобы это задание запускалось в этом контейнере Docker. Вы можете выбрать любое имя, которое считаете нужным.
Следующий и самый важный элемент — это изображение Docker. Существуют определенные условия при запуске подчиненного контейнера для Jenkins. Во-первых, нам нужно создать образ Docker, взяв «jenkins / ssh-slave» в качестве базового образа.
Затем мы можем установить необходимые пакеты в нем. Затем это изображение необходимо сохранить в Docker Hub. Ниже Dockerfile для этой статьи
Dockerfile
xxxxxxxxxx
1
FROM jenkins/ssh-slave
2
# Install selected extensions and other stuff
4
RUN apt-get update \
5
&& apt-get -y --no-install-recommends install \
6
php7.0-cli \
7
php-xdebug \
8
composer \
9
phpunit \
10
&& apt-get clean; rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/*
Я построил изображение и сохранил его с именем «docker.io/jagadesh1982/jenkins-slave-test:latest». Затем я использовал docker push
команду для отправки в Docker Hub.
Теперь, как только мы определим детали изображения в «шаблоне Docker» в Jenkins, Jenkins загрузит изображение на этот компьютер и запустит контейнер, используя это изображение. Одна важная вещь заключается в том, что у нас есть кнопка «Проверка подлинности реестра», которая позволяет нам настраивать наши учетные данные Docker Hub как учетные данные Jenkins. Дженкинс будет использовать эти учетные данные для входа в Docker Hub и загрузки образа на компьютер. Нам нужно настроить эти учетные данные, указав данные вашего Docker Hub.
Емкость экземпляра установлена на 5, а домашнее местоположение установлено на «/ home / jenkins». Следующая важная вещь - это способ подключения. В этом случае я выбираю «Подключиться по ssh», который покажет подробности ниже. В ключе ssh я выбрал тип «Inject ssh key», который будет вводить выделенный ключ ssh в контейнер, и sshd настроен соответствующим образом. Пользователем будет Jenkins, так как мы создали образ из Jenkins / ssh-slave. Мы можем выбрать нашу собственную стратегию тяги.
Создайте образец Freestyle Job и установите метку для работы, щелкнув опцию «Ограничить место выполнения проекта». В этом поле введите метку «slave», которую мы создали ранее для облака Docker.
Теперь, если мы запустим задание, мы увидим, что файл образа загружается и запускается в экземпляре EC2, как показано ниже:
HTTP
xxxxxxxxxx
1
[root@ip-172-31-26-225 docker]# docker images
2
REPOSITORY TAG IMAGE ID CREATED SIZE
3
docker.io/jagadesh1982/jenkins-slave-test latest 3fe46a04b63c 1 days ago 655 MB
4
[root@ip-172-31-26-225 docker]# docker ps
6
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7
51dbe4a21cbe docker.io/jagadesh1982/jenkins-slave-test:latest "setup-sshd /usr/s..." 4 seconds ago Up 3 seconds 0.0.0.0:32774->22/tcp angry_swartz
Мы видим, что файл изображения загружен, а контейнер запущен всего за три секунды. Счастливого обучения!
Дальнейшее чтение
Dockerizing Jenkins 2, часть 1: декларативный конвейер сборки с анализом SonarQube