> For the complete documentation index, see [llms.txt](https://potykion.gitbook.io/pypc-tlbx/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://potykion.gitbook.io/pypc-tlbx/devops/jenkins-+-docker.md).

# 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 нужно ставить [как на Debian](https://docs.docker.com/install/linux/docker-ce/debian/)

{% hint style="info" %}
Чтоб на локалке не запускать докер через sudo, нужно добавить себя в докер группу:

`sudo usermod -a -G docker $USER`

и переподключиться по ssh
{% endhint %}

Собираем:

```
docker build -t jenkins-docker .
```

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

```
docker run -p 8081:8080 -p 50000:50000 -d \
    --restart unless-stopped \
    -v /opt/jenkins_home:/var/jenkins_home \
    -v /var/run/docker.sock:/var/run/docker.sock \
    --name jenkins jenkins-docker
```

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

* `-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 потребует пароль, который можно получить вызвав:&#x20;

```
cat /opt/jenkins_home/secrets/initialAdminAndPassword
```

![Интерфейс Jenkins после аутентификации](https://3252960981-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LmUCZ2f_FSySzDyqnBU%2F-LoQ9By9TyV_vzTYtLSG%2F-LoQ9CxmQhu3KUMibRdP%2Fimage.png?alt=media\&token=327ef1c6-4fb9-414b-9133-f185cfea6144)

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

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

![](https://3252960981-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LmUCZ2f_FSySzDyqnBU%2F-LoQ9By9TyV_vzTYtLSG%2F-LoQBiQDfivsw3JYU9Ie%2Fimage.png?alt=media\&token=8a97028b-45cc-4aa8-acf1-6203608ad760)

В Build Trigger ставим Build when a change is pushed to BitBucket - для запуска сборки при пуше в репозиторий (доступно с [плагином](https://plugins.jenkins.io/bitbucket)). Также необходимо создать вебхук в BitBicket:

![](https://3252960981-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LmUCZ2f_FSySzDyqnBU%2F-LoAHfZzBtC8N4Clkkpu%2F-LoA_0ZEBYdhsEZBKJqP%2Fimage.png?alt=media\&token=4b14aa39-bc90-4bb5-ae41-88df13127d77)

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

![](https://3252960981-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LmUCZ2f_FSySzDyqnBU%2F-LoQ9By9TyV_vzTYtLSG%2F-LoQCLsSgfQ74Kvylf9O%2Fimage.png?alt=media\&token=1796f663-b54a-45b6-9dd8-e7e3c8d588db)

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

![](https://3252960981-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LmUCZ2f_FSySzDyqnBU%2F-LoQ9By9TyV_vzTYtLSG%2F-LoQDRZj97Mkwj_VD0Wn%2Fimage.png?alt=media\&token=87261b3b-fc2f-4d6c-893e-8df788cfc06d)

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

### Jenkinsfile

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

```
node {
  stage ('Checkout') {
    environment {
          BITBUCKET_COMMON_CREDS = credentials('19c1840f-f749-47cd-b81f-74ad3c44e21d')
    }

    checkout scm
  }

  stage 'build'
  docker.build('rbcn_app_front')

  stage 'deploy'
  sh 'bash deploy.sh'
}
```

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

* клонит репозиторий, используя доступы с созданным ранее ID
* Запускает `docker build`
* Запускает bash-скрипт, который перезапускает docker-контейнер со свежей сборкой:

```bash
#!/bin/bash
docker stop rbcn_app_front
docker rm rbcn_app_front
docker run --name rbcn_app_front -p 3001:3000 -d rbcn_app_front
```

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

### Ссылки

* [Основа](https://medium.com/@schogini/running-docker-inside-and-outside-of-a-jenkins-container-along-with-docker-compose-a-tiny-c908c21557aa)
* [Jenkins-контейнер](https://hub.docker.com/r/jenkins/jenkins/)
* [Гайд по Jenkinsfile](https://jenkins.io/doc/book/pipeline/getting-started/)
