Установка Jenkins через Docker. Нюансы запуска docker-compose внутри контейнера. Организация сети распределённой сборки. Подготовка виртуальных машин для менеджера и агентов через Ansible.
- 00:00:38 Выбор системы автоматизации
- 00:02:10 Способы установки Jenkins
- 00:04:20 Создание проекта
- 00:06:06 Добавление Makefile
- 00:07:06 Доступ к Docker
- 00:09:03 Использование Docker в Docker
- 00:10:14 Использование стороннего docker-демона
- 00:12:39 Пробрасывание сертификатов
- 00:14:51 Пробрасывание рабочей директории
- 00:16:02 Сохранение кэша образов
- 00:17:50 Локальная установка
- 00:19:54 Интерфейс Blue Ocean
- 00:20:36 Создание демонстрационного Pipeline
- 00:22:25 Локальный прокси Nginx
- 00:24:34 Установка docker-compose
- 00:26:50 Конфигурация для production
- 00:28:34 Создание виртуальной машины
- 00:29:26 Создание плейбуков для Ansible
- 00:35:18 Запуск плейбуков для установки
- 00:36:24 Добавление команды деплоя
- 00:38:22 Установка Jenkins в production
- 00:39:28 Выполнение Ad-Hoc команд в Ansible
- 00:42:34 Добавление тестового Pipeline
- 00:42:59 Настройка числа исполнителей
- 00:47:10 Проблема последовательного запуска
- 00:49:02 Использование сети агентов
- 00:51:53 Добавление агента
- 00:54:55 Генерация SSH-ключа для агента
- 00:58:25 Добавление Node в Jenkins
Скрытый контент (код, слайды, ...) для подписчиков.
Открыть →Чтобы не пропускать новые эпизоды подпишитесь на наш канал @deworkerpro в Telegram
Спасибо, отличное видео.
Спасибо, очень!
Дмитрий спасибо за качественный материал, и за тот труд ,который вы проделали, чтоб доступно все изложить,но не кажется вам что мы сильно начинаем углубляться в девопсовские вещи
А как без этого?
Да это полезно для общего развития, но сдается мне, что здесь собрались в большинстве своем программисты (как и я), и для них данная информация не имеет большего значения, кроме как самому потренироваться. Данные знание мало пригодятся в работе, т.к. в любой студии или компании программисту не дадут этим заниматься, для этого есть devops (который в любом случае будет более опытен), в отличие от лекции по программированию, архитектурных решений, тестирования, крайне полезны и который можно применять в своей работе и дальше в этом развиваться. Я считаю что не стоит распыляться, как по мне на ненужные вещи для программиста, а уделить больше времени именно программированию, рассмотреть и применить различные паттерны в данном проекте, что бы было более практическое понимание где и как их стоит правильно их использовать.Но отмечу, это всего лишь мое мнение и пожелание, и оно может отличаться от мнения Дмитрия.
Ну уж и не знаю... Я программист и я регулярно настраиваю CI/CD. Для меня материал довольно полезен.
Наоборот, понятие DevOps как раз подразумевает, что всем этим начинают заниматься сами программисты. А не классический вариант, когда в компании есть отдельный программист (dev) и отдельный сисадмин (ops).
Так изначально и анонсировалось, что это будет серия про полный цикл разработки под ключ с рассмотрением всех подобных тем.
Спасибо, Дмитрий! Одно время попробовал запустить Jenkins в docker с маунтом докер сокета, но во время сборки приложений при поднятии контейнеров не маунтились тома. Теперь понимаю, как этого избежать.
В таком случае нужно было монтировать рабочую папку по тому же абсолютному пути:
чтобы внешний docker-демон видел тот же
/var/jenkins_home
.Спасибо
Отличный урок, спасибо!
Спасибо, материал то что надо, тут пишут что типа не по теме, но это не верно, самый крутой паттерн и идеальный код, бесполезны если с рабочим окружением что-то случилось и не будет рядом никакого девопса скорее всего, который все быстро поправит. А с такими знаниями ты уже сам себе режиссер, хоть понятно в какую сторону смотреть.
согласен
Дмитрий, а почему задача из authorize.yml запускается отдельно от задачи создания пользователя?
Потому что она необязательна для запуска.
Спасибо за замечательные уроки! Вопрос, почему мне приходится в плейбуках уточнять путь к ролям? Вместо просто: - swap, надо писать: .../roles/swap У меня ubuntu 16.
Сам себе отвечаю, потому что плейбуки зачем-то поместил в отдельную папку, а надо в корень рядом с папкой /roles
Дмитрий, в моём jenkins такая беда, ветка master начала падать с ошибкой на npm-install причем падает только ветка master, другие ветки не падают
Что то не охото переустанавливать и настраивать заново jenkins. Может можно как то это поправить?
А образ свежий
FROM node:15-alpine
?А если зайти в
var/lib/docker/volumes
и вjenkins-data
удалить папкуnode_modules
вworkspaces/xxx_master
и потом перезапустить сборку?Образ node:alpine - норм? вроде должен быть крайний.
Папку нашел, pipeline отработал успешно!
Спасибо Дима!
Спасибо!
Для информации: внезапно отвалилась дополнительная нода, вообще не хотела подключаться, полечил обновлением образа jenkins (docker-compose pull && docker-compose build --pull).
Дима, чем отличается?
docker-compose pull --include-deps && docker-compose build
от
docker-compose pull && docker-compose build --pull
Правильнее использовать вариант:
Исправил это в репозитории и скоро исправлю в видео.
добрый вечер а подскажите какие вы плагины поставили. я собрал Jenkins из alpine
При установке выбрали рекомендуемые по умолчанию. Потом свми доставили SSH Agent.
Выскакивает такая ошибка, при после команды make init
ERROR: Could not build wheels for cryptography which use PEP 517 and cannot be installed directly ERROR: Service 'jenkins' failed to build: The command '/bin/sh -c apk add --no-cache py-pip python3-dev libffi-dev openssl-dev gcc libc-dev make gettext && pip3 install docker-compose' returned a non-zero code: 1 make: *** [Makefile:15: docker-build] Error 1
да, кстати аналогично, потребовалось обновить докер и вот такая же ошибка появляется
https://docs.docker.com/compose/install/
For alpine, the following dependency packages are needed: py-pip, python3-dev, libffi-dev, openssl-dev, gcc, libc-dev, rust, cargo and make.
Таким образом в список установки надо добавить rust и cargo
Спасибо, помогло :)
Здравствуйте, у меня не получается одновременно задеплоить registry и jenkins. Пишет что порт 443 уже занят другим сервисом. Если я деплою сначало registry, после этого jenkins не получается задеплоить из за того, что nginx registry занимает порт, что посоветуете?
Да, просто так одновременно задеплоить два проекта на один порт не получится.
Можете совместить исходники из двух проектов в один, сделав общий файл
docker-compose.yml
.Либо можете отдельныйм
docker-compose.yml
поставить общий входной прокси-сервер Traefik и эти два проекта деплоить в его сеть.Я так делал, как Дима пишет с общим docker-compose.yml, работает. Сначала, поднял реестр, потом остальное. Но в итоге отказался от этой затеи, потому что виртуалка не тянет и постоянные проблемы. И в конце концов у меня отдельные виртуалки на реестр, дженкинс (1GB памяти - вот это прям обязательно) и сайт.
Не могу задеплоить:
Та же фигня. С той же ошибкой не могу собрать образы на локалке. Даже с rust и cargo.
Кто-то решил эту проблему с установкой docker-compose в jenkins dockerfile? А то я весь инет уже облазил, даже тему создал здесь https://stackoverflow.com/questions/69098128/cant-install-docker-compose-into-jenkins-dockerfile Но пока безуспешно. Я надеюсь Дмитрий прочитает и ответит мне. Хоть что-нибудь. Может у всех образ собирается и это у меня какая-то специфическая проблема. Может докер обновить или еще что-то.
Выполните с обновлением:
Пробовал сделать такое. "docker system prune", "docker-compose pull". Но после выполнения команды "docker-compose build --pull " выбивает ту же ошибку. Причем при сборке спулился новый образ blueocean. А остальным такое помогло?
RUN apk add --no-cache py-pip musl-dev python3-dev libffi-dev openssl-dev gcc libc-dev rust cargo \ && pip3 install --upgrade pip \ && pip3 install docker-compose
Добрый день, Дмитрий.
Следовал указаниям из видео - всё получилось. Jenkins запустился, открылся и даже получилось создать проверочный pipeline.
Но при более подробной "проверке" обнаружились проблемы.
1) Память практически вся загружена.
2) Постоянно используется swap.
Попробовал через reboot перегрузить виртуалку. С памятью и swap стало лучше
Но на сайте 502, кроме контейнера nginx все "упали". Запуск контейнеров не помогает.
В логах ngix какая ошибка
В остальных логах ничего подозрительного не нашёл.
Помогает только полная переустановка виртуальной машины и новая установка jenkins.
Виртуалки на vscale.io. Память 512, диск 20Gb., ubuntu 18.04.
Как я понял из видео, swap будет использоваться по требованию. Но даже после установки, не запуская никаких pipeline-ов, виртуалка получается загружена.
Как победить данную проблему?
p.s. Построчно сверил все файлы, перепроверю ещё раз, но думаю, что проблема в чём-то другом.
p.s.s После некоторого времени память опять загружена и swap используется
C 502 ответом сервера вроде бы разобрался.
В docker-compose-production.yml для сервисов jenkins и docker добавил restart: always
Теперь после reboot они запускаются.
Дмитрий, но в Вашем docker-compose-production.yml для этих сервисов не установлен restart. Так нужно его указывать или нет?
И что делать с постоянным ростом использования swap и самой памяти виртуалки?
Да, можно поставить restart: always, чтобы после reboot они запускались снова.
Просто для Jenkins нужна более мощная виртуалка. В идеале двухъядерная с 2GB.
Всё сделал как Вы и показали, чтобы меньше разногласий было)))
В общем проблему победил при помощи restart:always. Из-за этого возникала 502 ошибка.
Пока всё работает и на минимальных, проект пока не сильно большой.
Добрый день.
На локальной машине поднять jenkins удалось без проблем
А вот на серверве - никак. При билде ругается на weels для pynalc
для сервера использую Debian 10 64bit 512 МБ RAM 20 ГБ SSD 1 CPU
Никак не могу понять в чем соль?
https://wiki.alpinelinux.org/wiki/Docker
В самом видосе показана установка для старой версии, могут лететь ошибки, хоть и не должны. =_=
Лично у меня заработало. Спасибо тебе, добрый человек.
супер, спасибо
Добрый вечер.
Попробуйте установить из этого образа.
FROM jenkinsci/blueocean:1.24.7
Крайне мало, сам убедился на собственном опыте. Берите не меньше 1Gb RAM
Спасибо я понял две вещи. Нужна версия ядра ubuntu не меньше 20 и оперативная память лучше 2 Гб. Версия влияет на работу пакетов, а память нужна для работы jenkins. Java прожорливая ))))))
Да, влияет на работу пакетов при установке.
Посмотрите здесь же комментарии выше. Эта проблема воникала и у меня, пока не сменил версию образа.
Всем привет! Подскажите, пожалуйста, кто решил - как обновиться до 2й версии docker compose?
Благодарю Дмитрий! Прекрасный урок!
Установил Jenkins согласно этого урока. docker-compose-production.yml взял из вашего jenkins репозитория. Сделал на его основе. Соответственно, версия jenkins: FROM jenkins/jenkins:alpine (v2.380) В docker-compose отдельно стоит сервис jenkins + Отдельный сервис nginx для него.
Вроде интерфейс работает, но при установке любого jenkins плагина (плагин из Вашего урока или плагин для Gitlab), когда нажимаешь на приглашение "restart" после завершения установки плагина, интерфейс в броузере навечно зависает в стадии перезагрузки: https://i.imgur.com/FEpvM7J.png на адресе https://jenkins.gigakassa.ru/manage/pluginManager/updates/
В логах - ничего критичного: https://i.imgur.com/qSJQCsL.png , Разве что пара странных варнингов при старте контейнера: https://i.imgur.com/vBDGcxH.png
После обновления зависшей страницы получаем 502: https://i.imgur.com/RiNUM6C.png
Если рестартовать docker-compose jenkinsa (down+up), то все ОК и вновь установленные плагины - на месте.
RAM на виртуалке: 16 GB
Дмитрий, подскажите пожалуйста, это баг или фича (error 502)? и куда копать?
Выяснил что плагины тут ни при чём. Зависание рестарта + 502 возникают и при простом ручном рестарте Jenkins: (jenkins_url)/safeRestart
Если я после попытки рестарта Jenkins через web интерфейс и получения 502 bad gateway делаю затем рестарт nginx прокси
, то получается успешно подключиться к Jenkins, просто перегрузив его страницу.
Поэтому, промежуточный вывод: Jenkins рестартует нормально, просто прокси его перестаёт видеть после растарта (рестара Jenkins-a).
Что-то не так с прокси..., хотя он типовой, из урока (что в prod что в dev):
Да, без прокси (localhost:8080) Jenkins рестартует из интерфейса отлично.
Дмитрий, а нет ли у Вас мыслей как подкрутить прокси?
Так, кажется разобрался.
Результат: прокси теперь пере-подключается к контейнеру Jenkins, даже после перезагрузки Jenkins. Следовательно, можно в интерфейсе Jenkins выполнять операции, требующие перезагрузки Jenkins.
Добавил две новые строчки:
Итого, рабочая конфигурация Дмитрия с моими двумя новыми строчками:
Как думаете, Дмитрий, это корректное решение проблемы?
PS: У Jenkins есть официальный пример конфига прокси.
Там очень много всего, включая поддержку веб сокетов для Jenkins.
Но и без этого пока у меня интерфейс работает. Может не всё еще щупал в функционале.
Я применял эту конфигурацию, но она не решала вышеописанной проблемы с перезагрузкой.
Что-то не удается мне подружить Jenkins + docker:dind в Swarm... Кто-то пробовал запустить?
Дмитрий, в видео описывается процесс пробрасывая порта 8000 для Jenkins, у меня не заработало. Зашел на офф сайт там указанно пробрасывать порт 8080 https://www.jenkins.io/doc/book/installing/docker/
В видео прокидывается 8080 порт из Jenkins на 8000 порт компьютера:
Так что противоречий нет.
Или войти через: