Ответ
Да, я неоднократно проектировал и поддерживал CI/CD пайплайны в GitLab CI/CD для микросервисных приложений. Вот пример многоэтапного пайплайна для приложения на Go, который я реализовывал:
# .gitlab-ci.yml
stages:
- test
- build
- scan
- deploy-staging
- deploy-prod
variables:
DOCKER_IMAGE: "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA"
# 1. Тестирование
unit-test:
stage: test
image: golang:1.19
script:
- go test ./... -v
# 2. Сборка Docker-образа
build-image:
stage: build
image: docker:latest
services:
- docker:dind
script:
- docker build -t $DOCKER_IMAGE .
- docker push $DOCKER_IMAGE
only:
- merge_requests
- main
# 3. Сканирование уязвимостей (Trivy)
security-scan:
stage: scan
image: aquasec/trivy:latest
script:
- trivy image --exit-code 1 --severity HIGH,CRITICAL $DOCKER_IMAGE
# 4. Деплой в staging (Kubernetes)
deploy-to-staging:
stage: deploy-staging
image: bitnami/kubectl:latest
script:
- kubectl config use-context staging-cluster
- sed "s|{{IMAGE}}|$DOCKER_IMAGE|g" k8s/deployment.yaml | kubectl apply -f -
- kubectl rollout status deployment/myapp -n staging
environment:
name: staging
only:
- main
# 5. Ручной деплой в production (после approval)
deploy-to-production:
stage: deploy-prod
image: bitnami/kubectl:latest
script:
- kubectl config use-context prod-cluster
- sed "s|{{IMAGE}}|$DOCKER_IMAGE|g" k8s/deployment.yaml | kubectl apply -f -
environment:
name: production
when: manual
only:
- main
Ключевые практики, которые я применял: использование Docker-in-Docker для сборки, сканирование образов на уязвимости, разделение контекстов Kubernetes для разных сред и ручное подтверждение (when: manual) для деплоя в production.