# Jenkins + Docker

### Запуск 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/)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://potykion.gitbook.io/pypc-tlbx/devops/jenkins-+-docker.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
