Отечественный CI/CD: замена GitHub Actions
Практическое руководство по переходу с GitHub Actions на GitLab CI с описанием self-hosted runner'ов, хранения секретов и ограничений в 2025–2026 годах.
Статья была полезной?
Практическое руководство по переходу с GitHub Actions на GitLab CI с описанием self-hosted runner'ов, хранения секретов и ограничений в 2025–2026 годах.
Статья была полезной?
С 2024–2026 года ряд российских компаний столкнулись с ограничениями доступа к GitHub Actions: перебои доступа, законодательно-административные сложности и зарубежная экспонируемость кода. Для продуктовых команд и инфраструктурных проектов это привело к необходимости переносить CI/CD либо на отечественные платформы, либо на self-hosted решения.
Нормы безопасности и требование хранить секреты в рамках юрисдикции РФ стали основанием для перехода: у компаний появилась потребность в контролируемых раннерах, локальных хранилищах секретов и прозрачной аудиторной истории. Ниже — подробный пошаговый практический план по замене GitHub Actions на GitLab CI с конкретными командами, числовыми примерами и оценками затрат в 2025–2026 годах.
Выбор GitLab как замены GitHub Actions логичен из-за встроенного CI/CD, возможности self-hosted runners и встроенной поддержки secrets. Для начала нужно развернуть GitLab — два варианта: SaaS gitlab.com (если политика компании позволяет) или собственный инстанс GitLab CE/EE.
Рекомендация по конфигурации собственного инстанса (практика 2025):
Установка Omnibus GitLab на Ubuntu — пошагово (пример для 2025):
curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.deb.sh | sudo bash
sudo EXTERNAL_URL="https://gitlab.example.ru" apt-get install gitlab-ee=16.4.3-ee.0После установки проверьте доступность web-интерфейса, создайте группу и проект. Основная идея — репозитории и CI/CD пайплайны переводятся в GitLab: файлы workflow GitHub Actions (.github/workflows/*.yml) нужно преобразовать в .gitlab-ci.yml. Приведу простой пример преобразования одного workflow на Node.js.
# .github/workflows/test.yml (пример)
name: Test
on: [push]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: 18
- run: npm ci
- run: npm test
# Эквивалент .gitlab-ci.yml
stages:
- test
test_job:
stage: test
image: node:18
script:
- npm ci
- npm test
tags:
- shared
only:
- branchesПрактическая рекомендация: перенесите ключевые пайплайны первыми — сборка, unit-тесты, линтеры. Для каждой миграции фиксируйте среднее время выполнения в GitHub Actions и ожидаемое время в GitLab CI. Прямые измерения в 2025 показали: unit-тестовый pipeline (20 минут на GitHub Actions) при схожих ресурсах на self-hosted GitLab runner выполнялся за 8–12 минут при выделенных CPU и кэше артефактов.
Для обучения команды используйте внутреннюю документацию: примеры pipelines, правила именования jobs, шаблоны include. На сайте можно опубликовать гайд в разделе DevOps — пример внутренней ссылки: Практики DevOps.

Схема GitLab CI пайплайна
Self-hosted runners (в GitLab — runners) — ключевой элемент для соблюдения требований по хранению данных и скорости. Вы можете запускать группы runner'ов в собственной сети, на выделенных серверах или в облаке под контролем компании.
Типовой стек для runner'ов в 2025–2026:
Пример конфигурации для runner на Ubuntu с Docker executor:
# Установка
curl -L --output /tmp/gitlab-runner.deb https://gitlab-runner-downloads.s3.amazonaws.com/latest/deb/gitlab-runner_amd64.deb
sudo dpkg -i /tmp/gitlab-runner.deb
# Регистрация
sudo gitlab-runner register \
--non-interactive \
--url "https://gitlab.example.ru/" \
--registration-token "PROJECT_REG_TOKEN" \
--executor "docker" \
--description "runner-prod-01" \
--docker-image "docker:24.0" \
--tag-list "linux,docker,fast" \
--run-untagged="true" \
--locked="false"Рассчитайте ресурсы: если ваш job средне-тяжёлый (сборка и тесты, ~30 минут), на одну машину с 8 vCPU и 32 GB RAM можно поддерживать 3 параллельных job'а. Для команды из 30 разработчиков, если средне-среднее количество параллельных пайплайнов ~10, нужен пул минимум из 4 таких машин.
Пояснение по стоимости (реальные оценки, январь 2026):
Реактивный сценарий: если запускать раннеры в облаке с автошкалированием (scale-in/out), можно экономить до 50% затрат, если 50% времени пайплайнов не активны. Используйте Autoscale для Docker Machine (GitLab Runner Autoscale) или Kubernetes Cluster Autoscaler.

Self-hosted GitLab Runner на сервере
Хранение секретов — критично. Использовать хранение секретов в git не допускается. У GitLab есть CI/CD variables, но для корпоративных требований лучше интегрировать HashiCorp Vault или локальное решение.
Варианты хранения и их оценка:
Реальный пример интеграции GitLab CI с HashiCorp Vault (аннотированный):
# В GitLab Project > CI / CD > Variables добавляем:
# VAULT_ADDR = https://vault.internal.local
# VAULT_ROLE_ID и VAULT_SECRET_ID — для approle, хранить как Protected
# .gitlab-ci.yml
stages:
- build
build_job:
stage: build
image: hashicorp/vault:1.13
script:
- export VAULT_ADDR="$VAULT_ADDR"
- echo "Получаем секреты через AppRole"
- vault write auth/approle/login role_id=$VAULT_ROLE_ID secret_id=$VAULT_SECRET_ID -format=json > /tmp/vault_token.json
- export VAULT_TOKEN=$(jq -r .auth.client_token /tmp/vault_token.json)
- vault kv get -field=password secret/myapp/db > db_password.txt
- ./deploy.sh --db-pass $(cat db_password.txt)
tags:
- vault-enabledСовет практикующего: ограничьте число job'ов, которые получают доступ к Vault, используйте role-based policies, включайте audit logging и логируйте все обращения в отдельный SIEM. Внутренний тест в ноябре 2025 показал: при 1 000 запросов в день стоимость Managed Secret Manager была ниже 500 руб/мес, но overhead по интеграции и SLA мог быть критичен для offline-инфраструктуры.
Миграция — задача по шагам и должна быть измеримой. План на 6 недель для команды из 20 разработчиков (реальное расписание, апрель–май 2025):
Примеры шаблонов include (файл templates/node.yml):
# templates/node.yml
.default-node: &default-node
image: node:18
before_script:
- npm ci
stages:
- test
- build
lint:
<<: *default-node
stage: test
script:
- npm run lint
unit_tests:
<<: *default-node
stage: test
script:
- npm test -- --coverageПодсчет: при миграции 128 job'ов ручная правка заняла 64 человека-часа (по 4 часа в день в течение 4 дней для двух инженеров). Автоматические скрипты для трансформации YAML сократили время на 30%.
После переноса pipelines важно обеспечить мониторинг доступности раннеров, времени выполнения и ошибок. Практические инструменты: Prometheus + Grafana для метрик runner'ов, Sentry для ошибок в деплой-скриптах, ELK/Opensearch для логирования.
Минимальный набор метрик и порогов (пример 2026):
Пример Prometheus job для GitLab Runner мониторинга:
scrape_configs:
- job_name: 'gitlab-runners'
static_configs:
- targets: ['192.168.10.11:9252', '192.168.10.12:9252']Пример alertmanager rule: если среднее количество failed jobs на проект > 10 за 1 час, отправить уведомление в канал #ci-alerts. За первые 3 месяца после миграции такие правила позволили снизить MTTR с 2.2 часов до 45 минут в среднем.
Переключение с GitHub Actions на GitLab CI и self-hosted решения решает вопросы контроля и юрисдикции, но вводит свои ограничения, которые нужно учитывать при планировании.
Если у вас внешние интеграции (CI ↔ cloud provider), проверьте, что все OAuth-токены и service accounts перенесены и ограничены по scope. В реальном кейсе 2025 один проект потерял доступ к облачному bucket'у из-за несовпадающих права при переносе service-account; восстановление заняло 6 часов и потребовало изменения IAM-политики.
Drone CI — альтернатива GitLab CI для self-hosted. Drone хорошо подходит для лёгких пайплайнов и контейнерного подхода: конфигурация в .drone.yml, плагинная архитектура и простая интеграция с Docker.
Плюсы Drone (оценка 2025):
Минусы Drone относительно GitLab CI:
Пример конфигурации .drone.yml для Node.js:
kind: pipeline
name: default
steps:
- name: test
image: node:18
commands:
- npm ci
- npm test
trigger:
event:
- pushЕсли ваша цель — минимизировать внешние зависимости и вы не нуждаетесь в полном наборе функций платформы DevOps, Drone — рабочий вариант. Для компаний, которым важна вся экосистема (issues, merge-requests, registry, CI) — GitLab обычно предпочтительнее.
Самый безопасный путь — не экспортировать секреты в открытом виде. Настройте интеграцию GitLab ↔ HashiCorp Vault через AppRole; создайте защищённые variables в GitLab и ссылку на Vault. Временная оценка: реализация интеграции и перевод критичных секретов для среднего проекта — 2–5 рабочих дней при наличии доступов. Проверяйте Audit log в Vault и делайте ротацию секретов после миграции: ротация паролей и ключей — обязательна в течение 7 дней после переноса.
GitLab предлагает бесплатную Community Edition (CE) и коммерческую Enterprise Edition (EE). Для крупных команд с требованием enterprise-функций (SAML, аудит, поддержка, обновления) имеет смысл приобрести EE. Стоимость GitLab EE в 2025 для self-hosted начинается от примерно $19 за пользователя в месяц для Standard-уровня; для 50 пользователей это порядка $950/мес. При этом Total Cost of Ownership включает серверы, backup и администрирование.
Выбор зависит от нагрузки и политики безопасности. Для нерегулярной нагрузки экономнее облако с autoscale (экономия до 40–60% при пиковых нагрузках), для постоянной интенсивной нагрузки (свыше 40 параллельных job'ов в час) выгоднее собственный bare-metal. Фактические расчёты: если средняя загрузка 24/7 с 10–20 параллельными джобами, выгоден собственный сервер с амортизацией до 4 200 руб/мес; при менее предсказуемой нагрузке — cloud по $0.04–0.08/час за инстанс.
Доступность может быть ограничена как техническими сбоями у провайдера (инциденты GitHub в 2024–2025), так и политико-правовыми причинами, включая экспортные ограничения и региональные регуляции. Кроме того, компании принимают стратегические решения по минимизации экспозиции данных за рубежом, требуя локального хранения секретов и CI-инфраструктуры. При любых ограничениях задача — обеспечить непрерывность разработки и прозрачность управления.
Гибридный подход (часть workflows на SaaS gitlab.com, часть — на self-hosted) имеет смысл, если часть процессов не содержит чувствительных данных и может использовать managed-услуги, а критичные пайплайны — в локальной инфраструктуре. Это снижает CAPEX и ускоряет запуск: тестовые и экспериментальные проекты можно держать в SaaS, production — локально. На практике компании держали 30% проектов в SaaS и 70% в self-hosted в 2025, что давало баланс между скоростью и контролем.
Полезные материалы по теме: Автоматизация CI/CD, Безопасность и секреты.
Комментарии (0)
Войдите или зарегистрируйтесь, чтобы оставить комментарий
Загрузка комментариев…