Есть третий путь, как вы сказали сами. Я думаю, что вы путаете разработку, тестирование и развертывание. Я предлагаю сначала рассмотреть весь SDLC в целом, чтобы понять, чего вы пытаетесь достичь. Это большая тема, но я сделаю все возможное, чтобы подвести итог.
TL; DR;
Короче, нужно отделить:
- ваш код от
- конфигурация приложения, от
- конфигурация системной среды.
Каждый должен быть независимым друг от друга и соответственно:
- контролируемая версия
- проверенный
- развертываемых
Более длинная версия
Во-первых, у вас есть приложение, состоящее из кода и (отдельных наборов) конфигурации. Это необходимо проверить как для функции сборки, так и для преднамеренной функции - это называется непрерывной интеграцией (CI). Существует много провайдеров этой услуги как онлайн, так и локально - например, CircleCI для облачного провайдера, который связывается с вашим репозиторием и создает и тестирует каждый раз, когда вы фиксируете. Если ваш репозиторий локальный и не может использовать облачного провайдера, что-то вроде Jenkinsбыл бы эквивалент. Если ваше приложение достаточно стандартное, вероятно, существует существующий образ Docker, который может использовать служба CI. Если нет, вам придется создать один или такой кластер, чтобы можно было развернуть код и конфигурацию вашего приложения. При правильной настройке у вас будет множество статистических данных о качестве кода вашего приложения.
Затем, как только вы будете удовлетворены функциональностью и правильностью вашего приложения, кодовая база должна быть соответствующим образом помечена для конкретной версии. Затем эта сборка должна быть развернута в тестовой среде. Обратите внимание, что код будет таким же, как проверенный в вашем CI (возможно, если вы сделали это правильно), но ваша конфигурация может отличаться. Опять же, некоторые поставщики CI могут предложить этот шаг, чтобы вы могли проверить развертывание упакованного приложения и дискретную конфигурацию. Этот этап обычно включает пользовательское функциональное тестирование (для новой функциональности), а также автоматическое тестирование (для известной функциональности). Если выпуск проходит этот этап, у вас есть кандидат на выпуск для интеграционного тестирования. Вы можете запустить тесты автоматизации из другого контейнера Docker,некоторые показатели, которые указывают на усилия по тестированию, составляют 1: 1 к усилиям по кодированию (хотя я сам не уверен в этом).
Предположительно, следующий шаг - это создание вашей (системной) среды, как если бы она была производственной. Если вы используете Docker в работе, то здесь вы будете думать об усилении безопасности, оптимизации сети и сервера и т. Д. Ваши образы Docker могут основываться на тех, которые вы использовали в разработке (в идеале), но могут быть изменения в масштабировании и безопасности. , как я сказал. К настоящему времени функциональное тестирование приложения должно быть завершено, вы больше озабочены безопасностью и производительностью. Согласно функциональному тестированию, ваши тесты могут быть разработаны, развернуты и запущены из других образов Docker. Этот шаг был ужасно дорогим и редко выполнялся, так как для этого требовалось выделенное оборудование, которое воспроизводило производство. Сегодня это вполне жизнеспособно, так как вы можете встать и разрушить всю среду практически любого масштаба по требованию.
Наконец, у вас есть выпуск, который должен быть готов к работе, с небольшим набором различий конфигурации от тестов интеграции (IP-адреса, URI базы данных, пароли и т. Д.). Точка и большинство системной конфигурации хотя бы один раз.