Введение в лучшие практики CI / CD

Вступление

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

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

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

Держите ваши трубопроводы быстро

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

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

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

Изолируйте и защитите свою среду CI / CD

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

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

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

Сделайте конвейер CI / CD единственным способом развертывания в производство

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

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

Зачастую группы начинают использовать свои конвейеры для развертывания, но начинают делать исключения, когда возникают проблемы и возникает необходимость их быстрого решения. Хотя время простоя и другие проблемы должны быть устранены как можно скорее, важно понимать, что система CI / CD является хорошим инструментом, гарантирующим, что ваши изменения не приводят к появлению других ошибок или дальнейшей поломке системы. Внесение исправления в конвейер (или просто использование системы CI / CD для отката) также предотвратит удаление в следующем развертывании специального исправления, примененного непосредственно к производству. Конвейер защищает достоверность ваших развертываний независимо от того, был ли это регулярный, запланированный выпуск или быстрое исправление для решения текущей проблемы. Такое использование системы CI / CD является еще одной причиной для работы по связыванию: # keep-your-pipelines-fast [поддержите ваш конвейер быстрым].

Поддерживать паритет с производством везде, где это возможно

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

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

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

Создайте только один раз и продвигайте результат через конвейер

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

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

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

Проведите свои самые быстрые тесты рано

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

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

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

Минимизация ветвления в вашей системе контроля версий

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

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

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

Выполните тесты локально, прежде чем переходить на конвейер CI / CD

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

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

Проводите тесты в эфемерной среде, когда это возможно

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

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

Заключение

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

Чтобы узнать больше об общих практиках CI / CD и о том, как настроить различные службы CI / CD, ознакомьтесь с другими articles CI / с помощью CI / CD-тег.

Related