HTML Diff
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>