Что такое CI/CD-пайплайн?

Что же все-таки такое пайплайн непрерывной интеграции и доставки? И как его настроить?

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

Задача CI/CD — сократить время, необходимое для доставки ПО пользователям, без ущерба для качества. Чтобы этого добиться, нужно внедрять изменения как можно чаще, тщательно их тестировать и быстро обрабатывать полученную обратную связь. При таком подходе необходим автоматизированный CI/CD-пайплайн.

Как работает CI/CD-пайплайн

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

Стратегическая задача CI/CD — поставить этот процесс на регулярную основу: запускать его несколько раз в день или даже в час. Поэтому необходима максимальная автоматизация. Успешное завершение одного этапа автоматически запускает следующий. Если на каком-то этапе произошел сбой, об этом должно быстро прийти уведомление, чтобы проблему можно было устранить.

Автоматизация не только ускоряет процесс сборки, тестирования и развертывания в целом, но и обеспечивает надежное последовательное выполнение каждого этапа.

Этапы билд-пайплайна

Конкретная конфигурация вашего CI/CD-пайплайна зависит от типа продукта, который вы разрабатываете, и от требований вашей организации, однако есть общие для всех пайплайнов принципы:

  1. Процесс начинается с коммита в ветку main или любую другую ветку, выбранную вами для непрерывной интеграции. После коммита автоматически запускается либо сборка, либо первый набор юнит-тестов. Результаты обычно отображаются на панели мониторинга. Пайплайн можно настроить так, чтобы он останавливался при ошибках сборки или тестов, давая вам возможность исправить проблемы. После устранения проблемы пайплайн запускается с начала, чтобы вы могли убедиться, что все работает правильно. В качестве альтернативы пайплайн можно настроить так, чтобы он продолжал работу, но отмечал ошибки для дальнейшего расследования.
  2. На следующем этапе выполняется ряд автоматических тестов, и после каждого раунда тестирования обрабатывается обратная связь. Обычно тесты выстраиваются таким образом, чтобы сначала выполнялись самые быстрые, — это позволяет как можно раньше получить первую обратную связь. Ресурсоемкие тесты выполняются в последнюю очередь, и только если все предыдущие шаги прошли успешно. Опять же, если тест не проходит, можно либо остановить пайплайн и начать заново, либо продолжить работу, создав задачу для дальнейшего расследования.
  3. После завершения автоматических тестов обычно выполняется развертывание ПО в тестовых средах. Некоторые из них могут использоваться для дополнительного ручного тестирования, другие — для обучения, поддержки и предварительного знакомства пользователей с ПО.
  4. Последний этап CI/CD-пайплайна включает в себя внесение изменений в реальном времени. Релиз может запускаться вручную (при непрерывной доставке) или автоматически (при непрерывном развертывании).

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

Флаги и ветки

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

Частые коммиты — важный аспект CI/CD, но, если работа над какой-то большой функцией занимает несколько дней или даже недель, регулярные коммиты до завершения работы могут оказаться палкой о двух концах.

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

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

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

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

Сборки и тесты

После запуска пайплайна при коммите идут этапы сборки и тестирования. Автоматизированные юнит-тесты, как правило, запускаются перед сборкой вместе с проверками кода и статическим анализом.

Используемые инструменты сборки (например, Ant или Maven) и особенности шагов сборки зависят от конкретного языка и фреймворка. Запуская <автоматическую сборку на выделенном билд-сервере, можно избежать дальнейших проблем с пропущенными зависимостями — классических ошибок типа «а у меня все работает».

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

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

Контейнеры и виртуальные машины

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

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

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

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

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

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

Предпроизводствен­ные среды

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

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

Например, тестовые среды должны обновляться с каждой новой сборкой, а предпроизводственные среды можно обновлять реже — например, раз в день или раз в неделю с использованием самой свежей успешной сборки.

Развертывание

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

Релиз вручную (его еще называют «непрерывная доставка») удобен, если:

  • Вы хотите контролировать выпуск новых функций и возможностей.
  • Развертывание обернется простоем пользователей.
  • Ваш продукт требует установки, и вы хотите выпускать изменения пакетами в соответствии с заранее установленным графиком.

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

Выводы

CI/CD — это практика DevOps, которая использует автоматизацию для быстрого получения обратной связи на каждом этапе разработки. Она помогает находить и исправлять ошибки сразу после внесения изменений, делая разработку более эффективной. Перемещая проверки на более ранние стадии (по принципу «сдвига влево») и получая обратную связь быстрее, вы можете сразу обнаруживать ошибки. Создание автоматизированного пайплайна помогает применять эти техники на практике.

Проектировать собственный CI/CD-пайплайн лучше поэтапно, начиная с непрерывной интеграции. Конкретные этапы и логика запуска каждого из них зависят от продукта и организации работы.

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

Как вам поможет TeamCity

Наше решение TeamCity Pipelines помогает автоматизировать существующие CI/CD-процессы.

За счет поддержки основных систем контроля версий и интеграции с популярными инструментами сборки, тестирования и управления пакетами, TeamCity Pipelines поможет преобразовать ваши рабочие процессы в эффективные автоматизированные пайплайны.

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

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

Остались вопросы? Загляните в раздел вопросов и ответов.