// Engineering Log
Безопасная разработка: Часть 1 — CI/CD: от ручной выкладки к автоматическому деплою
Опубликовано 22.09.2026
// Быстрый маршрут
Эта статья относится к теме Деплой и стабильная работа.
CI/CD — это практика, при которой каждое изменение кода автоматически собирается, проверяется и доставляется на сервер. Вместо ручной последовательности «скопировать файлы, перезапустить сервис и проверить, что ничего не сломалось» эту работу выполняет программа по описанию, которое хранится в репозитории рядом с кодом.
Этой частью открывается цикл о безопасной разработке. Все следующие проверки — поиск секретов, статический анализ кода, проверка зависимостей и контейнерных образов — встраиваются именно в пайплайн, поэтому начинать приходится с него.
CI, CD и ещё раз CD
- Непрерывная интеграция (Continuous Integration). После каждого
git pushкод собирается и проходит тесты. Ошибка обнаруживается через несколько минут после коммита, а не в день выкладки. - Непрерывная доставка (Continuous Delivery). Каждая успешная сборка готова к выкладке, но команду на выкладку даёт человек.
- Непрерывное развёртывание (Continuous Deployment). Успешная сборка уходит на сервер автоматически, без участия человека.
Небольшим командам обычно подходит вторая модель: всё проверяется автоматически, а выкладка запускается одной кнопкой.
Из чего состоит пайплайн
- Файл описания в репозитории:
.gitlab-ci.yml,.github/workflows/*.yml,.gitea/workflows/*.yamlилиJenkinsfile. - Этапы и задачи. Этапы выполняются по порядку, задачи одного этапа — параллельно, если хватает исполнителей.
- Раннер — программа, которая выполняет задачи. На GitLab.com и GitHub.com есть облачные раннеры; на собственном сервере GitLab или Gitea раннер нужно установить и зарегистрировать самостоятельно.
- Переменные и секреты задаются в настройках проекта, а не в файле пайплайна.
Инструменты
GitLab CI встроен в GitLab — и в облачный GitLab.com, и в устанавливаемый на собственный сервер. Пайплайн описывается в файле .gitlab-ci.yml в корне репозитория. На своём сервере GitLab задачи начнут выполняться только после установки и регистрации GitLab Runner.
GitHub Actions встроен в GitHub. Файлы пайплайнов лежат в каталоге .github/workflows, для типовых шагов есть большая библиотека готовых действий.
Gitea Actions появились в Gitea 1.19, а с версии 1.21 включены по умолчанию. Синтаксис в основном совместим с GitHub Actions, файлы размещаются в .gitea/workflows/, задачи выполняет отдельная программа Gitea Runner. Это лёгкий вариант для компании, которой нужен собственный Git-сервер со встроенной автоматизацией.
Jenkins — отдельный сервер автоматизации: пайплайны описываются в Jenkinsfile, возможности расширяются плагинами. Он очень гибок, но установку, обновления и совместимость плагинов обслуживаете вы. Обычно его выбирают там, где он уже давно работает.
Минимальный рабочий пайплайн
Пример для GitLab CI: тесты на каждое изменение и выкладка только из основной ветки.
stages:
- test
- deploy
test:
stage: test
image: python:3.13-slim
script:
- pip install -r requirements.txt
- pytest
deploy:
stage: deploy
script:
- ./deploy.sh
environment: production
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
when: manualЗадача deploy появляется только в основной ветке и ждёт ручного запуска — это и есть непрерывная доставка. Если убрать when: manual, получится непрерывное развёртывание.
То же для GitHub Actions — файл .github/workflows/ci.yml:
name: CI
on:
push:
branches: [main]
pull_request:
jobs:
test:
runs-on: ubuntu-latest
container: python:3.13-slim
steps:
- uses: actions/checkout@v6
- run: pip install -r requirements.txt
- run: pytestДля Gitea Actions подходит почти такой же файл, только в каталоге .gitea/workflows/.
Где в пайплайне проверки безопасности
| Где | Что проверяется | Часть цикла |
|---|---|---|
| У разработчика перед коммитом и первой задачей пайплайна | Пароли и ключи в коде | Часть 2 — секреты |
| Вместе с тестами | Уязвимые конструкции в собственном коде | Часть 3 — SAST |
| Вместе с тестами | Известные уязвимости и лицензии зависимостей | Часть 4 — SCA |
| Сборка образа | Воспроизводимость, кеш, секреты при сборке | Часть 5 — Dockerfile |
| После сборки и при запуске | Уязвимости образа, права контейнера | Часть 6 — контейнеры |
Проверка приносит пользу, только если может остановить пайплайн: предупреждения, которые ни на что не влияют, быстро перестают читать. Разумный порядок — включить проверку в режиме отчёта, разобрать найденное, а затем сделать её обязательной.
Секреты и доступы пайплайна
- Пароли и ключи хранятся в защищённых переменных проекта (в GitLab — masked и protected, в GitHub — secrets), а не в YAML-файле.
- Для выкладки заводится отдельный пользователь и ключ с минимальными правами — только на то, что нужно для деплоя.
- Выкладка разрешается только из основной ветки.
- Раннер на собственном сервере не должен выполнять задачи чужих проектов: документация Gitea прямо предупреждает, что нельзя использовать недоверенные раннеры и предоставлять свои раннеры недоверенным инстансам.
GitOps
Для Kubernetes распространён подход GitOps: желаемое состояние кластера описано в Git, а специальный агент в кластере (Argo CD или Flux) сам приводит кластер к этому описанию. Пайплайн в этом случае не выкладывает приложение напрямую, а только обновляет манифесты в репозитории. Для одного-двух серверов без Kubernetes это лишнее усложнение — хватает обычного шага выкладки.
Что учесть в России
- Оплатить зарубежные тарифы GitHub и GitLab.com картой российского банка нельзя: Visa и Mastercard с марта 2022 года не работают за пределами России.
- Независимость от внешних сервисов даёт собственный Git-сервер — GitLab на своём сервере или Gitea с Gitea Actions — и раннеры на своих машинах. Такой вариант требует администрирования, но код, сборки и секреты остаются под вашим контролем.
Типичные ошибки
- Пароли в файле пайплайна. Они попадают в историю Git и видны всем, у кого есть доступ к репозиторию.
- Проверки, которые не останавливают сборку. Их результаты никто не смотрит.
- Долгий пайплайн. Если сборка идёт полчаса, разработчики перестают ждать результатов. Помогают кеширование зависимостей и параллельные задачи.
- Выкладка с любой ветки. Экспериментальный код оказывается на рабочем сервере.
- Один раннер с доступом к продакшену для всех проектов. Ошибка или взлом в одном проекте открывает доступ к остальным.
Настройка пайплайна под конкретный проект — от первых тестов до выкладки на свои серверы — входит в услугу по настройке CI/CD.
// Похожая задача
Если у вас похожая ситуация
Эта статья относится к одной из рабочих тем. Можно продолжить чтение по теме, перейти на главную, чтобы понять, чем я занимаюсь, или сразу открыть услуги.
Тема статьи
Деплой и стабильная работа
Docker, CI/CD, релизы, мониторинг, observability и разбор инцидентов.
Часто с этим приходят
- Настроить деплой без ручных действий и хаоса
- Подключить мониторинг, алерты и базовую observability
- Разобрать инциденты и стабилизировать production
// Следующий шаг
Если вам нужна не только статья, а помощь по этой теме, удобнее сразу перейти в услугу. Главная и подборка материалов остаются рядом.
Открыть услуги// Reviews
Отзывы по теме
Пришел с дорогим запросом по настройке VPS-сервера, но в процессе консультации Михаил предложил гораздо более простое и экономичное решение. В итоге сэкономил бюджет и время. Михаил — настоящий эксперт, который работает на результат клиента, а не на чек. Рекомендую!
Пришел с дорогим запросом по настройке VPS-сервера, но в процессе консультации Михаил предложил гораздо более простое и экономичное решение. В итоге сэкономил бюджет и время. Михаил — настоящий эксперт, который работает …
Настройка vps, настройка сервера
12.05.2026 · ★ 5/5
Отличная работа! Очень быстро настроил сервер, установил панель, прописал IP. Однозначно могу порекомендовать!
Отличная работа ! Очень быстро настроил сервер, установил панель прописал IP Однозначно могу по рекомендовать !
Всё отлично, помог оперативно и профессионально, спасибо, рекомендую сообществу
Всё отлично, помог оперативно и профессионально, спасибо, рекомендую сообществу
Настройка vps, настройка сервера
16.04.2026 · ★ 5/5
Было несколько проблем касаясь как технической части так и понимания в целом. Михаил быстро ответил на запрос, помог разобраться и решил проблеммы технические и помог разобраться в понимании, за что отдельное спасибо. Результатом доволен.
Было несколько проблем касаясь как технической части так и понимания в целом. Михаил быстро ответил на запрос, помог разобраться и решил проблеммы технические и помог разобраться в понимании, за что отдельное спасибо. …
Настройка vps, настройка сервера
18.02.2026 · ★ 5/5
Все было сделано быстро и четко. Рекомендую
Все было сделано быстро и четко. Рекомендую
Настройка vps, настройка сервера
17.01.2026 · ★ 5/5
Всё прошло хорошо, исполнитель быстро реагировал на вопросы и помог решить проблему. Спасибо!
Всё прошло хорошо, исполнитель быстро реагировал на вопросы и помог решить проблему. Спасибо!
Настройка vps, настройка сервера
16.12.2025 · ★ 5/5
// Contact
Нужна помощь?
Свяжись со мной и я помогу решить проблему
Написать в TelegramОтвечаю в течение рабочего дня (03:00–13:00 GMT)
Или оставьте заявку здесь:
// Related