Table of Contents

Самый простой пример CI/CD

Однажды подслушано:

- А… А что мы сейчас делаем?

- Деплой приложения.

- А что такое деплой?

- Деплой… Ну это деплой, что тут не понятного?

IMG_1

И действительно, для тех, кто в “теме”, все очевидно - берем приложение на Python, заворачиваем в Docker, кладем в GitLab, выкатываем через CI/CD в Кubernetes. Но тем, кто только учится, с таким обилием незнакомых технологий, приходится нелегко. Можно сравнить с катанием на сноуборде - пока “голова” и “тело” не освоят сразу несколько неочевидных навыков - вдоволь “наваляешься”:) Поэтому, и в сноуборде, и в любом другом виде спорта есть “подводящие” упражнения и я хочу предложить сегодня одно из таких.

В этой статье я буду отталкиваться от бытующего мнения, что в “девопсы” чаще всего идут системные администраторы, поэтому, вместо программы на Python возьмём какой-нибудь популярный сервис, например proxy Squid, поместим его конфигурацию в GitLab и настроим CI/CD тестирование и применение изменений конфигурации на сервере. Чтобы руководство было воспроизводимым, опишу все необходимые шаги для развертывания стенда в домашних условиях с использованием виртуальной машины (VM) в VirtualBox.

Шаг 1. Развертывание VM

Скачайте и установите VirtualBox:

https://www.virtualbox.org/wiki/Downloads

Создайте VM, подключив к ней образ дистрибутива, например:

https://www.debian.org/download

Или, можно воспользоваться готовым образом, например моим:

https://val.bmstu.ru/unix/img/My%20Documents/debian_11.1_64_01.ova

В настройках системы назначьте не менее 4096 МБ основной памяти (4GB RAM), подключите сетевой адаптер “мостом” к сетевой карте Вашего компьютера (хост системы), и запустите VM.

Проведите инсталляцию системы, в большинстве экранов можно оставить значения по умолчанию (GUI не обязателен) установите сервис SSH. Можно оставить вариант автоматического (через сервис dhcp) назначения ip параметров. После финальной перезагрузки, подключитесь к консоли системы и узнайте назначенный ей ip адрес командой ip a.

Если используете мой образ, то нужно подключиться к VM после запуска (учетная запись student/password), поднять привилегии, настроить получение ip параметров по dhcp, активировать интерфейс и выяснить назначенный системе ip, выполнив команды:

student@debian:~$ sudo -i

debian:~# nano /etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp
debian:~# ifup eth0

debian:~# echo 127.0.1.1 $(hostname) >> /etc/hosts

Последняя инструкция дана для исключения предупреждений о невозможности получить ip по hostname сервисов sudo и proxy Squid (выполнить ее можно на 2-м шаге, скопировав после подключения к VM по SSH).

Шаг 2. Разворачиваем сервис Squid

Для удобства копирования команд из статьи, подключитесь к VM используя SSH клиент. Если у Вас Windows на домашнем компьютере, можно использовать PuTTY:

https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html

Установите Squid, отредактируйте файлы конфигурации (для нашего примера будет удобно использовать вариант, при котором proxy будет “пускать” только на определенные сайты, что позволит легко протестировать работу сервиса), убедитесь в отсутствии синтаксических ошибок и перезапустите сервис, выполнив команды:

student@debian:~$ sudo -i

debian:~# apt update

debian:~# apt install squid -y

debian:~# nano /etc/squid/permit_domains.txt
.debian.org
.linux.org.ru
debian:~# nano /etc/squid/conf.d/my.conf
acl permit_domains dstdomain "/etc/squid/permit_domains.txt"
http_access allow permit_domains
debian:~# squid -k check

debian:~# squid -k reconfigure

Для тестирования сервиса настройте браузер на хост системе, например, Firefox

https://www.mozilla.org/ru/firefox/new/

указав ip адрес Вашей VM (здесь и далее, замените 192.168.1.102 на тот, который у Вас)

IMG_2

В результате должны “открываться” только сайты, перечисленные в файле permit_domains.txt

Шаг 3. Устанавливаем GitLab

Установите GitLab, используя официальное руководство

https://about.gitlab.com/install/#debian

или набор команд ниже, не забыв исправить ip адрес в EXTERNAL_URL на Ваш:

debian:~# apt install -y curl ca-certificates perl

debian:~# curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | bash

debian:~# EXTERNAL_URL="http://192.168.1.102" apt-get install gitlab-ce

Подключаемся к GitLab в браузере с хост машины, по указанному при инсталляции EXTERNAL_URL, учетной записью root и паролем, который нужно скопировать из файла:

debian:~# cat /etc/gitlab/initial_root_password

В разделе “Admin→Users→New User” создайте нового пользователя (предлагаю, тоже student) задав атрибуты

Name: student
Username: student
Email: student@localhost

Для упрощения примера, не будем настраивать электронную почту в VM, поэтому, сразу после создания (“Create User”) учетной записи, перейдите в ее редактирования (“Edit”), придумайте, запомните и дважды укажите пароль (потребуют хороший пароль:) после чего, сохраните изменения (“Save сhanges”)

Подключитесь новой учётной записью (на предложение указать новый пароль можно ввести предыдущий)

Шаг 4. Размещаем конфигурацию proxy сервера в GitLab

Создаем новый проект “Create a project”→“Create blank project”

Указываем Project name: squid project и убираем “галочку” “Initialize repository with a README”, поскольку будем загружать репозиторий, который создадим на следующем шаге.

