CI/CD: как я перестал деплоить руками и начал жить спокойно
Автор: Алексей Пасечник (Arhellist). Канонический адрес: https://arhellist.ru/blog/cicd-kak-ya-perestal-deploit-rukami-i-nachal-zhit-spokoyno/.
Опубликовано: 2026-07-17.
Деплой вручную — это как готовить ужин с закрытыми глазами. Да, ты можешь не обжечься. Но однажды ты точно отрежешь палец. Или подожжешь кухню.
Помню свои первые деплои. Это был ритуал, достойный шамана с бубном:
1. Залить код по FTP. 2. Зайти на сервер. 3. Перезапустить Node.js. 4. Молиться, чтобы ничего не упало. 5. Проверить руками — всё ли работает. 6. Обнаружить, что сломалось. 7. Откатить. 8. Начать заново.
Это занимало часы. Это было больно. Это было страшно. Но я думал, что так и надо.
Спойлер: не надо.
Боль ручного деплоя
Ручной деплой — это не просто «неудобно». Это опасно. Это дорого. Это убивает твою репутацию.
Вот что происходит, когда ты деплоишь руками:
1. Человеческий фактор. Забыл перезапустить сервер — релиз не вышел. Забыл обновить переменные окружения — всё упало. Не ту ветку залил — фича превратилась в баг.
2. Время простоя. Пока ты копируешь файлы, сервер живёт в промежуточном состоянии. Часть кода уже новая, часть — старая. Пользователи падают в ошибки. Ты в панике.
3. Отсутствие истории. Что изменилось? Какая версия на сервере? Кто и когда деплоил? Ответы: «не помню», «не знаю», «кажется, я».
4. Страх перед релизом. Чем сложнее система, тем страшнее деплоить. Ты начинаешь копить изменения, чтобы деплоить раз в месяц. Каждый релиз — это экстрим.
5. Невозможность отката. Что-то сломалось? Верни как было. А как было? Где тот код? Кто его помнит?
Я прошёл через всё это. И однажды сказал себе: «Хватит».
Что такое CI/CD и почему это не страшно
CI/CD — это не хайп. Это методология, которая превращает ад деплоев в предсказуемый процесс.
CI (Continuous Integration) — непрерывная интеграция
Каждый раз, когда ты пушишь код в репозиторий, автоматически:
- собирается проект; - запускаются тесты;CI/CD на практике: зачем уходить от ручного деплоя, как настроить GitHub Actions и что даёт автоматизация релизов разработчику. - проверяется стиль кода; - если всё ок — код готов к деплою.
CD (Continuous Delivery / Deployment) — непрерывная доставка
- Delivery — код автоматически собирается и готов к деплою, но релиз запускается вручную (нажал кнопку — покатилось). - Deployment — код автоматически деплоится в продакшн без участия человека (каждый пуш → новый релиз).
Я использую Continuous Delivery. Потому что я хочу контролировать момент релиза, но не хочу делать всю рутину руками.
Как я настроил свой CI/CD
Шаг 1. Репозиторий и ветки
У меня простая, но эффективная модель:
| Ветка | Назначение | |--------|------------| | main | всегда продакшн. Никто не пушит в main напрямую | | dev | разработка. Сюда мержатся фичи | | feature/ | ветки для новых фич | | hotfix/ | ветки для срочных исправлений |
Шаг 2. GitHub Actions — мой робот-деплой
Я использую GitHub Actions. Бесплатно, просто, интегрировано с репозиторием.
Мой пайплайн выглядит так:
yaml name: CI/CD Pipeline
on: push: branches: [ main, dev ] pullrequest: branches: [ main ]
jobs: test: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v3
- name: Setup Node.js uses: actions/setup-node@v3 with: node-version: '18'
- name: Install dependencies run: npm ci
- name: Run tests run: npm test
- name: Lint run: npm run lint
- name: Build run: npm run build
deploy: needs: test runs-on: ubuntu-latest if: github.ref == 'refs/heads/main' steps: - name: Checkout code uses: actions/checkout@v3
- name: Deploy to server uses: appleboy/ssh-action@v0.1.5 with: host: ${{ secrets.SERVERHOST }} username: ${{ secrets.SERVERUSER }} key: ${{ secrets.SERVERSSHKEY }} port: ${{ secrets.SERVERPORT }} script: | cd /var/www/app git pull origin main npm ci --production npm run build pm2 restart app pm2 save
Что здесь происходит:
1. Каждый пуш в main или dev запускает пайплайн. 2. Сначала — тесты. Если тесты упали — дальше никто не идёт. 3. Потом — сборка. Если сборка упала — дальше никто не идёт. 4. Если всё ок и это ветка main — деплой на сервер.
Это занимает 2–3 минуты. Без моего участия.
Что мне дал CI/CD
- Я перестал бояться деплоя. Теперь это 3 минуты спокойствия, а не 3 часа нервов. - У меня появилась история изменений. Каждый деплой — это конкретный коммит. Если что-то сломалось — я знаю, кто, когда и зачем это сделал. - Тесты ловят ошибки до продакшена. Упал тест — релиз не пошёл. Просто и надёжно. - Я могу деплоить несколько раз в день. Нет нужды копить изменения. Хочешь выпустить фичу — выпускай. - Откат — за 5 секунд. git revert → пуш → пайплайн → продакшен. Всё автоматом. - Я сплю спокойно. Сервер перезапускается сам. Я не должен просыпаться в 3 часа ночи, чтобы «починить деплой».
Что я понял за время настройки
CI/CD — это не про технологии. Это про культуру
Можно настроить GitHub Actions, GitLab CI, Jenkins — неважно. Важно изменить подход. Ты больше не думаешь «как я залью код». Ты думаешь «код сам зальётся, если тесты пройдут».
Тесты — это не опция. Это условие деплоя
Если у тебя нет тестов — CI/CD бесполезен. Тесты — это страховка. Если ты деплоишь без тестов — ты играешь в русскую рулетку.
Деплой без даунтайма — это следующий уровень
git pull + pm2 restart — это уже хорошо. Но если у тебя 10 000 пользователей — перезапуск заметят. Для этого нужны zero-downtime деплои (синие/зелёные деплои или балансировка). Это тема для отдельного поста.
Секреты — в переменных окружения
Никаких паролей в коде. Только secrets в GitHub Actions и .env на сервере. Если ты коммитишь пароль — ты уже проиграл.
Итог
CI/CD — это не про «хочу как у больших дядек». Это про твой сон, нервы и время.
Если ты до сих пор деплоишь руками — остановись. Прямо сейчас. Настрой простой пайплайн. Это займёт полдня. А сэкономит недели жизни.
Раньше я боялся релизов. Теперь я люблю их. Каждый пуш — это маленький праздник. Потому что я знаю: если что-то сломается — система скажет мне об этом до того, как увидят пользователи.
Автоматизируй то, что можно автоматизировать. Оставь себе то, что требует мышления.
О чём пишем
- Архитектура и эксплуатация веб-продуктов
- AI-агенты, RAG и практические контуры
- Кейсы LMS, маркетплейсов и защищённых коммуникаций
- Заметки по Next.js, Node.js, PostgreSQL и realtime