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

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

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

Конвейер развертывания

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

Управление конфигурацией

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

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

Автоматизация сборки

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

Автоматизированное тестирование

Компонентные и интеграционные тесты гарантируют, что код делает то, что должен, и не меняет существующую функциональность. Любая новая функциональность должна быть покрыта тестами, чтобы защититься от будущих изменений, которые могут непреднамеренно повредить их. Автоматизированные тесты должны выполняться в среде, наиболее близкой к производственной среде, а ручное тестирование должно быть сведено к минимуму. В конце концов, кто хочет проводить ручное тестирование? Такие платформы, как Espresso (Android) и SWTBot (Java), могут снять большую часть ручной работы.

Доставка

После того, как код успешно прошел тесты, он будет доставлен пользователям, опять же максимально автоматизированным. Например, если программное обеспечение является приложением для Android, оно будет опубликовано в Play Store, и пользователи получат уведомление об обновлении. В среде Eclipse пользователи получат обновление через соответствующий сайт обновлений. В настоящее время существует достаточно инструментов, помогающих автоматизировать доставку: например, Jenkins and Co предлагают различные подключаемые модули для поддержки этого.

Основываясь на стратегии ветвления, упрощенный конвейер развертывания может выглядеть следующим образом:

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

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

Вывод

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

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

Это стало возможным благодаря:

Непрерывная интеграция
Быстрая обратная связь
Автоматизация
Тестирование звука

Статус «зеленой» сборки гарантирует нам, что все работает наилучшим образом. Эта гарантия зависит исключительно от структуры конвейера развертывания и качества тестирования. Здесь могут помочь такие методы, как разработка через тестирование.

Первоначально опубликовано на blogs.itemis.com.