Продакшен и Деплой
Теория: Сборка проекта

Деплой на PaaS (Heroku, Render) дает нам представление того, как организовать его самостоятельно, на свой сервер. В общем случае, процесс выглядит так:
- Клонирование репозитория
- Сборка проекта. В нашем случае установка зависимостей
- Доставка на сервера. У нас пока один сервер
- Остановка старой версии и запуск новой
С точки зрения 12 факторов, важно разделять процесс сборки и релиза. Представьте что у нас 10 машин. Если мы начнем клонировать репозиторий на каждую из машин и выполнять там сборку, то получим множество неудобств:
- Если сборка пройдет неуспешно, то мы просто потратим ресурсы серверов впустую.
- Скачивание зависимостей это трафик, который стоит денег. Умножаем вес зависимостей на количество серверов.
- В случае отката на предыдущую версию, придется долго ждать пока заново выполнится сборка. Проблема даже с одним сервером.
Сборка, обычно, выполняется отдельно от релиза. Чаще всего ей занимается CI, который, после выполнения всех проверок, формирует какой-то артефакт: пакет под операционную систему (например deb), архив, Docker-образ. Последний стал стандартом де-факто. Все так или иначе переехали на Docker.
Разберем, как организовать сборку через CI, для любого проекта на примере devops-example-app
Сборка
Первым делом, нужно создать Dockerfile и добавить туда все шаги для подготовки приложения. Обычно это делается так, гуглится статья (официальные примеры), в которой упаковывается приложение на том же фреймворке и дальше методом проб и ошибок этот процесс повторяется, до тех пор, пока локально получится собрать образ, запустить его и увидеть готовое приложение. Для нашего приложения Dockerfile выглядит так:
Когда Dockerfile готов, а образ собирается и запускается, пора создать аккаунт на Docker Hub. Внутри добавляется репозиторий для хранения нашего Docker-образа, и, наконец, выполняется docker push. Так мы получаем образ, готовый для деплоя.

Остается последний шаг - автоматизация сборки с помощью Github Actions. Причем она будет практически идентичная для всех проектов, которые собираются с помощью Docker независимо от стека.
В этом workflow собирается образ с тегом latest, который обновляется после каждого коммита и успешного прохождения тестов. При таком подходе будет невозможно узнать какая прямо сейчас версия на продакшене и, что совсем плохо, будет невозможно откатиться на другую версию, если что-то пойдет не так. Поэтому помимо образа latest, который полезен для постоянного тестирования процесса сборки, нужен отдельный workflow, в котором готовятся образы с тегами под каждую версию.
Такой workflow запускается не на коммиты, а на создание тега в git. Этот же тег затем используется и для Docker-образа. Ниже пример обновленного workflow, который нам подходит:
Запуск проверок для latest не нужен, так как он уже был проверен во время сборки по коммиту. Это сэкономит время на сборку.
В этой системе есть один момент, который нужно учитывать. Создавать тег можно только тогда, когда выполнится сборка latest. Иначе этот воркфлоу сделает тег из старого образа. Обойти это ограничение можно автоматическим созданием тега во время пуша в git-репозиторий.
Рекомендуемые программы
Завершено
0 / 9









