Jenkins: запуск Jenkins в Docker и подключение SSH Slave

By | 05/08/2018
 

Имеется две EC2, на одной будет запущен Jenkins, который будет мастером, второй EC2 надо настроить и подключить как slave для Jenkins.

Для этого – на второй машине потребуется Java, настроенная SSH авторизация по ключам, и отдельный пользователь.

На Jenkins потребуется SSH Slaves Plugin.

Начинаем со слейва.

Настройка Jenkins Unix slave

Установка Java

Подключаемся на слейв, устанавливаем Java. Тут Ubuntu, поэтому apt:

root@ip-172-31-10-88:~# apt update
root@ip-172-31-10-88:~# apt install openjdk-8-jdk

Проверяем:

ubuntu@ip-172-31-10-88:~$ java -version
openjdk version “1.8.0_162”
OpenJDK Runtime Environment (build 1.8.0_162-8u162-b12-0ubuntu0.16.04.2-b12)
OpenJDK 64-Bit Server VM (build 25.162-b12, mixed mode)

Добавление пользователя

Создаём пользователя, под которым будет подключаться Jenkins:

root@ip-172-31-10-88:~# useradd jenkins

Настройка Master

Установка Docker

Переключаемся на мастер, устанавливаем Docker:

root@ip-172-31-5-212:~# curl https://get.docker.com/ | bash

И Docker Compose:

root@ip-172-31-5-212:/home/jenkins# curl -L https://github.com/docker/compose/releases/download/1.21.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
root@ip-172-31-5-212:~# chmod +x /usr/local/bin/docker-compose

Проверяем docker:

root@ip-172-31-5-212:~# docker run hello-world
Unable to find image ‘hello-world:latest’ locally
latest: Pulling from library/hello-world
9bb5a5d4561a: Pull complete
Digest: sha256:f5233545e43561214ca4891fd1157e1c3c563316ed8e237750d59bde73361e77
Status: Downloaded newer image for hello-world:latest
Hello from Docker!

И Compose:

root@ip-172-31-5-212:~# docker-compose --version
docker-compose version 1.21.0, build 5920eb0

Создание пользователя

Создаём каталог для $JENKINS_HOME и $HOME для пользователя (/home/jenkins для RSA ключей, в /jenkins будут данные самого Jenkins):

root@ip-172-31-5-212:~# mkdir /jenkins
root@ip-172-31-5-212:~# mkdir /home/jenkins

Создаём группу с GID 20000, что бы избежать проблем с правами в контейнере и на хосте (запускать будем от пользователя jenkins, у него на хосте UID 1001, в контейнере пользователь с UID 1000, а UID 1000 на хосте – пользователь ubuntu):

root@ip-172-31-5-212:~# groupadd --gid 20000 jenkins

Добавляем пользователя:

root@ip-172-31-5-212:~# useradd -d /home/jenkins --uid 20000 --gid 20000 -s /bin/bash jenkins

Добавляем его в группу docker:

root@ip-172-31-5-212:~# usermod -aG docker jenkins

Меняем владельца каталогов:

root@ip-172-31-5-212:~# chown jenkins:jenkins /jenkins/
root@ip-172-31-5-212:~# chown jenkins:jenkins /home/jenkins/

Настройка SSH

Переключаемся на пользователя jenkins, создаём ключ:

jenkins@ip-172-31-5-212:~$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/jenkins/.ssh/id_rsa):

Т.к. это EC2, и парольная авторизация отключена – то быстрее будет просто руками скопировать ключ, чем использовать ssh-copy-id:

jenkins@ip-172-31-5-212:~$ cat .ssh/id_rsa.pub
ssh-rsa AAA***ZmSt jenkins@ip-172-31-5-212

Добавляем его в /home/jenkins/.ssh/authorized_keys на слейве.

Проверяем SSH с мастера:

jenkins@ip-172-31-5-212:~$ ssh jenkins@34.253.207.173 -i .ssh/id_rsa
The authenticity of host ‘34.253.207.173 (34.253.207.173)’ can’t be established.
ECDSA key fingerprint is SHA256:830kEWjBvWnsgF8TdWJHQSKrEiOYK8+V98a0dbGPLYU.
Are you sure you want to continue connecting (yes/no)? yes
Last login: Tue May  8 09:18:28 2018 from 34.245.18.136
jenkins@ip-172-31-10-88:~$

ОК, тут всё работает.

Запуск Jenkins

На мастере переключаемся на пользователя jenkins:

root@ip-172-31-5-212:/home/jenkins# su -l jenkins

Создаём Compose файл:

version: '3'
services:
  jenkins:
    image: jenkins/jenkins:lts
    user: "20000:20000"
    ports:
      - "5000:5000"
      - "8080:8080"
    volumes:
      - /jenkins:/var/jenkins_home

Запускаем Jenkins:

jenkins@ip-172-31-5-212:~$ docker-compose -f jenkins-compose.json up
Creating jenkins_jenkins_1 … done

Из лога запуска получаем пароль, заходим на Jenkins, активируем:

Создаём администратора:

Добавление Jenkins Slave

Проверяем наличие плагина SSH Slaves Plugin:

Переходим в Manage Jenkins > Manage Nodes:

Сейчас тут только один хост – сам мастер:

Кликаем New node:

Создаём новый слейв:

  • Remote root directory: указываем /home/jenkins
  • Launch methodlaunch slave agents via ssh
  • Host – указываем IP хоста со слейвом
  • Credentials – кликаем Add, в Kind выбираем SSH username with private key и указываем ключ вручную (что бы не мапить /home/jenkins/.ssh с хоста в контейнер с Jenkins).

Копируем содержимое /home/jenkins/.ssh/id_rsa, и вставляем в Private Key:

В Host Key Verification Strategy можно использовать Manually trusted, результат:

Жмём Save, переходим к агенту, слева жмём Trust SSH Host Key:

Готово:

Ссылки по теме

Running Jenkins in Docker

How to run Jenkins with docker?

Add linux slave node in the Jenkins

How to Connect to Remote SSH Slaves?

Host Key Verification for SSH Agents