Одна кодовая база
Это нужно для того, чтобы прозрачно собирать и разворачивать любое количество релизов. Явное нарушение этого правила - размазывание кода одного приложения по нескольким репозиториям. Приемлемо использовать один репозиторий для хранения кода нескольких приложений, однако нужно стремиться к однозначному соответствию “репозиторий - приложение”.
Отсюда следует, что совместно используемые несколькими приложениями модули должны упаковываться в библиотеку и храниться / собираться отдельно. Это также поднимает вопрос версионирования как собственно бинарников приложения, так и библиотек.
Управление зависимостями
Системы сборки вроде Maven
или Gradle
позволяют упаковывать все необходимые
зависимости в итоговый артефакт. Это дает возможность изолировать приложение от
окружения и гарантирует, что приложение будет использовать корректные версии
библиотек, а не будет полагаться на возможный хаос в окружении развертывания.
Чёткое разделение стадий Сборки, Релиза, Запуска
Сборка выполнение определенных команд (компиляция, упаковка и т.п.) с целью получить единственный артефакт. Релиз - это объединение артефакта сборки с определенной для конкретного окружения конфигурацией и зависимостями (вроде ОС, сервера приложений и т.п.). Запуск - это выполнение релиза с помощью той или иной платформы.
Внешняя конфигурация
Логирование
Журналы системы должны рассматриваться как потоки событий приложения. Для записи
подходят стандартные выводы stdout/stderr
, а сбор логов выполняет какая-нибудь
сторонняя система или платформа развертывания.