Ответ
На последнем проекте мы построили GitOps-ориентированный CI/CD пайплайн на базе GitLab CI и Argo CD для Kubernetes.
Архитектура и принципы:
- Инфраструктура как код (IaC): Вся инфраструктура (K8s кластер, сети, БД) описывалась в Terraform, конфигурации приложений — в Helm-чартах.
- GitOps: Argo CD автоматически синхронизировал состояние кластера с декларативными манифестами в Git-репозитории. Изменение в
mainветке = триггер на обновление в кластере. - Многоступенчатый пайплайн:
Этапы GitLab CI/CD (.gitlab-ci.yml):
stages:
- test
- build
- security-scan
- deploy-to-staging
- integration-test
- deploy-to-production
# 1. Тестирование
unit-test:
stage: test
image: golang:1.19
script:
- go test ./... -v
# 2. Сборка и сканирование образа
build-and-scan:
stage: build
image: docker:latest
services:
- docker:dind
script:
- docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
# Сканирование на уязвимости (Trivy)
- docker run --rm -v /var/run/docker.sock:/var/run/docker.sock aquasec/trivy image --exit-code 1 $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
# 3. Деплой в staging (через обновление манифестов в Git)
deploy-staging:
stage: deploy-to-staging
script:
# Обновляем версию образа в Helm-чарте для staging
- sed -i "s|tag: .*|tag: $CI_COMMIT_SHA|" ./charts/myapp/values-staging.yaml
- git add . && git commit -m "Deploy $CI_COMMIT_SHA to staging"
- git push origin HEAD:main
only:
- main
environment:
name: staging
url: https://staging.myapp.com
# 4. Интеграционные тесты в staging
run-integration-tests:
stage: integration-test
script:
- ./scripts/run-integration-tests.sh https://staging.myapp.com
# 5. Промоушен в prod (ручное подтверждение + canary)
deploy-production:
stage: deploy-to-production
script:
- echo "Promoting $CI_COMMIT_SHA to production via Argo CD Rollout"
when: manual # Требует ручного подтверждения
environment:
name: production
url: https://myapp.com
Роль Argo CD: После пуша в main Argo CD автоматически подхватывал изменения в Helm-чартах и применял их к кластеру. Для production мы использовали Argo Rollouts с canary-стратегией: сначала 10% трафика шло на новую версию, и после успешных проверок по метрикам (Prometheus) происходил полный rollout.