Как всем известно, непрерывная интеграция и доставка играют огромную роль в развертывании приложений. Однако, будучи новичком, вы можете столкнуться с определенными трудностями в понимании этой концепции и ее самостоятельном применении. В этой статье мы посмотрим, как без лишних хлопот освоить CI/CD.
Прежде чем начать, вам могут понадобиться следующие инструменты:
· Код бэкенда или фронтенда, хранящийся в репозитории GitHub
GitHub Actions
MicroK8s
Kustomize
Kubernetes
Docker Hub
Argo CD
Любой облачный провайдер (AWS, GCP, Azure)
Домен (GoDaddy)
MySQL
Часть 1: Действия и рабочие процессы GitHub
Сна��ала разверните виртуальную машину с помощью любого доступного облачного провайдера (бесплатного уровня более чем достаточно). Я использовал GCP в качестве облачного провайдера, но вы можете использовать любого другого.
Не забудьте присвоить вашей виртуальной машине публичный IP‑адрес. В противном случае мы не сможем получить доступ к виртуальной машине извне. Кроме того, разрешите доступ по SSH через порт 22.
Для настройки конвейера CI/CD вам понадобится рабочий код. Это не обязательно должен быть сложный сервис, для этой цели вполне подойдет простой проект «Hello World».
Теперь перейдите в раздел «Settings» вашего репозитория и выполните следующие действия:
Разверните раздел «Actions» на левой панели и выберите «General». Включите параметр «Allow all actions and reusable workflows». Обязательно сохраните изменения.
Добавьте новый саморазмещаемый раннер: нажмите «Runners», а затем выберите кнопку «New self‑hosted runner». Выполните все команды, указанные в этом разделе, на вашей виртуальной машине. Это позволит вам добавить вашу облачную виртуальную машину (ВМ) в качестве раннера в GitHub.
Создание рабочего процесса
Теперь нам нужно собрать образ Docker, используя наш код. Для этого вам необходимо создать учетную запись Docker Hub, если у вас ее еще нет. После создания учетной записи создайте частный репозиторий в своей учетной записи Docker Hub. Мы будем использовать этот репозиторий в качестве реестра контейнеров для хранения образов Docker.
Давайте добавим ваши учетные данные Docker Hub в ваш репозиторий GitHub, чтобы ваши рабочие процессы GitHub могли использовать их для отправки образов Docker после их сборки.
Снова перейдите в раздел «Settings» вашего репозитория GitHub. Разверните «Secrets and variables» на левой панели и выберите «Actions». Добавьте ваши учетные данные Docker Hub в качестве секретов.

Вам необходимо использовать эти секреты в предстоящем рабочем процессе GitHub. Создайте в своем репозитории каталог с именем «.github/workflows».
После этого, в данном каталоге создайте файл с именем «build_docker_image.yaml». Далее мы напишем рабочий процесс GitHub, который представляет собой часть конвейера, отвечающую за CI.
name: Build the docker image
# The workflow is activated when there is a push to the "demo_v1" branch.
on:
push:
branches:
- demo_v1
# Working directory of the virtual machine
env:
WORK_DIR: /home/demo
jobs:
build:
runs-on: demo-v1 #Runner Label
# Environment varibales
env:
IMG_REG: emp-manage
REPO: emp-manage-backend
REPO_PATH: /home/demo/emp-manage-backend
steps:
# Checkout the code to the VM
- name: check out the code
uses: actions/checkout@v4
- name: Get short SHA
uses: benjlevesque/short-sha@v3.0
id: short-shaa
with:
length: 5
- run: echo $SHA
env:
SHA: ${{ env.SHA }}
# Use the SHA output to name the upcoming release
- name: Set SHA Output to use in release
run: |
cd ${{ env.WORK_DIR }}
touch env_file.txt
chmod 766 env_file.txt
echo "${{ env.SHA }}" > env_file.txt
# Build the docker image
- name: build docker image
run: |
cd ${{ env.REPO_PATH }}/${{ env.REPO }}
docker build -t yashashp/${{ env.IMG_REG }}:${{ env.SHA }} .
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASS }}
- name: Push Docker image
run: |
docker push yashashp/${{ env.IMG_REG }}:${{ env.SHA }}
# Create a release from the built image
release:
runs-on: demo-v1
needs: build
steps:
- name: Get env
id: short-sha-value
run: |
cd /home/demo
sha=$(cat env_file.txt)
echo "tag=$sha" >> $GITHUB_ENV
- name: Create release
id: create_release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.github_token }}
with:
tag_name: ${{ env.tag }}
release_name: Release ${{ env.tag }}
body: New release for ${{ github.sha }}. Release notes can be found in the docs.
draft: false
prerelease: false
# Clean the environment in the VM
clean:
runs-on: demo-v1
needs: release
env:
REPO: emp-manage-backend
steps:
- name: clean working directory
run: |
cd ${{ env.WORK_DIR }}
rm env_file.txt
rm -rf ${{ env.REPO }}
rm -rf _PipelineMapping _temp _toolЯ использовал несколько общедоступных повторяющихся действий GitHub, доступных онлайн. Вы также можете использовать их при запуске этого рабочего процесса.
Теперь нам просто нужно запустить этот рабочий процесс. Как упоминалось в моем примере, мне нужно отправить изменения в ветку «demo_v1», чтобы запустить рабочий процесс. Поэтому я отредактирую свой файл README в репозитории и отправлю изменения.
Это запустит наш рабочий процесс и создаст образ Docker, используя наш код. Вы можете проверить это, перейдя на вкладку «Actions» в репозитории.

