Рубрики
Uncategorized

Best Practices Enterprise CI/CD — часть 2

Это вторая часть в нашей серии «Best Practices Enterprise CI/CD». Смотрите также часть 1 для … Tagged с DevOps, Cloud, CI, CD.

Best Practices Enterprise CI/CD (3 серии деталей)

Это вторая часть в нашей серии «Best Practices Enterprise CI/CD». См. Также часть 1 для предыдущей части и часть 3 для следующей части.

Лучшая практика 8 — автоматизируйте все ваши тесты

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

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

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

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

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

Лучшая практика 9 — сделайте свои тесты быстро

Следствием предыдущего раздела также является быстрое выполнение тестов. Если тестовые наборы должны быть интегрированы в трубопроводы доставки, они должны быть очень быстрыми. В идеале время теста не должно быть больше времени упаковки/компиляции, что означает, что тесты должны закончиться через пять минут и не более 15.

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

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

К сожалению, большую часть времени ожидает испытаний от неэффективных методов тестирования и отсутствия оптимизации. Обычным фактором медленного теста является код, который «спит» или «ожидает», чтобы событие произошло, что делает тест пробежать дольше, чем должно работать. Все эти операторы сна должны быть удалены, и тест должен следовать архитектуре, основанной на событиях (то есть, отвечая на события вместо того, чтобы ждать, пока что-то произойдет)

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

Таким образом, тестовые люксы должны быть быстрыми (5-10 минут), и огромные тесты, которые требуют часа, должны быть реформированы и переработаны.

Лучшая практика 10-Каждый тест автоматически очищает свои побочные эффекты

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

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

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

  1. Пусть все тесты пройдут, а затем очистите действия всех из них в конце испытательного костюма
  2. Получите каждую тестовую очистку после его запуска (рекомендуемый подход)

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

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

Лучшая практика 11 — Используйте несколько тестовых люксов

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

Это означает, что несколько типов тестов должны существовать в любом хорошо продуманном приложении. Некоторые из наиболее распространенных примеров:

  • Действительно быстрые модульные тесты, которые рассматривают серьезные регрессии и очень быстро заканчиваются
  • Более длительные интеграции тесты, которые ищут более сложные сценарии (такие как транзакции или безопасность)
  • Стресс и нагрузочное тестирование
  • Контрактные тестирование для изменений используемых внешних услуг API
  • Тесты на дым, которые можно работать на производстве, чтобы проверить выпуск
  • Пользовательские тесты, которые тестируют пользовательский опыт

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

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

Затем после утверждения запроса на вытяжение, остальные тесты (такие как тесты на дым в производстве) будут работать для проверки ожидаемого поведения.

Некоторые тестовые костюмы могут быть очень медленными, что привлечение их по требованию на каждый запрос на притяжение слишком сложно. Запуск напряжения и нагрузочного тестирования обычно происходит прямо перед выпуском (возможно, группировка нескольких запросов на вытяжение) или запланированным образом (a.k.a. Ночные сборки) Точный рабочий процесс не важен, так как у каждой организации есть разные процессы. Важно, чтобы возможность изолировать каждый набор тестирования и иметь возможность выбрать один или несколько для каждого этапа в жизненном цикле программного обеспечения.

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

Лучшая практика 12 — Создайте тестовые среды По требованию

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

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

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

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

Преимущества динамических испытательных сред не могут быть переоценены:

  1. Каждый разработчик может тестировать изолированно без каких -либо конфликтов с тем, что другие разработчики делаем
  2. Вы платите за ресурсы испытательных сред только во время их использования
  3. Поскольку тестовые среды отбрасываются в конце, нечего поддерживать или очистить

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

Лучшая практика 13 — пробежать тестовые апартаменты одновременно

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

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

Решение состоит в том, чтобы принять лучшую практику 10, и каждый тест подготовил свое состояние и убрать за себя. Тесты, которые только для чтения (то есть не имеют никаких побочных эффектов), могут работать параллельно по определениям.

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

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

Лучшая практика 14 — Сканирование безопасности является частью процесса

Многие организации по -прежнему следуют традиционной модели водопада разработки программного обеспечения. И в большинстве случаев анализ безопасности происходит в конце. Программное обеспечение производится, а затем в исходном коде выполняется сканирование безопасности (или даже тест на проникновение). Результаты опубликованы, и разработчики пытаются решить все проблемы.

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

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

Сканирование безопасности также должно иметь соответствующую глубину. Вам нужно проверить по крайней мере:

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

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

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

Лучшая практика 15 — Обзоры качества сканирования/кода являются частью процесса

Подобно сканированию безопасности, сканирование кода должно быть частью повседневной операции разработчиков. Это включает:

  1. Статический анализ кода для одобренного компании стиль/форматирование
  2. Статический анализ кода для проблем безопасности, скрытые ошибки
  3. Анализ времени выполнения кода для ошибок и других проблем

Хотя существуют существующие инструменты, которые обрабатывают аналитическую часть, не все организации автоматически выполняют эти инструменты. Очень распространенная модель, которую мы видим, — это энтузиастические команды программного обеспечения, пообещающие использовать эти инструменты (например, Sonarqube) для следующего проекта программного обеспечения, только чтобы забыть о них через некоторое время или полностью игнорировать предупреждение и ошибки, представленные в аналитических отчетах.

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

Продолжение на части3.

Фотография обложки от Неспособный .

Best Practices Enterprise CI/CD (3 серии деталей)

Оригинал: «https://dev.to/codefreshio/enterprise-ci-cd-best-practices-part-2-3o24»