Непрерывная интеграция и развёртывание ПО: лучшие практики

Введение

Непрерывная интеграция и развёртывание (CI/CD)  —  это гибкая методология, используемая многими организациями. Она помогает им эффективно и безопасно поставлять своё программное обеспечение.

Согласно опросу GitLab 2020 DevSecOps survey, почти 83% разработчиков стали выпускать код быстрее и чаще, а 59% компаний делают по нескольку релизов за день. Это связано со внедрением методологий DevOps и в первую очередь с непрерывной интеграцией, автоматизированным тестированием и непрерывным развёртыванием программного обеспечения.

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

Надёжность

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

Конвейеры непрерывной интеграции должны быть быстрыми

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

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

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

Запуск и сборка в изолированной среде

Запуск конвейеров CI/CD в изолированной среде всегда является важным аспектом с точки зрения безопасности. Кроме того, таким образом обеспечивается близкое соответствие условиям промежуточной и производственной среды. Благодаря чему результаты тестов будут более точными и достоверными.

Для запуска тестовых наборов мы можем использовать Docker или любые другие контейнерные инструменты. В Docker-контейнере также можно установить любые дополнительные зависимости для нашего приложения. Таким образом можно обеспечить выполнение тестов в полностью изолированной среде. Причём тесты не будут испытывать никакого влияния со стороны хоста. Большинство организаций имеют обыкновение ради большей безопасности развёртывать инструменты CI/CD в собственной облачной инфраструктуре, благо у платформы CI/CD есть полный доступ к репозиторию кода.

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

Соответствие между промежуточной и производственной средами

Рекомендуется всегда поддерживать соответствие между промежуточной и производственной средами. Так можно избежать малейшей возможности возникновения простоев в продакшене из-за непредвиденных ошибок во время выполнения тестов. В промежуточной среде конвейеры CI/CD проходят этапы прогона тестов и развёртывания. После тестирования приложение автоматически переводится в производственную среду или развёртывается вручную.

Очень трудно полностью «отзеркалить» производственную среду для тестирования и разработки. Но мы можем принимать критически важные решения всякий раз, когда необходимо сделать эти среды максимально похожими. И понимать компромиссы, на которые при этом приходится идти. В большинстве организаций также используются сине-зелёная и канареечная стратегии развёртывания, когда мы развёртываем приложение на продакшене с примерно 1% реального трафика и мониторим его. После чего оно переходит на продакшен со 100% трафиком или легко откатывается к предыдущим выпускам.

Заключение

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

Читайте также:

Читайте нас в Telegram, VK и Яндекс.Дзен


Перевод статьи Ankit Jain: CI/CD Best Practices