После завершения этого процесса образ Docker будет загружен в наш репозиторий Docker Hub.

Теперь, вы сможете найти этот образ в своем репозитории Docker. Войдите в свою учетную запись Docker и проверьте, доступен ли образ.

Часть 2: Microk8s и Argo CD
Если вы следовали инструкциям, представленным выше, у вас, возможно, уже настроена виртуальная машина в качестве исполнителя GitHub. В этом примере я буду использовать ту же виртуальную машину для развертывания Microk8s и Argo CD.
Я уже установил MySQL на этой виртуальной машине, поскольку приложению, которое необходимо развернуть в Microk8s, требуется доступ к базе данных.
Однако, вы можете сделать то же самое на отдельной виртуальной машине. Войдите в свою виртуалку, используя ее публичный IP‑адрес. Выполните следующие команды для установки Microk8s:
sudo snap install microk8s --classic
microk8s enable dns
microk8s enable storage
Теперь убедитесь, что Microk8s запущен на вашей виртуальной машине.

После выполнения следующей команды вы увидите узлы Microk8s.
root@demo-vm:~# microk8s kubectl get nodes
NAME STATUS ROLES AGE VERSION
demo-vm Ready <none> 23d v1.31.5
Это означает, что Microk8s успешно запущен.
Поскольку постоянно вводить «microk8s kubectl» в консоли несколько неудобно, мы создадим псевдоним для этой команды. Добавьте alias k=’microk8s kubectl’ в конец файла «.bashrc» и запустите «source ~/.bashrc», чтобы немедленно применить изменения без перезапуска терминала.
Установка Argo CD
В первой части этой статьи мы завершили раздел CI конвейера. Следующий шаг — настройка части CD. Для этого нам нужно установить Argo CD на узел MicroC8s.
k create namespace argocd
k apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
Давайте убедимся, что Argo CD успешно запущен.
root@demo-vm:~# k get po -n argocd
NAME READY STATUS RESTARTS AGE
argocd-application-controller-0 1/1 Running 8 (3h55m ago) 23d
argocd-applicationset-controller-64f6bd6456-twvhp 1/1 Running 8 (3h55m ago) 23d
argocd-dex-server-5fdcd9df8b-xpcb2 1/1 Running 8 (3h55m ago) 23d
argocd-notifications-controller-778495d96f-tf5fq 1/1 Running 8 (3h55m ago) 23d
argocd-redis-69fd8bd669-jjtgw 1/1 Running 8 (3h55m ago) 23d
argocd-repo-server-75567c944-p8ztv 1/1 Running 8 (3h55m ago) 23d
argocd-server-5c768cdd96-77kpr 1/1 Running 11 (3h55m ago) 23d
Теперь нам нужно изменить некоторые настройки в Argo CD, чтобы обеспечить доступ к серверу Argo CD извне сети виртуальной машины.
root@demo-vm:~# k get svc -n argocd
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
argocd-applicationset-controller ClusterIP 10.152.183.231 7000/TCP,8080/TCP 23d
argocd-dex-server ClusterIP 10.152.183.112 5556/TCP,5557/TCP,5558/TCP 23d
argocd-metrics ClusterIP 10.152.183.227 8082/TCP 23d
argocd-notifications-controller-metrics ClusterIP 10.152.183.232 9001/TCP 23d
argocd-redis ClusterIP 10.152.183.252 6379/TCP 23d
argocd-repo-server ClusterIP 10.152.183.106 8081/TCP,8084/TCP 23d
argocd-server NodePort 10.152.183.96 80:30000/TCP,443:30001/TCP 23d
argocd-server-metrics ClusterIP 10.152.183.180 8083/TCP 23d
Измените тип службы «argocd‑server» на NodePort. По умолчанию тип службы для «argocd‑server» — ClusterIP. Для этого выполните следующую команду:
k edit svc argocd-server -o yaml -n argocd
Добавьте новые порты узла для протоколов HTTP и HTTPS, чтобы разрешить доступ извне. Это также можно сделать с помощью указанной выше команды. Я использовал порты 30 000 и 30001.
ports:
- name: http
nodePort: 30000
port: 80
protocol: TCP
targetPort: 8080
- name: https
nodePort: 30001
port: 443
protocol: TCP
targetPort: 8080Убедитесь, что эти порты также разрешены в группах безопасности виртуальной машины. Теперь вы можете получить доступ к панели управления Argo CD, используя публичный IP‑адрес и порт виртуальной машины.
http://<VM-public-ip>:30000/

