Основы DevOps. Конспект. CI/CD и инструменты для создания пайплайнов

Сейчас от разработчиков очень часто требуется намного больше, чем просто писать код. Предполагается, что они будут уметь тестировать, собирать приложения и деплоить их. Все эти операции довольно трудоёмкие и в некоторых командах выполняются другими людьми, но в маленьких командах или личных проектах необходимо всё это уметь одному человеку. Да и в больших компаниях не помешает понимать весь этот процесс.

Не утонуть во всех понятиях и деталях и сделать все процессы быстрее и эффективнее помогает подход DevOps, который объединяет работу разработчиков (Dev) и операторов (системный администраторов – Ops). По сути, этот подход убирает пробел между двумя независимыми отделами, делая процесс разработки и деплоя приложения более «гладким».

Основные понятия: CI/CD

Continuous Integration (CI). Это практика, при которой приложение автоматически собирается и тестируется каждый раз, когда разработчик отправляет изменения в репозиторий.

Желательно это проворачивать при каждом коммите – то есть даже по несколько раз в день. То есть мы проверяем, как интегрируются новые изменения в уже существующее приложение.

Регулярные коммити помогают избежать работы с ветками, которые устаревают и потом требуют внимательных мёржей (merge).

По идее, разработчик сначала собирает и тестирует проект локально, а потом уже отправляет на общий сервер.

Continuous Delivery (CD). Это второй шаг. Здесь проверяем, будет ли каждое изменение работать в продакшне. Мы создаём среду, близкую к продакшну, и там запускаются интеграционные тесты. Такая среда может быть развернута в Docker-контейнерах или виртуалках: главное, чтобы она вела себя как реальный прод.

То есть мы проверяем, будет ли наше изменение работать на проде, в наших реальных условиях, но пока ещё туда ничего не деплоим, а только имитируем их.

Continuous Deployment. Финальный шаг. Если все тесты прошли успешно, то изменения автоматически выкатываются прямо на прод.

Преимущества CI/CD

Во-первых, эти практики помогают улучшить атмосферу в команде: взаимодействие между отделами становится легче.

Кроме этого, в команде меньше стресса из-за релизов, потому что каждый коммит теперь можно считать релизов – все они, по идее, оказываются в продакшне довольно быстро. Поэтому больше не нужно ждать месяцы, а потом трястись – всё ли будет работать, как надо.

Далее, конечно, метрика, которую можно выразить в числах. Время выката новой фичи уменьшается. Ну и так как многие этапы становятся автоматизированными, у команды появляется больше времени на работу над задачами.

Также эти практики позитивно сказываются на безопасности.

Этапы CI/CD пайплайна

В этом разделе разберу общий пример пайплайна для веб-приложения. Важно помнить, что нет универсального варианта, но тем не менее, главные принципы CI/CD работают везде.

Вот типовая последовательность этапов, которые встречаются в пайплайнах:

  1. Коммит – Система контроля версий. Коммит исходного кода в систему контроля версий, например GitHub или GitLab, которые запустят дальнейший процесс.
  2. Сборка. Cборка приложения с помощью CI-систем, например, Jenkins (о них подробнее будет ниже в статье).
  3. Тесты. Юнит-тесты и интеграционные тесты.
  4. Артефакт. Сохранение артефактов, например, в Nexus или Docker Registry.
  5. Деплой в тестовую среду. Автоматическая выкладка в тестовую среду (например, в контейнер). Здесь можно провести интеграционные тесты уже на среде, схожей с продом. Также не стоит забывать про security-тесты, например, с Gauntlt.
  6. Ручная проверка. End-to-end тесты (UI-тесты), например, с Selenium.
  7. Деплой на прод. Автоматический или полуавтоматический деплой в прод, например с Chef.
  8. Мониторинг. Сбор логов, метрик и автоматическое уведомление о сбоях.

Лучшие практики CI/CD

Основная идея – коммитить меньше и чаще, и тестировать, соответственно, тоже как можно чаще. Поэтому автотесты – такой же код, как и основное приложение, и их нужно поддерживать.

Также нужно помнить, что работа разработчика не заканчивается после коммита – успех достигнут, только если код встал в прод без сбоев. Иначе нужно откатиться до прошлой сборки – поэтому важно использовать системы контроля версий. И не отправлять в прод нестабильные сборки, которые не прошли все тесты.

Ручное тестирование должно быть точечным и фокусироваться на том, что сложно автоматизировать.

Всё должно быть кодом (Infrastructure as Code (IaC)): конфигурации, инфраструктура, деплой-скрипты – всё в системе контроля версий. Автоматическое создание окружений снижает вероятность багов.

Сборка и деплой должны быть быстрыми (в идеале – минуты).

В идеале пайплайн превращается в предсказуемый конвейер:

код → сборка → артефакт → тест → деплой → мониторинг.

Всё автоматизировано, хранится в версиях и отлажено.

Типы инструментов для CI/CD. Их плюсы и минусы.

Теперь время перейти к примерам инструментов, которые можно использовать для создания пайплайнов. Конечно, их очень много, и я почти никакие пока не трогал, но некоторые потрогаю в следующей статье, где буду создавать пайплайн.

А в этой секции рассмотрю четыре категории инструментов, понимание которых сильно упростит выбор.

Self-Hosted

Примеры: Jenkins, Bamboo, TeamCity

Эти инструменты устанавливаются и обслуживаются вручную: на сервере в дата-центре, в виртуальной машине в облаке или на локальной машине разработчика.

Из плюсов: гибкость (вы сами выбираете полный стек технологий и даже железо), полный контроль над данными (соответственно, их безопасность – вы не боитесь утечки данных у провайдера).

Из минусов: необходимость всё настраивать и поддерживать самостоятельно, поэтому сложная машсштабируемость и высокий порог входа (для новичков может быть сложный вариант).

Jenkins пример бесплатного инструмента с множеством плагинов и поддержкой от коммьюнити. А TeamCity, например, хорошо интегрируется с IDE, что может быть важно, если вы тоже пишете на джаве в Idea.

Software as a Service

Примеры: Travis CI, CirkleCI

Эти инструменты хранятся у провайдера, а вы просто регистрируетесь и используете их. Обновление и поддержка инфраструктуры ложится на плечи провайдера.

Из плюсов: простота использование, быстрое начало, не нужно тратиться на свою инфраструктуру, да и сервисы предлагают для начала недорогие (или даже бесплатные) тарифы.
Из минусов: масштабирование может потребовать значительные финансовые затраты, и риск утечки данных (проблема безопасности может быть актуальна и для следующих категорий).

Cloud Providers

Примеры: AWS CodePipeline, AWS CodeBuild, Azure Pipelines, CGP CloudBuild

Эта категория расширяет SaaS-модель, и её главное отличие, что на больших платформах (AWS, Azure, GCP) есть интеграция с другими сервисами этих провайдеров (VM, хранение данных, IAM и т.д.)

Из плюсов: нативная интеграция с инфраструктурой, масштабируемость.
Из минусов: привязка к экосистеме конкретного облака, довольно сложная конфигурация.

Code Repos

Примеры: GitHub Actions, GitLab CI, Bitbucket Pipelenies

Современные репозитории кода предлагают встроенные CI/CD-возможности. Вы храните код и тут же запускаете пайплайны.

Из плюсов: всё в одном месте, ест бесплатные опции.

Из минусов: может уступать по гибкости специализированным инструментам.


Для вступительного конспекта хватит, а в следующей статье буду настраивать пайплайн и показывать уже примеры из практики.

Оставьте комментарий