Я ранее рассказывал как можно установить Jenkins на сервер. Сейчас, я хотел бы поделится своей заметкой по установке Jenkins-а и Jenkins-slave. Я для своего примера, буду использовать Docker + docker-compose чтобы поднять все необходимое. Конечно, это не самый хороший способ сделать отказоустойчевый сервер. Но тем не менее — у меня на маке все работает. Тем более, я настроил данное чудо не для ПРОД-а, а для локальной лабы. Чтобы более поробно изучить дженкинс. Хотелось бы сказать, ребят, если вы будете выбирать между CI/CD — не берите дженкинс (ИМХО). Есть ума других крутых тулов. Я хочу многие из них попробовать и конечно же — написать статейку в виде заметки.
Полезное чтиво:
Установка Jenkins в Unix/Linux
Работа с Jenkins-CLI в Unix/Linux
Установка Docker-compose в Unix/Linux
Установка Jenkins в Unix/Linux
Как я говорил ранее, я буду использовать докер для установки дженкинса. ОС которую я использую — Mac OS X. Многие скажует, да какая разница, ты же запускаешь в докере. Но на самом деле — докер немного по разному работает на разных Unix/Linux ОС. Немного пришлось поплясать с бубном, чтобы зависти все это чудо на маке.
Мой docker-compose.yml файл выглядит следующим образом:
---
version: '3.5'
services:
gitlab:
image: gitlab/gitlab-ce:latest
container_name: gitlab
hostname: gitlab.local
labels:
com.example.description: "Accounting webapp"
ports:
- "443:443"
- "80:80"
- "2222:22"
dns:
- 10.17.0.3
- 1.1.1.1
- 74.82.42.42
volumes:
- "/usr/local/gitlab/config:/etc/gitlab:rw"
- "/usr/local/gitlab/logs:/var/log/gitlab:rw"
- "/usr/local/gitlab/data:/var/opt/gitlab:rw"
extra_hosts:
jenkins_local_docker: 172.6.6.20
socat_container: 172.6.6.2
restart: always
environment:
- GITLAB_OMNIBUS_CONFIG="external_url 'http://gitlab.local:80'; gitlab_rails['gitlab_shell_ssh_port']=2222; gitlab_rails['lfs_enabled'] = true;"
networks:
network0:
ipv4_address: 172.6.6.10
healthcheck:
test: ["CMD", "curl", "-f", "http://gitlab.local"]
interval: 1m30s
timeout: 10s
retries: 3
start_period: 5m
jenkins:
image: jenkins/jenkins:latest
container_name: jenkins
hostname: jenkins.local
ports:
- "8080:8080"
- "50000:50000"
dns:
- 10.17.0.3
- 1.1.1.1
- 74.82.42.42
volumes:
- "/usr/local/jenkins/data_2:/var/jenkins_home:rw"
- "/var/run/docker.sock:/var/run/docker.sock:rw"
- "/usr/local/bin/docker:/bin/docker"
extra_hosts:
gitlab_local_docker: 172.6.6.10
socat_container: 172.6.6.2
restart: always
privileged: true
environment:
- DOCKER_HOST=tcp://socat:2375
links:
- socat
depends_on:
- gitlab
networks:
network0:
ipv4_address: 172.6.6.20
pid: host
socat:
image: bpack/socat
container_name: socat
hostname: socat_container
restart: "always"
privileged: true
ports:
- "2375:2375"
dns:
- 10.17.0.3
- 1.1.1.1
- 74.82.42.42
command: "TCP4-LISTEN:2375,fork,reuseaddr unix-connect:/var/run/docker.sock"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
networks:
network0:
ipv4_address: 172.6.6.2
#volumes:
#docker_socket:
#driver_opts:
# type: none
# device: "/var/run/docker.sock"
# o: bind
networks:
network0:
ipam:
driver: default
config:
- subnet: 172.6.6.0/24
Кто работает с докер-компос, тот сможет прочитать данный файл и понять в чем дело. Но если кто-то не знает, я немного расскажу на что стоит заострить внимание. И так:
Я данным сервисом запускаю 3 контейнера, — gitlab, jenkins (master) и socat. Gitlab — система управления репозиториями кода для Git. данные конфиг делался универсальным и чтобы он работал в любом месте и на Unix/Linux системах. Если что-то не будет работать, то стоит рассмотреть поле DNS (в данном поле прописаны ДНС-ы которые служат резолвом в самих докер-контейнера. Иногда это уместно, когда на работе или дома используются свои ДНС, а остальные блокируются).
Можно заюзать статью чтобы проверить, какие ДНС-ы используются:
PS: Для данного поля стоит использовать, ТОЛЬКО 3 DNS ЗАПИСИ, не более! Иначе, они просто не будут работать и моугт сломать контейнер(ы).
Многие посмотрет на «socat» конейнер и спросят, а зачем он тут вообще упал? Так вот, он тут служит перенаправлением данных с порта (2375) на Unix сокет (/var/run/docker.sock). И сново могут полететь вопросы, а зачем?
Да дело в том, что докер-прогеры «не смогли» запилить «docker_opts»/»hosts» переменную в докер под Mac OS X. Данная переменная выполняет собственно аналогичные действия, но нативным спообом. Выглядит это вот так (на стороне Linux):
DOCKER_OPTS="-H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock"
Т.е данную команду нужно прописать в конфиг докера, или можно запустить демон следующим образом:
$ sudo docker -H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock -d
Мне не совсем понятно почему нельзя было добавить такое в поддержку мака, но воркераунд найден и он работает. Вообще, такое чудо должно работать и на линуксе, но я не проверял. Если кому-то будет интересно, проверьте и напишите в комментариях результат.
На все это дело, я потратил около 7 часов времени и мне не очень было понятно почему не работает. Но в интернете нашелся пример моего бедствия. Я взял идею и опробовал ее — костыльненько, но а что поделать!
Самое интересно, то, что я в своей реализации заюзал «Docker in Docker», т.е пробросил Docker с Mac OS X на Docker хост с jenkins. Иначе , я хз как это должно работать. Если кто-то знает — расскажите 🙂
Собственно, gitlab + jenkins — готовы к использованию. Перейдем к настройке jenkins-slave.
Установка Jenkins-Slave в Unix/Linux
Стоит поставить: Docker Plugin плагин. Я еще ставил — Docker Slaves Plugin плагин, но не понял как он работает. Я покажу какие плагины у меня имеются в дженкинсе, возможно кому-то пригодится, но для начала, скачаем CLI для Jenkins:
$ cd ~ && curl 'localhost:8080/jnlpJars/jenkins-cli.jar' > ~/jenkins-cli.jar
Мои установленные плагины:
# java -jar ~/jenkins-cli.jar -s http://localhost:8080/ -auth captain:captain list-plugins
jsch JSch dependency plugin 0.1.55
ws-cleanup Workspace Cleanup Plugin 0.37
blueocean-commons Common API for Blue Ocean 1.10.2
mercurial Mercurial plugin 2.5
structs Structs Plugin 1.17
jira JIRA plugin 3.0.5
sse-gateway Server Sent Events (SSE) Gateway Plugin 1.17
gitlab-oauth Gitlab Authentication plugin 1.4
conditional-buildstep Conditional BuildStep 1.3.6
greenballs Green Balls 1.15
apache-httpcomponents-client-4-api Apache HttpComponents Client 4.x API Plugin 4.5.5-3.0
subversion Subversion Plug-in 2.12.1
parameterized-trigger Parameterized Trigger plugin 2.35.2
pipeline-model-extensions Pipeline: Declarative Extension Points API 1.3.4.1
build-with-parameters Build With Parameters 1.4
external-monitor-job External Monitor Job Type Plugin 1.7
kubernetes Kubernetes plugin 1.14.3
workflow-aggregator Pipeline 2.6
mailer Mailer Plugin 1.23
git Git plugin 4.0.0-rc
handy-uri-templates-2-api Handy Uri Templates 2.x API Plugin 2.1.6-1.0
blueocean-jira JIRA Integration for Blue Ocean 1.10.2
kubernetes-pipeline-steps Kubernetes :: Pipeline :: Kubernetes Steps 1.6
command-launcher Command Agent Launcher Plugin 1.3
workflow-api Pipeline: API 2.33
workflow-job Pipeline: Job 2.31
ssh-credentials SSH Credentials Plugin 1.14
authentication-tokens Authentication Tokens API Plugin 1.3
blueocean-rest-impl REST Implementation for Blue Ocean 1.10.2
github-branch-source GitHub Branch Source Plugin 2.4.2
htmlpublisher HTML Publisher plugin 1.18
simple-theme-plugin Simple Theme Plugin 0.5.1
javadoc Javadoc Plugin 1.4
workflow-cps-global-lib Pipeline: Shared Groovy Libraries 2.13
blueocean-web Web for Blue Ocean 1.10.2
jackson2-api Jackson 2 API Plugin 2.9.8
ssh-slaves SSH Slaves plugin 1.29.4
gitlab-plugin GitLab Plugin 1.5.11
generic-webhook-trigger Generic Webhook Trigger Plugin 1.52
docker-workflow Docker Pipeline 1.17
pipeline-stage-tags-metadata Pipeline: Stage Tags Metadata 1.3.4.1
blueocean-pipeline-scm-api Pipeline SCM API for Blue Ocean 1.10.2
pipeline-milestone-step Pipeline: Milestone Step 1.3.1
credentials Credentials Plugin 2.1.18
docker-java-api Docker API Plugin 3.0.14
cloudbees-bitbucket-branch-source Bitbucket Branch Source Plugin 2.4.1
github GitHub plugin 1.29.3
lockable-resources Lockable Resources plugin 2.4
jquery-detached JavaScript GUI Lib: jQuery bundles (jQuery and jQuery UI) plugin 1.2.1
blueocean-personalization Personalization for Blue Ocean 1.10.2
workflow-scm-step Pipeline: SCM Step 2.7
ansicolor AnsiColor 0.6.2
matrix-auth Matrix Authorization Strategy Plugin 2.3
matrix-project Matrix Project Plugin 1.13
pipeline-stage-step Pipeline: Stage Step 2.3
pipeline-build-step Pipeline: Build Step 2.7
antisamy-markup-formatter OWASP Markup Formatter Plugin 1.5
pipeline-maven Pipeline Maven Integration Plugin 3.6.7
pipeline-input-step Pipeline: Input Step 2.9
ant Ant Plugin 1.9
bouncycastle-api bouncycastle API Plugin 2.17
handlebars JavaScript GUI Lib: Handlebars bundle plugin 1.1.1
blueocean Blue Ocean 1.10.2
pipeline-github-lib Pipeline: GitHub Groovy Libraries 1.0
variant Variant Plugin 1.1
momentjs JavaScript GUI Lib: Moment.js bundle plugin 1.1.1
blueocean-jwt JWT for Blue Ocean 1.10.2
plain-credentials Plain Credentials Plugin 1.5
docker-commons Docker Commons Plugin 1.13
docker-plugin Docker plugin 1.1.5
git-client Git client plugin 3.0.0-rc
timestamper Timestamper 1.8.10
gradle Gradle Plugin 1.30
pipeline-rest-api Pipeline: REST API Plugin 2.10
workflow-basic-steps Pipeline: Basic Steps 2.14
github-api GitHub API Plugin 1.95
blueocean-i18n i18n for Blue Ocean 1.10.2
ldap LDAP Plugin 1.20
blueocean-events Events API for Blue Ocean 1.10.2
blueocean-core-js Blue Ocean Core JS 1.10.2
maven-plugin Maven Integration plugin 3.2
oki-docki oki-docki 1.1
blueocean-config Config API for Blue Ocean 1.10.2
blueocean-github-pipeline GitHub Pipeline for Blue Ocean 1.10.2
kubernetes-credentials Kubernetes Credentials Plugin 0.4.0
credentials-binding Credentials Binding Plugin 1.17
pipeline-model-definition Pipeline: Declarative 1.3.4.1
config-file-provider Config File Provider Plugin 3.5
pipeline-stage-view Pipeline: Stage View Plugin 2.10
token-macro Token Macro Plugin 2.6
blueocean-display-url Display URL for Blue Ocean 2.2.0
workflow-multibranch Pipeline: Multibranch 2.20
script-security Script Security Plugin 1.51
git-server GIT server Plugin 1.7
pipeline-model-declarative-agent Pipeline: Declarative Agent API 1.1.1
workflow-step-api Pipeline: Step API 2.19
run-condition Run Condition Plugin 1.2
pipeline-graph-analysis Pipeline Graph Analysis Plugin 1.9
blueocean-git-pipeline Git Pipeline for Blue Ocean 1.10.2
pipeline-model-api Pipeline: Model API 1.3.4.1
jenkins-design-language Design Language 1.10.2
disk-usage disk-usage plugin 0.28
windows-slaves WMI Windows Agents Plugin 1.4
workflow-cps Pipeline: Groovy 2.63
blueocean-autofavorite Autofavorite for Blue Ocean 1.2.3
workflow-durable-task-step Pipeline: Nodes and Processes 2.29
email-ext Email Extension Plugin 2.63
branch-api Branch API Plugin 2.1.2
jdk-tool JDK Tool Plugin 1.2
cloudbees-folder Folders Plugin 6.7
blueocean-pipeline-editor Blue Ocean Pipeline Editor 1.10.2
blueocean-dashboard Dashboard for Blue Ocean 1.10.2
docker-slaves Docker Slaves Plugin 1.0.7
durable-task Durable Task Plugin 1.29
github-oauth GitHub Authentication plugin 0.31
junit JUnit Plugin 1.26.1
pam-auth PAM Authentication plugin 1.4
pubsub-light Pub-Sub "light" Bus 1.12
scm-api SCM API Plugin 2.3.0
blueocean-pipeline-api-impl Pipeline implementation for Blue Ocean 1.10.2
ace-editor JavaScript GUI Lib: ACE Editor bundle plugin 1.1
display-url-api Display URL API 2.3.0
workflow-support Pipeline: Supporting APIs 3.2
locale Locale plugin 1.4
resource-disposer Resource Disposer Plugin 0.12
blueocean-rest REST API for Blue Ocean 1.10.2
gitlab-merge-request-jenkins Gitlab Merge Request Builder 2.0.0
cloudbees-disk-usage-simple CloudBees Disk Usage Simple Plugin 0.9
build-timeout Build Timeout 1.19
favorite Favorite 2.3.2
blueocean-bitbucket-pipeline Bitbucket Pipeline for Blue Ocean 1.10.2
mapdb-api MapDB API Plugin 1.0.9.0
После того как плагины поставились, открываем дженкинс и переходим:
«Manage Jenkins» -> «Configure System» и ищем поле «Cloud»:
Кликаем по «Docker Cloud Details» чтобы ввести необходимые данные:
Задаем имя, у меня это — Docker. В поле «Docker Host URI» прописываем хост и порт который юзает докер. У меня — «tcp://172.6.6.2:2375». Почему-то, не прокатило использование хостнейма от соката в этом случае. Может исправлю попозже или на крайний случай — можно оставить как есть, т.к эта лаба служит в качестве примера. Стоит отметить, если у вас используется авторизация к докер хосту, то стоит заполнить «Server credentials». Если нажать на «Advanced», то выпадет список дополнительных параметров которые можно заполить тоже:
Нажмите на «Test connection» чтобы получить тестовое подключение (чтобы убедится что коннекшен работает как нужно).
Идем дальше, клацаем по «DOCKER AGENT TEMPLATES…» Я привел к виду:
Заполнил поле и лейблу как мне угодно. В поле «Docker image» я прописал Jenkins-Slave образ, который я взял с официального докер-регистра — «jenkinsci/slave». Так же, по необходимости заполните все необходимые поля (креденшелы, дополнительные опции).
Первый билд (джоба) на Jenkins-е
Создаем проект под свои нужды. Потом, создаем «Pipeline» проект, например:
Нажимаем на «OK» и сейчас создадим все необходимое.
Находим «Run the build inside Docker containers» и ставим чекбокс. В поле «Docker Image» ставим наш образ, у меня — «jenkinsci/jnlp-slave:latest». Так же, можно прописать «Advanced settings» опции и выставить использовании по памяти. У меня все имеет вид:
Идем дальше, находим «Pipeline» вкладку и заполняем ее под свои нужды. У меня все приведено и имеет вид:
Т.е я заюзал свой гитлаб сервер. В нем есть репозиторий с проектом. Так же, добавил подключение к гитлабу. Собственно, все готово, можно нажимать на «SAVE»!
Слева вверху, нажимаем на «Build Now» и смотрим что получилось!
Если открыть «Manage Jenkins» -> «Manage Nodes», то появится jenkins-slave:
Видно что поднялся слейв и запустил джобу. Можно открыть ее и поглядеть статус выполнения:
Я думаю что на этом пока все, статья «Установка Jenkins и Jenkins-slave в Unix/Linux» завершена.