7. Интеграции
Эта тема показывает, как CI/CD в GitLab становится частью платформы: деплой в Kubernetes, запуск Terraform и Ansible из пайплайна, работа с GitLab Environments, и то, как относиться к Auto DevOps (понимать, но не полагаться).
В фокусе production-практики: изоляция infra и app pipeline, корректная работа с секретами, state и access, предсказуемые деплои.
Определения и сущности
| Термин | Определение |
|---|---|
| Kubernetes manifest | YAML/JSON описание ресурсов кластера (Deployment, Service, Ingress, Secret и т.п.). |
| kubeconfig | Конфигурация доступа kubectl/клиентам к Kubernetes API (сертификаты/токены/кластер). |
| GitLab Environment | Объект GitLab для привязки деплоя к логическому окружению (staging, production, review/*), хранения history. |
| Review app | Динамический environment для Merge Request, обычно с отдельным URL. |
| Terraform apply | Команда Terraform, которая применяет план изменений инфраструктуры (создаёт/обновляет/удаляет ресурсы). |
| Terraform state | Файл/хранилище с текущим состоянием инфраструктуры, от которого зависит планирование следующего apply. |
| Remote state backend | Удалённое хранилище state (например, S3, GCS, Terraform Cloud) для команды и lock’ов. |
| Ansible playbook | YAML-файл с набором tasks для настройки/изменения системы (серверов/VM). |
| Inventory | Описание хостов (static/dynamic) для Ansible. |
| Auto DevOps | Автоматическая “из коробки” настройка пайплайнов GitLab для сборки/тестов/деплоя. |
| Infra pipeline / App pipeline | Разделение пайплайнов: инфраструктура (Terraform) отдельно от приложения (build/deploy), чтобы управлять рисками и доступами. |
GitLab environments + Kubernetes
Production best practice:
- deploy в Kubernetes всегда привязывайте к
environmentв GitLab; - для MR используйте
review/*environments иon_stop, чтобы окружения не копились.
Мини-пример: деплой в review namespace (концептуально).
deploy_review:
stage: deploy
image: bitnami/kubectl:1.30
environment:
name: review/$CI_MERGE_REQUEST_IID
url: https://review.example.com/$CI_MERGE_REQUEST_IID
on_stop: stop_review
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
script:
- kubectl config use-context "$KUBE_CONTEXT"
- kubectl -n "review-$CI_MERGE_REQUEST_IID" apply -f k8s/
Ключевой момент:
KUBE_CONTEXT(или kubeconfig/sa token) храните в protected variables;- секреты и токены не должны попадать в логи.
Deploy в Kubernetes через CI: минимально безопасная схема
Production подход:
- не хранить kubeconfig как “чистый файл” в репозитории;
- использовать сервисный аккаунт/токен (Kubernetes) или переменную с ограниченными правами;
- ограничить доступ по namespace и ресурсам (RBAC).
Пример job’а с ограничениям по branch и manual approve:
deploy_production:
stage: deploy
image: bitnami/kubectl:1.30
environment: production
rules:
- if: '$CI_COMMIT_BRANCH == "main"'
when: manual
- when: never
script:
- kubectl -n production apply -f k8s/
- kubectl -n production rollout status deploy/myapp --timeout=180s
Комментарий:
- лучше всего деплоить через
apply/upgrade, а не “перезапусками без контроля”; - smoke тесты (хотя бы HTTP health-check) желательно добавить перед тем, как считать деплой успешным.
Terraform apply через pipeline (и почему infra pipeline отдельно)
Правило production:
- инфраструктура меняет то, на чём живёт приложение;
- поэтому Terraform pipeline должен быть отделён от app pipeline, а доступ к apply ограничен.
Terraform: best practices по state
- использовать remote state backend;
- включать lock (чтобы не было параллельных apply);
- выдавать токены только на чтение там, где возможно, и только на apply — для ограниченных ролей.
Мини-пример пайплайна: plan на MR, apply только на main + manual approve.
terraform_plan:
stage: infra-plan
image: hashicorp/terraform:1.8
script:
- terraform init
- terraform plan -out tfplan
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
artifacts:
paths:
- tfplan
expire_in: 1 week
terraform_apply:
stage: infra-apply
image: hashicorp/terraform:1.8
needs:
- terraform_plan
script:
- terraform init
- terraform apply -auto-approve tfplan
rules:
- if: '$CI_COMMIT_BRANCH == "main"'
when: manual
- when: never
environment: production
Комментарий:
- применяйте plan-artifact, а не делайте
apply“прямо сейчас” без проверки; - Terraform secrets (access keys) — только masked/protected.
Ansible через CI: когда это уместно
Ansible часто используют, если:
- есть VM/bare metal, где удобнее конфигурировать через playbooks;
- нужен “bootstrap” окружения или настройка сетей/сертификатов.
Production best practice:
- inventory хранить в репозитории или генерировать из Terraform outputs;
- secrets — через variables/Vault (без вывода в логи);
- включить retry/timeout и “проверяемость” (assert/статусы tasks).
Мини-пример job’а:
ansible_deploy:
stage: deploy
image: python:3.12-slim
before_script:
- pip install ansible-core
script:
- ansible-playbook -i inventory/prod deploy.yml --check
rules:
- if: '$CI_COMMIT_BRANCH == "main"'
when: manual
- when: never
Комментарий:
- в примере используется
--check; в production обычно отдельный ручной “apply” шаг без check.
Auto DevOps: понимать, но не полагаться
Auto DevOps удобен как старт, но в production он часто:
- не соответствует вашим процессам (security scanning, env separation, специфичные runner’ы);
- плохо описывает кастомные шаги и контракты arтефактов;
- усложняет воспроизводимость.
Best practice:
- используйте Auto DevOps как “референс”, но production pipeline делайте явным и версионируемым через templates/include.
Разделение infra и app pipelines: production-эффект
Почему это важно:
- infra changes могут требовать отдельного approval и иметь иной риск;
- app pipeline должен быть независим от того, что “сегодня” меняли Terraform;
- у команд разные права (infra — узкая группа).
Практическая рекомендация:
- infra pipeline: только Terraform plan/apply;
- app pipeline: build/test и деплой в Kubernetes.
Production чеклист интеграций
- deploy’ы привязаны к
environmentи имеют историю; - токены/секреты защищены masked/protected и не попадают в логи;
- kubeconfig и права Kubernetes ограничены минимально необходимыми RBAC;
- Terraform использует remote state backend и lock’и;
- Terraform apply делается по
planиз MR/артефакта; - Ansible secrets и inventory управляются безопасно;
- Auto DevOps не заменяет явные production pipeline'ы.