Часть 3: Создание манифестов Kustomize и настройка приложения в Argo CD.
На третьем этапе нам потребуется создать необходимые конфигурационные файлы Kustomize для развертывания приложения. Эти файлы должны храниться и поддерживаться в отдельном репозитории GitHub.
Сначала подготовьте репозиторий. Затем создайте три каталога внутри репозитория: apps, base и overlays/dev. Далее создайте файлы Kustomize, необходимые для развертывания вашего приложения на Microk8s. Ниже я привел манифесты Kustomize, относящиеся к моему примеру.
k8s‑kustomize/ │── apps/ │ └── kustomization.yaml │ ├── base/ │ ├── deployment.yaml │ ├── kustomization.yaml │ ├── service.yaml │ └── overlays/ └── dev/ ├── deployment‑patch.yaml └── kustomization.yaml
Репозиторий GitHub: https://github.com/yteep/k8s‑kustomize.git
Создание приложения в Argo CD
Давайте создадим новое приложение в Argo CD. Для этого войдите в Argo CD и выберите «Settings». Затем вы можете подключить свой репозиторий GitHub (тот, который используется для хранения манифестов Kustomize) к Argo CD.

Далее, укажите необходимые данные репозитория для подключения Argo CD к GitHub. Вам необходимо создать персональный токен доступа (PAT) в своей учетной записи GitHub, чтобы разрешить доступ к репозиторию «k8s‑kustomize». Используйте этот PAT в качестве пароля. В качестве имени пользователя вы можете использовать свое имя пользователя GitHub.

Выберите «Application» на левой панели, чтобы начать создание нового приложения. Далее добавьте новое имя приложения. Вы можете выбрать другие параметры в соответствии со своими предпочтениями. Я оставлю большинство из них по умолчанию.

В поле «Revision» выберите ветку, которую вы использовали для фиксации файлов Kustomize. Поле «Path» указывает Argo CD, где искать файлы Kustomize, необходимые для развертывания приложения. В моем примере я указываю каталог «apps» внутри репозитория.

В разделе «Назначение» выберите свой кластер и пространство имен. Argo CD постоянно проверяет соответствие желаемого состояния (источника) фактическому состоянию (назначение). Желаемое состояние: конфигурации, указанные вами в репозитории GitHub. Фактическое состояние: реальные конфигурации приложений, работающих в инфраструктуре Kubernetes.
Argo CD отвечает за поддержание этих состояний в равновесии. При возникновении расхождения состояний Argo CD немедленно принимает меры для устранения проблем OutOfSync и восстановления синхронизации состояний.

Теперь вы можете открыть это приложение, чтобы просмотреть ресурсы, развернутые в вашем кластере Microk8s.
Заключение
Это полное руководство по развертыванию простого конвейера CI/CD с использованием Argo CD и MicroK8s. Те, кто испытывает трудности с первым шагом в реализации конвейера CI/CD, могут использовать эту статью для того чтобы начать свой путь. Вы также можете улучшить эту предложенные настройки, используя дополнительные конфиг��рации. Это позволит вам расширить свои знания в области CI/CD.

Если хочется пойти дальше «одного пайплайна» и собрать цельную картину DevOps-практик, у OTUS есть курс «DevOps практики и инструменты». Он ведёт от карты практик к руками освоенным инструментам: IaC, CI/CD, конфиг-менеджмент, хранилища артефактов, работа с секретами и observability (метрики/логи/трейсы). Чтобы узнать больше о формате обучения и познакомиться с преподавателями, приходите на бесплатные демо-уроки:
25 декабря. Фениксы и снежинки: как строить инфраструктуру, которая не ломается. Записаться
14 января. IaC: Тестирование инфраструктуры — как внедрить инженерные практики и перестать бояться изменений. Записаться
22 января. eBPF: рентгеновское зрение для production. Видим сеть, безопасность и узкие места на уровне ядра Linux. Записаться
