Быстрая доставка качественного программного обеспечения стала важнее, чем когда-либо, в современной индустрии разработки ПО. Конвейеры непрерывной интеграции и непрерывной доставки (CI/CD) стали стандартными инструментами для команд разработчиков, позволяющими перемещать код от разработки к производству. Обеспечивая частые интеграции кода и автоматизированную развертку, конвейеры CI/CD помогают командам избежать так называемого «ада интеграции» и обеспечивают надежный цикл выпуска программного обеспечения.
В этой статье мы узнаем основы работы конвейеров CI/CD – что они собой представляют, как работают и почему они необходимы в современной разработке программного обеспечения. Мы рассмотрим различные этапы конвейера CI/CD, приведем реальные примеры использования инструментов, таких как GitHub Actions, и обсудим стратегии оптимизации производительности вашего конвейера.
Кроме того, мы поговорим о выборе правильной платформы CI/CD для вашей организации, учитывая такие факторы, как облачные решения против самохостинга, возможности интеграции и удобство использования.
Итак, давайте начнем.
Что такое CI/CD-конвейер?
CI и CD означают Непрерывная интеграция и Непрерывная поставка. В самых простых терминах, непрерывная интеграция (CI) – это метод, при котором изменения кода вносятся регулярно и надежно. Надежность обновлений кода, объединенных в репозиторий, обеспечивается автоматическими процедурами сборки и тестирования, запускаемыми CI. Затем код быстро и эффективно разворачивается в рамках процесса CD. CI/CD-конвейер, используемый в программной индустрии, представляет собой автоматизацию, которая позволяет разработчикам надежно переносить инкрементальные изменения кода со своих машин в тестовую среду и производство.
До того, как практика CI/CD стала стандартной, команды разработчиков часто сталкивались с тем, что называлось «адом интеграции». Разработчики работали изолированно в течение недель или месяцев, что приводило к болезненным процессам интеграции при слиянии кода. Развертывание было ручным и подвержено ошибкам, часто требуя окон обслуживания на выходных.
Появление гибких методов и необходимость более быстрых циклов поставки привели к развитию практик CI/CD. То, что начиналось как простые скрипты для автоматизации сборок, превратилось в сложные конвейеры, способные доставлять изменения кода в производство несколько раз в день.
CI/CD также часто включает в себя непрерывное развертывание, что означает, что код, размещенный в репозитории, будет автоматически развернут в производственной среде. Вместе эти взаимосвязанные практики обычно называются "конвейером CI/CD". Они обычно поддерживаются с использованием подхода DevOps или SRE. Наличие конвейеров CI/CD имеет множество преимуществ, таких как улучшение сотрудничества, повышение качества кода и создание более гибких и надежных систем.
Конвейер CI/CD состоит из нескольких этапов:
📥 Этап источника: Код извлекается из системы контроля версий, такой как Git.
🔧 Этап сборки: Приложение компилируется или собирается из исходного кода.
✅ Этап тестирования: Автоматические тесты выполняются для проверки целостности кода.
🚀 Этап развертывания: Приложение развертывается в промежуточных или производственных средах.
Однако могут включаться и другие виды деятельности, такие как анализ кода, контрольные точки утверждения, настройка переменных окружения, мониторинг и оповещения.
Пример реального конвейера CI/CD может выглядеть следующим образом:
Фиксация кода: Разработчик отправляет код в репозиторий GitHub.
Автоматическая сборка: GitHub Actions запускает рабочий процесс, который собирает приложение.
Автоматическое тестирование: Рабочий процесс выполняет модульные и интеграционные тесты.
Развёртывание в промежуточной среде: Если тесты проходят успешно, приложение разворачивается в промежуточной среде.
Утверждение для производства: Член команды просматривает и утверждает развёртывание.
Разворачивание в производственной среде: Приложение разворачивается в рабочей среде.
Вот пример рабочего процесса GitHub Actions для приложения на .NET. Когда код отправляется в основную ветку, конвейер запускает задание, которое восстанавливает зависимости, собирает приложение и запускает тесты, чтобы убедиться, что всё работает правильно. Если тесты проходят успешно, оно публикует приложение и загружает артефакты. Далее конвейер автоматически разворачивает приложение в промежуточной среде для дальнейшего анализа. Перед продолжением развёртывания в промежуточную среду требуется ручное утверждение. После того как назначенный рецензент утвердит, конвейер развернёт приложение в производственной среде.
Оптимизация CI/CD-конвейера
Если у вас уже есть CI/CD-конвейер, вы можете сделать несколько вещей, чтобы улучшить его производительность, особенно если весь процесс занимает много времени:
1.Определение узких мест
🔀 Недостаточная параллельность: Процессы, выполняемые последовательно, могут замедлить работу конвейера. Включайте параллельное выполнение там, где это возможно.
⏳ Длительные тесты: Оптимизируйте или распараллеливайте тесты, которые занимают слишком много времени.
2.Оптимизация процесса сборки
🗑️ Удаление ненужных зависимостей: Уберите неиспользуемые библиотеки или модули.
⚙️ Оптимизация настроек сборки: Настройте инфраструктуру для ускорения времени сборки.
3.Повышение эффективности тестирования
🎯 Приоритет критических тестов: Сначала запускайте самые важные тесты, чтобы выявить серьезные проблемы на ранних этапах.
🐳 Использование контейнеров для тестирования: Изолируйте тесты в контейнерах для создания стабильных сред.
4.Использование кеширования и артефактов
📦 Кеширование зависимостей: Сохраняйте зависимости, чтобы избежать их повторной загрузки.
♻️ Повторное использование артефактов сборки: Используйте артефакты из предыдущих этапов, чтобы сэкономить время.
Если мы посмотрим на предыдущий рабочий процесс GitHub Actions, то можем улучшить несколько моментов, таких как:
Кэширование зависимостей: Используйте кэширование, чтобы избегать повторной загрузки пакетов NuGet при каждом запуске.
Параллельные задания: Запускайте задачи сборки и тестирования параллельно, когда это возможно. Задача развёртывания в промежуточной среде зависит от сборки, но не от развёртывания в производственной среде. Задача развёртывания в производственную среду зависит как от сборки, так и от развёртывания в промежуточную среду.
Условное развёртывание: Разворачивайте в производственной среде только тогда, когда код помечен версией релиза (если: startsWith(github.ref, 'refs/tags/').
Стратегия быстрого отказа: Настроить конвейер таким образом, чтобы он завершался сразу после возникновения ошибки. По умолчанию, GitHub Actions останавливает задачу, когда шаг завершается неудачно, однако мы добавили условие if: success(), чтобы гарантировать, что последующие шаги будут выполняться только в случае успешного завершения предыдущих шагов.
Выборочное выполнение тестов: Выполняйте только затронутые тесты, чтобы сократить время тестирования.
Как выбрать платформу CI/CD
При выборе подходящей платформы CI/CD для вашей компании следует учитывать несколько факторов:
1.Облачная платформа против самохостинговых решений. Всё больше компаний переходят на облачные инструменты CI. Обычно облачные технологии CI/CD включают веб-интерфейс для управления вашими конвейерами сборки, а агенты сборки или исполнители размещаются на публичной или частной облачной инфраструктуре. Для облачных систем установка и обслуживание не требуются. С самохостящимися альтернативами вы можете решить, разместить ли сервер сборки и агентов сборки в частном облаке, на оборудовании, расположенном на вашем предприятии, или в общедоступной облачной инфраструктуре.
2.Удобство использования. Платформа должна быть простой в использовании и управлении, иметь удобный интерфейс и точную документацию.
3.Интеграция с языками программирования и инструментами. Платформа CI/CD должна легко интегрироваться с теми инструментами, которыми уже пользуется ваша команда, включая системы контроля версий, языки программирования, средства отслеживания проблем и облачные платформы.
4.Настройка. Настройка ваших автоматизированных конвейеров CI/CD включает в себя настройку всего: от триггеров, запускающих каждый прогон конвейера, до реакции на сбой сборки или теста. Эти настройки могут быть выполнены через сценарии или пользовательский интерфейс (UI).
5.Знание платформы. Как и в любой другой технологии, всегда стоит учитывать, обладают ли наши инженеры знаниями и опытом работы с платформой, которую мы хотим выбрать. Если нет, нужно проверить наличие качественной документации. Некоторые платформы лучше документированы, некоторые — хуже.
Популярные платформы CI/CD, занимающие более 80% рынка:
GitHub Actions: Новая платформа CI/CD от Microsoft, тесно интегрирующаяся с её платформой распределённой системы контроля версий GitHub и корпоративным решением GitHub Enterprise. Это отличный выбор, если ваша компания уже использует GitHub в качестве системы контроля версий и хранит все свои коды в GitHub, и вам не важно, что ваш код строится и тестируется удалённо на серверах GitHub.
Jenkins: Открытая платформа CI/CD на базе Java. Она очень гибкая и поддерживает множество конфигураций, но требует больше времени на установку. Отличный вариант для бизнеса и пользователей, предпочитающих самостоятельно управлять своей платформой CI/CD локально из-за соображений безопасности или юридических требований, либо если программное обеспечение, которое строится и тестируется на платформе CI/CD, предъявляет специфические требования к аппаратному и программному стеку.
JetBrains TeamCity: Это универсальное решение CI/CD подходит для различных рабочих процессов и методик разработки. Оно позволяет создавать конфигурации CI/CD с помощью языка программирования Kotlin, используя возможности полноценного языка программирования и его мощный набор инструментов. JetBrains TeamCity предлагает встроенную поддержку языков, таких как Java, .NET, Python, Ruby и Xcode, и расширяет эту функциональность за счёт богатой экосистемы плагинов. Кроме того, TeamCity интегрируется с такими инструментами, как Bugzilla, Docker, Jira, Maven, NuGet, Visual Studio Team Services и YouTrack, усиливая свою функциональность в вашей среде разработки.
CircleCI: Известен простотой использования для начала работы с системой непрерывной интеграции. Он предлагает облачный хостинг или корпоративный хостинг внутри предприятия и интеграцию с GitHub, GitHub Enterprise и Bitbucket в качестве поставщика DVCS. Это хороший выбор, если вы уже интегрированы с GitHub или Bitbucket и предпочитаете более простую модель ценообразования вместо оплаты за минуты сборки, как в других хостинг-платформах.
Azure DevOps: Позволяет выполнять развёртывание во всех основных провайдерах облачных вычислений и предоставляет готовые интеграции как для локальных, так и для облачных агентов сборки. Он предоставляет Azure Pipelines в качестве службы сборки и развёртывания, а также Agile Board и Test Plans для исследовательского тестирования. Также имеется Azure Artifacts, который позволяет делиться пакетами из публичных или частных реестров.
GitLab CI: Вам не нужен сторонний инструмент или интеграция для разработки, тестирования, развёртывания или мониторинга вашего приложении.
GitLab CI: Для разработки, тестирования, развёртывания или мониторинга приложений с помощью GitLab CI/CD вам не нужны сторонние приложения или интеграции. GitLab использует шаблоны CI/CD для генерации и выполнения базовых конвейеров для сборки и тестирования вашего приложения после автоматического определения языка программирования. Затем вы можете настроить развёртывание, чтобы отправлять ваши приложения в рабочую и промежуточную среды.
Travis CI: Вы можете автоматизировать дополнительные шаги в процессе разработки, управляя развёртываниями и уведомлениями, а также автоматически собирая и тестируя изменения кода. Это означает, что вы можете использовать стадии сборки, чтобы рабочие процессы зависели друг от друга, настраивать уведомления, готовить развёртывание после сборки и выполнять множество других операций.
AWS CodePipeline позволяет автоматизировать конвейеры релизов для быстрой и надёжной модернизации приложений и инфраструктуры. Это полностью управляемое решение для непрерывной доставки. Каждый раз, когда происходит изменение кода, CodePipeline автоматизирует части процесса выпуска, такие как сборка, тестирование и развёртывание в соответствии с моделью выпуска, которую вы устанавливаете.
Bitbucket: Этот дополнительный модуль для Bitbucket Cloud позволяет пользователям начинать автоматизированные процессы сборки, тестирования и развёртывания при каждом коммите, пуше или запросе на включение. Bitbucket Pipelines изначально интегрирован с Jira, Trello и другими продуктами Atlassian.
Другие инструменты включают Bamboo, Drone, AppVeyor, Codeship, Spinnaker, IBM Cloud Continuous Delivery, CloudBees, Bitrise, Codefresh и многие другие.
➡️ Выбор правильной облачной платформы CI/CD
Вот как найти лучшую для вашей команды:
Масштабируемость и производительность
Начните с оценки потребностей вашего проекта в масштабировании и производительности. Если важна возможность масштабирования и обработки множества сборок, рассмотрите мощные платформы, такие как CircleCI или AWS CodePipeline. Их инфраструктура предназначена для эффективного управления большими нагрузками.
Платформы вроде Azure DevOps идеально подходят для облачных сред, если вы уже вложились в экосистему Microsoft. Эти инструменты предлагают хорошую интеграцию с другими сервисами в облаке.
Простота использования и кривая обучения
Кривая обучения может оказаться важным фактором для вашей команды. Инструменты, такие как GitHub Actions и Travis CI, являются хорошими примерами, поскольку они предлагают удобные интерфейсы и простую настройку. Ваша команда сможет быстро настроить конвейеры без необходимости обширного предыдущего опыта или обучения.
Возможности настройки и расширения
Ищите платформы с хорошими возможностями настройки для сложных рабочих процессов. Jenkins и TeamCity — хорошие варианты в этом плане, так как они предоставляют богатую экосистему плагинов и гибкую конфигурацию для удовлетворения специализированных требований проектов.
Структура затрат
Наконец, оцените стоимость. Некоторые платформы, например GitLab CI/CD и Bitbucket Pipelines, предлагают щедрые бесплатные уровни, которые могут быть достаточными для небольших команд или проектов. Другие могут взимать плату в зависимости от использования, функций или количества пользователей. Убедитесь, что цена соответствует вашему бюджету и планам роста.
Также ознакомьтесь с моим полным планом по DevOps на 2024 год с (в основном) бесплатными обучающими ресурсами в живом репозитории с более чем 12 тысячами ⭐ .
Другие способы, как я могу вам помочь
Мастер-класс для создателей контента в LinkedIn. В этом мастер-классе я делюсь своими стратегиями по увеличению вашего влияния в LinkedIn в сфере технологий. Вы узнаете, как определить свою целевую аудиторию, освоить алгоритм LinkedIn, создавать впечатляющий контент с помощью моей системы написания и разработать стратегию создания контента, которая даст заметные результаты. Сейчас мастер-класс стоит всего 29 долларов!
Реальная проверка резюме. Я теперь предлагаю новую услугу – просмотр вашего резюме и профиля в LinkedIn с мгновенной обратной связью от лица технического директора. Вы узнаете, что привлекает внимание, что требует улучшения, и как рекрутеры и менеджеры по инженерии воспринимают ваше резюме при первом взгляде.
Продвигайте себя среди 36 000+ подписчиков, спонсируя этот дайджест. Этот дайджест позволит вам выйти на аудиторию, состоящую из многих инженерных лидеров и старших инженеров, которые влияют на технические решения и покупки.
Присоединяйтесь к моему сообществу на Patreon: Это ваш способ выразить мне благодарность и получить дополнительные преимущества. Вы получите эксклюзивные бонусы, включая все мои книги и шаблоны по шаблонам проектирования, приоритетам и многому другому стоимостью 100 долларов, ранний доступ к моему контенту, инсайдерские новости, полезные ресурсы и инструменты, приоритетную поддержку и возможность влиять на мою работу.
Индивидуальное коучинговое сопровождение: Запишитесь на сессию со мной. Индивидуальный коучинг доступен для личных тем роста и развития организаций/команд. Я помогу вам стать высокоэффективным лидером и инженером 🚀.