Одна кодовая база

Это нужно для того, чтобы прозрачно собирать и разворачивать любое количество релизов. Явное нарушение этого правила - размазывание кода одного приложения по нескольким репозиториям. Приемлемо использовать один репозиторий для хранения кода нескольких приложений, однако нужно стремиться к однозначному соответствию “репозиторий - приложение”.

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

Управление зависимостями

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

Чёткое разделение стадий Сборки, Релиза, Запуска

Сборка выполнение определенных команд (компиляция, упаковка и т.п.) с целью получить единственный артефакт. Релиз - это объединение артефакта сборки с определенной для конкретного окружения конфигурацией и зависимостями (вроде ОС, сервера приложений и т.п.). Запуск - это выполнение релиза с помощью той или иной платформы.

Внешняя конфигурация

Логирование

Журналы системы должны рассматриваться как потоки событий приложения. Для записи подходят стандартные выводы stdout/stderr, а сбор логов выполняет какая-нибудь сторонняя система или платформа развертывания.

Источники: