Методика непрерывной интеграции, доставки и развертывания (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 может потребоваться доступ к разным сетям для развертывания кода в разнообразных средах. Если сети не будут надлежащим образом защищены или изолированы, злоумышленники с доступом к одной среде могут использовать этот доступ для эксплуатации уязвимостей внутренних сетей с целью получения доступа к другим серверам через слабые места серверов CI/CD.
Требуемые стратегии изоляции и защиты зависят от топологии сети, инфраструктуры и требований к управлению и разработке. Очень важно помнить, что ваши системы CI/CD представляют собой очень важные цели для злоумышленников, поскольку они часто имеют высокий уровень доступа к другим критически важным системам. Защита внешнего доступа к серверам и жесткий контроль внутреннего доступа помогут снизить риск взлома вашей системы CI/CD.
Инструменты для внедрения передовых практик тестирования и развертывания также помогают системам CI/CD оптимизировать процесс разработки и повысить качество кода. Для распространения кода через конвейеры CI/CD необходимо сделать так, чтобы каждое изменение соответствовало кодифицированным стандартам и процедурам вашей организации. Любые неисправности конвейера CI/CD сразу же становятся заметными, и при их возникновении процесс разработки новых версий останавливается на последующих этапах цикла. Такой механизм защищает важные среды от ненадежного кода.
Для использования этих преимуществ требуется внедрить надлежащую производственную дисциплину, чтобы все изменения рабочей среды проходили через ваш конвейер. Конвейер CI/CD должен быть единственным механизмом поступления кода в производственную среду. Это может делаться автоматически в конце успешного тестирования с применением практик непрерывной разработки, а также посредством ручного распространения протестированных изменений, одобренных и опубликованных через систему CI/CD.
Очень часто команды разработчиков используют конвейеры для развертывания, но при этом допускают исключения при возникновении проблем и необходимости их срочного решения. Хотя простои и другие проблемы необходимо устранять как можно скорее, при этом очень важно понимать, что система CI/CD обеспечивает отсутствие ошибок, новых неисправностей и других побочных эффектов при внедрении изменений. Развертывание исправлений через конвейер (или просто использование системы CI/CD для отката) также предотвращает удаление напрямую установленных исправлений при развертывании следующих версий. Конвейер защищает целостность как плановых обновлений, так и экстренных обновлений, призванных устранить текущие проблемы. Такое использование системы CI/CD также дает еще одну причину обеспечить максимальное быстродействие конвейера.
Конвейеры CI/CD используются для развертывания изменений через тестовые комплекты и среды развертывания. Изменения, проходящие проверку на соответствие требованиям на одном этапе, автоматически развертываются или помещаются в очередь ручного развертывания для сред с более высокими требованиями. Ранние этапы тестирования призваны подтвердить ценность тестирования и внедрения изменений на уровнях, находящихся ближе к производственной среде.
На более поздних этапах воспроизведение производственной среды в тестовых средах обеспечивает более точное соответствие тестов реальной реакции производственной среды на изменения. При значительных отличиях между тестовыми и производственными средами существует вероятность возникновения при развертывании проблем, которые не наблюдались при тестировании. Чем больше будет заметно отличий между рабочей средой и тестовой средой, тем меньше уверенности в стабильной работе приложений дают тесты.
Небольшие отличия между тестовыми и производственными средами закономерны, но их необходимо контролировать и хорошо понимать. Некоторые организации используют схему развертывания «синий-зеленый» для переключения производственного трафика межжду двумя практически идентичными средами, которые по очереди выполняют функции рабочей и тестовой среды. Менее экстремальные стратегии предусматривают использование в тестовой среде той же конфигурации, что и в рабочей среде. но в уменьшенном масштабе. Конечные точки сети и другие подобные элементы разных сред могут отличаться, однако параметризация такого типа переменных данных поможет обеспечить единообразие кода и четкое определение отличий разных сред.
Основная цель конвейера CI/CD — обеспечить уверенность в изменениях и минимизировать вероятность непредвиденного негативного воздействия. Мы обсудили важность поддержания соответствия сред, однако один компонент такого соответствия заслуживает особого внимания. Если для вашего программного обеспечения требуется этап сборки, упаковки или объединения в комплект, этот этап должен выполняться только один раз, и его результат должен многократно использоваться в масштабах всего конвейера.
Это правильно поможет предотвратить проблемы, возникающие при многократной компиляции или упаковке программного обеспечения, в результате чего могут возникать небольшие несоответствия или ошибки. Отдельная сборка программного обеспечения на каждом новом этапе означает, что в предыдущем тестировании использовалось не то же самое программное обеспечение, что делает результаты недействительными.
Для предотвращения этой проблемы в системы CI должен быть включен процесс сборки на первом этапе конвейера, предусматривающий создание и упаковку программного обеспечения в чистой среде. Полученную сборку с присвоенным номером версии следует выгрузить в хранилище артефактов, откуда она будет извлекаться на следующих частях конвейера. Это гарантирует, что на разных участках системы будет использоваться одна и та же сборка.
Хотя быстрая работа конвейера в целом очень важна, некоторые части комплекса тестирования будут неизбежно выполняться быстрее других. Поскольку система CI/CD обрабатывает все изменения в системе, очень важно как можно раньше обнаруживать любые неполадки, чтобы минимизировать выделение ресурсов на проблемные варианты сборки. Для этого желательно в приоритетном порядке выполнять самые быстрые тесты. Сложные и длительные тесты лучше отложить до тех пор, пока вы не проверите сборку с помощью небольших и быстрых тестов.
Такая стратегия дает ряд преимуществ, помогающих оптимизировать процесс CI/CD. Она помогает лучше понять влияние отдельных тестов на производительность, быстро выполнять основную часть тестов и раньше выявлять неполадки, что позволит отменить проблемные изменения или внести исправления, до того, как неполадки скажутся на работе.
Приоритетное тестирование подразумевает первоочередное выполнение тестов проектного компонента, поскольку эти тесты обычно быстрые, изолированные и ориентированы на конкретные элементы. Тесты интеграции идут следующими по скорости и сложности, затем идут системные тесты, а на последнем этапе идут приемочные испытания, в которых обычно принимают участие операторы.
Один из главных принципов CI/CD — быстро и часто интегрировать любые изменения в главное общее хранилище. Это помогает избежать дорогостоящих проблем с интеграцией на поздних этапах, когда разные разработчики записывают большие, разнородные и даже конфликтующие друг с другом пакеты изменений в главное хранилище непосредственно перед выпуском. Обычно системы CI/CD настраиваются для мониторинга и тестирования изменений, влияющих на одно или несколько ответвлений проекта.
Чтобы использовать все преимущества CI в полной мере. лучше всего ограничить количество и состав ответвлений в вашем хранилище. В большинстве вариантов реализации предполагается, что разработчики будут записывать изменения непосредственно в главное хранилище или хотя бы раз в день синхронизировать его с локальными ответвлениями.
Ответвления, которые не отслеживаются системой CI/CD, содержат непроверенный код, и должны рассматриваться как риск для успеха и скорости выполнения проекта. Минимизация ответвлений для быстрой интеграции кода разных разработчиков помогает использовать сильные стороны системы и не дает разработчикам аннулировать ее преимущества.
Продолжая вышесказанное, также разработчикам рекомендуется выполнять как можно больше тестов на локальном уровне, прежде чем записывать изменения кода в общее хранилище. Это позволяет обнаруживать определенные проблемные изменения до того, как они начнут мешать работе других членов команды. Хотя в локальной среде разработки вряд ли можно будет выполнить полный набор тестов, такой же как в производственной среде, этот дополнительный шаг дает разработчикам уверенность, что их код соответствует требованиям базовых тестов, и его стоит интегрировать в основную базу кода.
Чтобы разработчики могли эффективно выполнять тестирование самостоятельно, набор тестов должен запускаться с помощью одной команды из любой среды. Та же самая команда, которую будут использовать разработчики на своих локальных компьютерах, должна использоваться системой CI/CD для запуска тестов кода в хранилище. Обычно для координации используется скрипт оболочки или файл makefile, которые автоматизируют инструменты тестирования, помогая получать воспроизводимые и прогнозируемые результаты.
Чтобы все тесты на разных этапах выполнялись одинаково, имеет смысл использовать чистые абстрагированные среды тестирования, если это возможно. Обычно это означает, что тесты выполняются в контейнеров для абстрагирования разницы между системами хоста и предоставления стандартного API для объединения компонентов в различных масштабах. Поскольку контейнеры работают с минимальным состоянием, побочные эффекты тестирования не воспроизводятся при последующих запусках набора тестов, что могло бы исказить результаты.
Еще одно преимущество контейнерных сред тестирования — удобство переноса и воспроизведения инфраструктуры тестирования. С помощью контейнеров разработчики могут легко воспроизвести конфигурацию на следующих этапах конвейера без ручной настройки и обслуживания инфраструктуры и без необходимости жертвовать удобством среды. Поскольку контейнеры можно легко развертывать и уничтожать, пользователям реже придется идти на компромиссы в отношении точности среды тестирования при запуске локальных тестов. Использование контейнерных блокировок в целом помогает минимизировать различия между разными этапами конвейера.
Хотя разные виды реализации CI/CD могут различаться, следование некоторым из этих базовых принципов поможет избежать распространенных проблем и оптимизировать практики тестирования и разработки. Непрерывная интеграция и сочетание процессов, инструментов и правил работы помогут сделать изменения в разработке более успешными и эффективными.
Чтобы узнать больше об общих практиках CI/CD и о настройке различных служб CI/CD, читайте другие статьи с пометкой CI/CD.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!
Sign up for Infrastructure as a Newsletter.
Working on improving health and education, reducing inequality, and spurring economic growth? We'd like to help.
Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.