У нас есть много приложений и веб-сервисов (некоторые общедоступные продукты, некоторые внутренние и часть частного «бэкэнда»), которые взаимозависимы друг от друга. Каждый из этих компонентов имеет 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.
Это меня проблема , что многие разработчики (гораздо умнее , и опытные , чем я сам) решили, и я не удивлюсь , если эта проблема и ее решение уже имеют название на них (кроме того , что я называю спланированным / разрозненным). Поэтому я спрашиваю: перевешивают ли преимущества стратегии продвинутого продвижения какие-либо недостатки, и какие недостатки я могу пропустить здесь?