Jenkins + Docker

Дружим Jenkins и Docker, чтоб можно было при пуше в репу собирать и деплоить Docker-образы в Jenkins-контейнере

Запуск Jenkins в контейнере

Делаем Dockerfile, на основе которого собираем jenkins-контейнер с докером на борту:

FROM jenkins/jenkins:lts

USER root

# Ставим докер
RUN apt-get update
RUN apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg2 \
    software-properties-common -y
RUN curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
RUN add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/debian \
   $(lsb_release -cs) \
   stable" 
RUN apt-get update
RUN apt-get install docker-ce docker-ce-cli containerd.io -y

# Даем права на использование докера jenkins-юзеру
RUN usermod -aG docker jenkins

USER jenkins

Jenkins-контейнер сделан на основе Debian, соответственно Docker нужно ставить как на Debianarrow-up-right

circle-info

Чтоб на локалке не запускать докер через sudo, нужно добавить себя в докер группу:

sudo usermod -a -G docker $USER

и переподключиться по ssh

Собираем:

Запускаем собранный контейнер:

Поподробнее:

  • -p 8081:8080 -p 50000:50000 - открываем порты для внешнего мира

  • --restart unless-stopped - перезапуск, если контейнер не застопан руками

  • -v /opt/jenkins_home:/var/jenkins_home - связваем контейнер с директорией /opt/jenkins_home, чтоб все работало при перезапуске контейнера

  • -v /var/run/docker.sock:/var/run/docker.sock - связываем докер внутри контейнера с докером на локалке, чтоб jenkins мог деплоить контейнеры на локалку

  • --name jenkins jenkins-docker - обзываем контейнер и запускаем сборку

После запуска jenkins должен начать робить на 8081 порту

При первом запуске jenkins потребует пароль, который можно получить вызвав:

Интерфейс Jenkins после аутентификации

Создание Item'а сборки

В данном туториале, будем делать item с типом pipeline:

В Build Trigger ставим Build when a change is pushed to BitBucket - для запуска сборки при пуше в репозиторий (доступно с плагиномarrow-up-right). Также необходимо создать вебхук в BitBicket:

В Pipeline > Definition указываем путь к репозиторию, где лежит Jenkinsfile (о нем ниже)

Если репозиторий приватный, то можно задать доступы используемые при клонировании:

Важно задать ID, чтобы можно было использовать доступ на этапе сборки

Jenkinsfile

Стадии сборки можно определять в специальном файле - Jenkinsfile:

Файл выше делает следующие вещи:

  • клонит репозиторий, используя доступы с созданным ранее ID

  • Запускает docker build

  • Запускает bash-скрипт, который перезапускает docker-контейнер со свежей сборкой:

Когда файл запушен, можно начинать сборку

Ссылки

Last updated

Was this helpful?