User Tools

Site Tools


самый_простой_пример_ci_cd

This is an old revision of the document!


Самый простой пример 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 и активировать интерфейс, выполнив команды:

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 (выполнить ее можно на 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 и убедитесь, что в браузере открывается новый сайт. Если так, поздравляю, Вы только что написали свой первый CI/CD Pipeline!

Итоги

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

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

самый_простой_пример_ci_cd.1676221157.txt.gz · Last modified: 2023/02/12 19:59 by val