Установка Jenkins и Jenkins-slave в Unix/Linux

Я ранее рассказывал как можно установить Jenkins на сервер. Сейчас, я хотел бы поделится своей заметкой по установке Jenkins-а и Jenkins-slave. Я для своего примера, буду использовать Docker + docker-compose чтобы поднять все необходимое. Конечно, это не самый хороший способ сделать отказоустойчевый сервер. Но тем не менее — у меня на маке все работает. Тем более, я настроил данное чудо не для ПРОД-а, а для локальной лабы. Чтобы более поробно изучить дженкинс. Хотелось бы сказать, ребят, если вы будете выбирать между CI/CD — не берите дженкинс (ИМХО). Есть ума других крутых тулов. Я хочу многие из них попробовать и конечно же — написать статейку в виде заметки.

Полезное чтиво:

Установка Jenkins в Unix/Linux

Работа с Jenkins-CLI в Unix/Linux

Установка Docker в Debian’s

Установка Docker в RedHat’s

Установка 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 (в данном поле прописаны ДНС-ы которые служат резолвом в самих докер-контейнера. Иногда это уместно, когда на работе или дома используются свои ДНС, а остальные блокируются).

Можно заюзать статью чтобы проверить, какие ДНС-ы используются:

Работа с DNS в Unix/Linux

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» проект, например:

Тестовый pipeline projec для Java
Тестовый pipeline projec для Java

Нажимаем на «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» завершена.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.