У нас есть много приложений и веб-сервисов (некоторые общедоступные продукты, некоторые внутренние и часть частного «бэкэнда»), которые взаимозависимы друг от друга. Каждый из этих компонентов имеет 4 среды (кластеры серверов / узлов, обслуживающих определенные цели):
- Непроизводственные
DEV
- Интегрированная среда разработки, в которой CI создает push-изменения; полезно для инженеров для устранения трудно обнаруживаемых ошибок, которые не воспроизводятся локальноQA
- Изолированная QA / Среда тестированияDEMO
- Стабильная среда UAT для заинтересованных сторон
- производство
LIVE
- Наша живая / производственная среда
Продвижение кода идет: LOCAL
(машина разработчика) => DEV
=> QA
=> DEMO
=> LIVE
.
Скажем, у нас есть приложение с myapp
поддержкой веб-службы RESTful myws
, которое само поддерживается базой данных mydb
.
В настоящее время у нас есть то, что я бы назвал « организованным » продвижением среди этих зависимостей: myapp-dev
точки, myws-dev
которые используются mydb-dev
. Точно так же myapp-qa
указывает на то, myws-qa
что использует mydb-qa
. То же самое для DEMO
и LIVE
.
Проблема с этим состоит в том , что в любое время я внести изменения, скажем, myapp
это требует от меня , чтобы внести изменения в myws
и mydb
а. Но поскольку каждая DEV
среда указывает на среды своих зависимостей DEV
, это означает, что я должен планировать и развертывать эти изменения одновременно. Кроме того, если одна сборка становится нестабильной / сломанной, она часто приводит к отключению других вышестоящих компонентов; например , если перерывы разработчик что - то при изменении mydb-dev
, то myws-dev
и myapp-dev
кластеры обычно также становятся нестабильными.
Чтобы решить эту проблему, я собираю предложения для того, что я бы назвал « разрозненной » стратегию продвижения: все межкомпонентными зависимости следовать этим рекомендациям:
- Восходящие зависимости зависят от
DEMO
среды для своих последующих зависимостей, для всех их непроизводственных сред (DEV
,QA
иDEMO
); а также - Восходящие зависимости зависят от
LIVE
среды для их нижестоящих зависимостей для их производственной среды
Используя это соглашение, на myapp-dev
самом деле будет указывать myws-demo
, что будет использовать mydb-demo
. Точно так же myapp-qa
будет также указывать myws-demo
и mydb-demo
.
Преимущество, которое я могу найти, заключается в стабилизации сборки : гораздо менее вероятно, что DEMO
среда для определенного компонента станет нестабильной, потому что код не сможет этого сделать DEMO
без тщательного тестирования как на, так DEV
и на QA
.
Единственный недостаток, который я могу найти в этом методе, заключается в том, что, если он DEMO
не работает для определенного компонента, все непроизводственные среды для всех зависимых компонентов будут внезапно нарушены. Но я бы возразил, что это должно происходить крайне редко из-за проведенного тестирования DEV
и QA
.
Это меня проблема , что многие разработчики (гораздо умнее , и опытные , чем я сам) решили, и я не удивлюсь , если эта проблема и ее решение уже имеют название на них (кроме того , что я называю спланированным / разрозненным). Поэтому я спрашиваю: перевешивают ли преимущества стратегии продвинутого продвижения какие-либо недостатки, и какие недостатки я могу пропустить здесь?