Ответ 1
О, мальчик. Вы сталкиваетесь с проблемами CD в реальном мире. Действительно хорошие вопросы.
Ответ немного зависит от очень тесно связанных разработок по различным проектам.
В моей идеальной ситуации для вас было бы иметь несколько "особых" условий тестирования. В одном случае вы можете рассмотреть тестовую среду для каждого проекта. Когда будет завершена сборка проекта A, вы подталкиваете ее в среду A, которая имеет последние одобренные/производственные версии для B/C, и вы можете проводить там базовые интеграционные тесты. Если они пройдут, вы продвигаете сборку в среду тестирования интеграции, где последняя хорошая A, развертывается по последним B и C для той же версии. Когда тестовая среда интеграции проходит тесты, вы можете продвигать ее содержимое в виде набора релизов, содержащего известные версии A, B и C. Этот набор релизов будет развернут в любых средах UAT, Staging или Production.
Основная идея состоит в том, чтобы дать каждому проекту степень изоляции, чтобы он мог быть хорошо протестирован, даже если другие проекты (временно) сильно сломаны, при этом как можно быстрее дойдя до полных интеграционных тестов. Мы также хотим удостовериться, что все, что мы находим на самом деле, пройдет интеграционные тесты, будут продвигаться вместе. Выбор и выбор версий проекта для выпуска, которые не были протестированы вместе, слишком рискованны для моего вкуса.
На самом деле это тема, о которой я рассказываю довольно много. Если вы не возражаете, я приведу несколько презентаций, которые я рассказывал по этим темам.
1) Масштабирование CI для параллельной разработки (совместно с Крисом Луккой из Accurev)
Это хорошо говорит о широких стратегиях сбалансирования изоляции и интеграции. Большая часть этого предполагает, что подпроекты объединяются в общую базу кода, но принципы могут применяться к независимо построенным и развернутым модулям с небольшим воображением.
2) Использование uDeploy с Jenkins (требуется регистрация)
Это больше ориентировано на продукт, но почти полностью отражает идею использования тестовой среды интеграции для нескольких проектов, создавая набор выпусков (мы называем это "моментальным снимком" ) и продвигаем это. Наша интеграция с TeamCity довольно схожа, но я думаю, что стратегия, проводимая там, может быть более важной.
3) Слайды, визуализирующие многокомпонентный конвейер:
http://www.slideshare.net/Urbancode/adapting-deployment-pipelines-for-complex-applications