0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Деплой на PaaS (Heroku, Render) дает нам представление того, как организовать его самостоятельно, на свой сервер. В общем случае, процесс выглядит так:</p>
1
<p>Деплой на PaaS (Heroku, Render) дает нам представление того, как организовать его самостоятельно, на свой сервер. В общем случае, процесс выглядит так:</p>
2
<ol><li>Клонирование репозитория</li>
2
<ol><li>Клонирование репозитория</li>
3
<li>Сборка проекта. В нашем случае установка зависимостей</li>
3
<li>Сборка проекта. В нашем случае установка зависимостей</li>
4
<li>Доставка на сервера. У нас пока один сервер</li>
4
<li>Доставка на сервера. У нас пока один сервер</li>
5
<li>Остановка старой версии и запуск новой</li>
5
<li>Остановка старой версии и запуск новой</li>
6
</ol><p>С точки зрения 12 факторов, важно разделять<a>процесс сборки и релиза</a>. Представьте что у нас 10 машин. Если мы начнем клонировать репозиторий на каждую из машин и выполнять там сборку, то получим множество неудобств:</p>
6
</ol><p>С точки зрения 12 факторов, важно разделять<a>процесс сборки и релиза</a>. Представьте что у нас 10 машин. Если мы начнем клонировать репозиторий на каждую из машин и выполнять там сборку, то получим множество неудобств:</p>
7
<ol><li>Если сборка пройдет неуспешно, то мы просто потратим ресурсы серверов впустую.</li>
7
<ol><li>Если сборка пройдет неуспешно, то мы просто потратим ресурсы серверов впустую.</li>
8
<li>Скачивание зависимостей это трафик, который стоит денег. Умножаем вес зависимостей на количество серверов.</li>
8
<li>Скачивание зависимостей это трафик, который стоит денег. Умножаем вес зависимостей на количество серверов.</li>
9
<li>В случае отката на предыдущую версию, придется долго ждать пока заново выполнится сборка. Проблема даже с одним сервером.</li>
9
<li>В случае отката на предыдущую версию, придется долго ждать пока заново выполнится сборка. Проблема даже с одним сервером.</li>
10
</ol><p>Сборка, обычно, выполняется отдельно от релиза. Чаще всего ей занимается CI, который, после выполнения всех проверок, формирует какой-то артефакт: пакет под операционную систему (например deb), архив, Docker-образ. Последний стал стандартом де-факто. Все так или иначе переехали на Docker.</p>
10
</ol><p>Сборка, обычно, выполняется отдельно от релиза. Чаще всего ей занимается CI, который, после выполнения всех проверок, формирует какой-то артефакт: пакет под операционную систему (например deb), архив, Docker-образ. Последний стал стандартом де-факто. Все так или иначе переехали на Docker.</p>
11
<p>Разберем, как организовать сборку через CI, для любого проекта на примере<a>devops-example-app</a></p>
11
<p>Разберем, как организовать сборку через CI, для любого проекта на примере<a>devops-example-app</a></p>
12
<h2>Сборка</h2>
12
<h2>Сборка</h2>
13
<p>Первым делом, нужно создать<em>Dockerfile</em>и добавить туда все шаги для подготовки приложения. Обычно это делается так, гуглится статья (<a>официальные примеры</a>), в которой упаковывается приложение на том же фреймворке и дальше методом проб и ошибок этот процесс повторяется, до тех пор, пока локально получится собрать образ, запустить его и увидеть готовое приложение. Для нашего приложения<em>Dockerfile</em>выглядит так:</p>
13
<p>Первым делом, нужно создать<em>Dockerfile</em>и добавить туда все шаги для подготовки приложения. Обычно это делается так, гуглится статья (<a>официальные примеры</a>), в которой упаковывается приложение на том же фреймворке и дальше методом проб и ошибок этот процесс повторяется, до тех пор, пока локально получится собрать образ, запустить его и увидеть готовое приложение. Для нашего приложения<em>Dockerfile</em>выглядит так:</p>
14
<p>Когда<em>Dockerfile</em>готов, а образ собирается и запускается, пора создать аккаунт на<a>Docker Hub</a>. Внутри добавляется репозиторий для хранения нашего Docker-образа, и, наконец, выполняется docker push. Так мы получаем образ, готовый для деплоя.</p>
14
<p>Когда<em>Dockerfile</em>готов, а образ собирается и запускается, пора создать аккаунт на<a>Docker Hub</a>. Внутри добавляется репозиторий для хранения нашего Docker-образа, и, наконец, выполняется docker push. Так мы получаем образ, готовый для деплоя.</p>
15
<p>Остается последний шаг - автоматизация сборки с помощью<a>Github Actions</a>. Причем она будет практически идентичная для всех проектов, которые собираются с помощью Docker независимо от стека.</p>
15
<p>Остается последний шаг - автоматизация сборки с помощью<a>Github Actions</a>. Причем она будет практически идентичная для всех проектов, которые собираются с помощью Docker независимо от стека.</p>
16
<p>В этом workflow собирается образ с тегом<em>latest</em>, который обновляется после каждого коммита и успешного прохождения тестов. При таком подходе будет невозможно узнать какая прямо сейчас версия на продакшене и, что совсем плохо, будет невозможно откатиться на другую версию, если что-то пойдет не так. Поэтому помимо образа<em>latest</em>, который полезен для постоянного тестирования процесса сборки, нужен отдельный workflow, в котором готовятся образы с тегами под каждую версию.</p>
16
<p>В этом workflow собирается образ с тегом<em>latest</em>, который обновляется после каждого коммита и успешного прохождения тестов. При таком подходе будет невозможно узнать какая прямо сейчас версия на продакшене и, что совсем плохо, будет невозможно откатиться на другую версию, если что-то пойдет не так. Поэтому помимо образа<em>latest</em>, который полезен для постоянного тестирования процесса сборки, нужен отдельный workflow, в котором готовятся образы с тегами под каждую версию.</p>
17
<p>Такой workflow запускается не на коммиты, а на создание тега в git. Этот же тег затем используется и для Docker-образа. Ниже пример обновленного workflow, который нам подходит:</p>
17
<p>Такой workflow запускается не на коммиты, а на создание тега в git. Этот же тег затем используется и для Docker-образа. Ниже пример обновленного workflow, который нам подходит:</p>
18
<p>Запуск проверок для<em>latest</em>не нужен, так как он уже был проверен во время сборки по коммиту. Это сэкономит время на сборку.</p>
18
<p>Запуск проверок для<em>latest</em>не нужен, так как он уже был проверен во время сборки по коммиту. Это сэкономит время на сборку.</p>
19
<p>В этой системе есть один момент, который нужно учитывать. Создавать тег можно только тогда, когда выполнится сборка<em>latest</em>. Иначе этот воркфлоу сделает тег из старого образа. Обойти это ограничение можно автоматическим созданием тега во время пуша в git-репозиторий.</p>
19
<p>В этой системе есть один момент, который нужно учитывать. Создавать тег можно только тогда, когда выполнится сборка<em>latest</em>. Иначе этот воркфлоу сделает тег из старого образа. Обойти это ограничение можно автоматическим созданием тега во время пуша в git-репозиторий.</p>