Выполняем инструкции из подсказки в разделе “Push an existing folder”, задав в начале git параметр user.email

debian:~# git config --global user.email student@localhost

debian:~# cd /etc/squid/

debian:/etc/squid# git init --initial-branch=main

debian:/etc/squid# git remote add origin http://192.168.1.102/student/squid-project.git

debian:/etc/squid# git add .

debian:/etc/squid# git commit -m "Initial commit"

debian:/etc/squid# git push -u origin main

“Щелкнув” по названию проекта убедитесь, что все файлы из каталога /etc/squid появились в GitLab. Для изменения файлов конфигурации теперь можно не подключаться через SSH к VM с сервисом Squid, а отредактировать их прямо здесь через “Web IDE”. Остается вопрос, как эти изменения попадут в VM с сервисом Squid?

Шаг 5. GitLab Runner

Установите GitLab Runner, используя официальное руководство:

https://docs.gitlab.com/runner/install/linux-manually.html

или набор команд ниже:

debian:~# curl -LJO "https://gitlab-runner-downloads.s3.amazonaws.com/latest/deb/gitlab-runner_amd64.deb"

debian:~# dpkg -i gitlab-runner_amd64.deb

Если первая команда работает слишком долго, можно скачать старую версию с моего сайта, для нашего примера она подойдет:

debian:~# wget http://val.bmstu.ru/unix/Git/gitlab-runner_amd64.deb

Разрешим пользователю gitlab-runner выполнять команды с повышенными привилегиями, необходимые для тестирования, копирования и применения новой конфигурации proxy:

debian:~# nano /etc/sudoers.d/squid-sudo
gitlab-runner ALL=NOPASSWD: /bin/cp -r ./* /etc/squid/, /usr/sbin/squid -k *

Проверим, все ли работает. Для этого добавьте домен какого-нибудь сайта в файл permit_domains.txt используя “Web IDE” в GitLab и выполните Commit изменений в ветку main. Далее, с правами пользователя gitlab-runner, склонируйте проект, зайдите в его каталог и выполните команды тестирования, копирования и применения новой конфигурации:

debian:~# su - gitlab-runner

gitlab-runner@debian:~$ git clone http://192.168.1.102/student/squid-project.git

gitlab-runner@debian:~$ cd squid-project/

gitlab-runner@debian:~/squid-project$ sudo /usr/sbin/squid -k check -f conf.d/my.conf

gitlab-runner@debian:~/squid-project$ sudo /bin/cp -r ./* /etc/squid/

gitlab-runner@debian:~/squid-project$ sudo /usr/sbin/squid -k reconfigure

Если новый сайт открывается, значит все готово к автоматизации!

Шаг 6. GitLab CI/CD

Зарегистрируйте GitLab Runner в GitLab. Для этого, подключитесь к GitLab учетной записью root (см. Шаг 3) а в командной строке запустите процесс регистрации:

debian:~# gitlab-runner register

укажите http://localhost/ в качестве “GitLab instance URL

Enter the GitLab instance URL (for example, https://gitlab.com/):
http://localhost/

в GitLab в разделе Admin→CI/CD→Runners нажмите на кнопку “Register an instance runner” скопируйте и вставьте в командную строку “registration token”

Enter the registration token:
xxxxxxxxxxxxxx-xxxxxxx

оставьте значение поля “description” без изменений

Enter a description for the runner:
[debian]:

в качестве списка “tags” укажите единственное значение squid-tag, оно нам скоро пригодится

Enter tags for the runner (comma-separated):
squid-tag

оставьте “optional maintenance” без изменений, на WARNING не будем обращать внимание (хотя скоро статью придется переписывать:), главное - наличие сообщения о успешной регистрации

Enter optional maintenance note for the runner:

WARNING: ...
Registering runner... succeeded                     runner=oDSeAdUz

в качестве “executor” выберите shell (начнем с него:)

Enter an executor: docker-ssh, virtualbox, instance, docker-ssh+machine, kubernetes, custom, docker, parallels, shell, ssh, docker+machine:
shell

Убедитесь что в GitLab, в разделе разделе Admin→CI/CD→Runners наш Runner находится в режиме Online и снова подключитесь к нему учетной записью student

В проекте “squid project” зайдите в раздел CI/CD→Editor и нажмите на кнопку “Configure Pipeline”

Замените текст Pipeline на этот:

stages:
  - test
  - deploy

test1-job:
  stage: test
  script:
    - sudo /usr/sbin/squid -k check -f conf.d/my.conf
  tags:
    - squid-tag

deploy1-job:
  stage: deploy
  script:
    - sudo /bin/cp -r ./* /etc/squid/
    - sudo /usr/sbin/squid -k reconfigure
  tags:
    - squid-tag

и нажмите на кнопку “Commit Changes”.

Добавьте домен еще какого-нибудь сайта в файл permit_domains.txt используя “Web IDE” в GitLab и выполните Commit изменений в ветку main.

Убедитесь, что в разделе CI/CD→Pipelines проекта значение Status установилось в passed, в браузере открывается новый сайт, а добавленный домен присутствует в файле:

debian:~# cat /etc/squid/permit_domains.txt

Если так, поздравляю, Вы только что написали свой первый CI/CD Pipeline!

Итоги

Такой вот “игрушечный” деплой, от которого можно оттолкнуться в сторону настоящих “DevOps” решений. Если что-то нужно уточнить, обращайтесь в комментариях!

На этом все, спасибо, что дочитали до конца, если такой подход к обучению DevOps технологиям вызовет интерес, напишу аналогичные статьи по ansible, docker, k8s и прочим!