Модуль 09 — CI/CD ⭐⭐⭐
CI/CD — то, ради чего DevOps существует. Автоматизация пути от commit до продакшена. Цель — деплой в пятницу должен быть скучным.
Терминология
- CI (Continuous Integration) — автосборка и тесты при каждом коммите
- CD #1 (Continuous Delivery) — авто-деплой в pre-prod, продакшен — кнопкой
- CD #2 (Continuous Deployment) — авто-деплой в продакшен после проверок
- GitOps — состояние инфры/деплоев описано в Git, агент в кластере подтягивает
Стек 2026 года
| Инструмент | Когда |
|---|---|
| GitHub Actions ⭐ | Стандарт для GitHub. Без раздумий, если у тебя GitHub. |
| GitLab CI ⭐ | Стандарт для GitLab. Встроенный, мощный. |
| Argo CD ⭐⭐ | Стандарт GitOps. Любой K8s деплой. |
| Flux | Альтернатива Argo CD — Git-native, без UI. |
| Argo Workflows | DAG-оркестрация для сложных пайплайнов. |
| Tekton | Cloud-native CI на K8s. Корпоративные сценарии. |
| Jenkins | Legacy. Учи последним и только если в вакансии. |
Стратегия: GitHub Actions + Argo CD = 80% рынка. Освой их глубоко.
GitHub Actions глубоко ⭐
Production-grade workflow
# .github/workflows/ci.yml
name: CI
on:
push:
branches: [main]
pull_request:
permissions:
contents: read
id-token: write # для OIDC к AWS
packages: write # для GHCR
concurrency:
group: ci-${{ github.ref }}
cancel-in-progress: true # отменять старые запуски
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # pin SHA
- uses: astral-sh/ruff-action@d8fd47f4f9234d40ea24fc28a90b5be3f6c2dc7e
- uses: rhysd/actionlint@v1
test:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
python: ["3.11", "3.12", "3.13"]
steps:
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
- uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python }}
cache: pip
- run: pip install -r requirements.txt
- run: pytest --cov --cov-report=xml
- uses: codecov/codecov-action@v4
with:
token: ${{ secrets.CODECOV_TOKEN }}
security:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
- name: Trivy filesystem scan
uses: aquasecurity/trivy-action@v0.20.0
with:
scan-type: fs
severity: HIGH,CRITICAL
exit-code: 1
- name: Gitleaks
uses: gitleaks/gitleaks-action@v2
build-push:
needs: [lint, test, security]
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
- uses: docker/setup-buildx-action@v3
- uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- uses: docker/build-push-action@v6
with:
context: .
platforms: linux/amd64,linux/arm64
push: true
tags: ghcr.io/${{ github.repository }}:${{ github.sha }}
cache-from: type=gha
cache-to: type=gha,mode=max
- name: Sign image (Cosign keyless)
uses: sigstore/cosign-installer@v3
- run: cosign sign --yes ghcr.io/${{ github.repository }}:${{ github.sha }}
deploy-prod:
needs: [build-push]
runs-on: ubuntu-latest
environment: production # required reviewers в settings
steps:
- uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::123456789:role/gha-deploy
aws-region: eu-west-1
- run: aws eks update-kubeconfig --name prod
- run: kubectl set image deploy/app app=ghcr.io/${{ github.repository }}:${{ github.sha }}
Best practices GitHub Actions
- Pin actions to SHA, не tag — supply chain attack защита
- Минимальные permissions:
contents: readпо умолчанию, явно расширяй - Secrets через environments с required reviewers для prod
- OIDC к облакам — никаких long-lived access keys
- Reusable workflows — DRY между репо
- Matrix для параллелизма
- concurrency с
cancel-in-progress— экономит минуты - Cache агрессивно — pip, npm, docker layers
- Job timeouts —
timeout-minutes: 30по умолчанию - Не используй устаревшие actions — следи за
actions/setup-python@v5
GitLab CI глубоко
# .gitlab-ci.yml
include:
- template: Security/SAST.gitlab-ci.yml
- template: Security/Container-Scanning.gitlab-ci.yml
- template: Security/Dependency-Scanning.gitlab-ci.yml
stages: [test, build, deploy]
variables:
IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
test:
stage: test
image: python:3.12
cache:
paths: [.cache/pip]
script:
- pip install -r requirements.txt
- pytest --junitxml=report.xml --cov --cov-report=xml
artifacts:
reports:
junit: report.xml
coverage_report:
coverage_format: cobertura
path: coverage.xml
build:
stage: build
image: docker:24
services: [docker:24-dind]
rules:
- if: $CI_COMMIT_BRANCH == "main"
script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker build -t $IMAGE .
- docker push $IMAGE
deploy-prod:
stage: deploy
image: bitnami/kubectl
rules:
- if: $CI_COMMIT_BRANCH == "main"
when: manual # кнопка в UI
environment:
name: production
url: https://app.example.com
script:
- kubectl set image deploy/app app=$IMAGE
Фишки GitLab CI
- Includes — шарить .yml между проектами
- Parent-child pipelines — динамические пайплайны
- Multi-project pipelines — триггерить пайплайны других проектов
- Rules — современная замена
only/except - Review apps — preview environments на PR
- Встроенные SAST/DAST/dependency scanning, security dashboards
- Auto DevOps — на любителя
GitOps — Argo CD ⭐⭐
Концепт
- Состояние кластера = Git
- Argo CD в кластере следит за Git-репозиторием
- При изменениях — авто-sync (или manual approval)
- Drift detection и автоматический heal
Application CRD
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: my-app-prod
namespace: argocd
finalizers:
- resources-finalizer.argocd.argoproj.io
spec:
project: default
source:
repoURL: https://github.com/me/k8s-manifests
path: apps/my-app/overlays/prod
targetRevision: main
destination:
server: https://kubernetes.default.svc
namespace: my-app
syncPolicy:
automated:
prune: true # удалять то, чего нет в Git
selfHeal: true # исправлять manual changes
syncOptions:
- CreateNamespace=true
- PruneLast=true
App of Apps pattern
Один Argo Application указывает на репо с другими Applications. Так управляешь десятками сервисов из одного места.
ApplicationSet
Шаблонизация Applications. Одна ApplicationSet → 50 Applications для 50 кластеров / namespaces.
Argo Rollouts
Расширение Argo для progressive delivery: canary, blue-green, авто-promotion по метрикам Prometheus.
Альтернатива: Flux v2
Более Git-native (CRDs: GitRepository, Kustomization, HelmRelease). Меньше UI (есть Weave GitOps UI отдельно). Native progressive delivery через Flagger.
Стратегии деплоя
| Стратегия | Когда применять |
|---|---|
| Recreate | Можно simple downtime, не критично |
| Rolling Update | K8s default. Постепенная замена, без downtime для stateless |
| Blue-Green | Полный второй стек. Откат мгновенный. Стоит x2 ресурсов |
| Canary | Малый % трафика → новая версия. Расширяем при OK. Стандарт production |
| Shadow / Dark | Новая версия получает копию трафика, не отвечает клиенту. Тестинг на реальной нагрузке |
| Progressive Delivery | Canary + auto-analysis по метрикам/SLO с автоматическим откатом |
Инструменты
- Argo Rollouts ⭐ — для Argo CD
- Flagger — для Flux / любого CI/CD
- Spinnaker — legacy enterprise
Feature Flags
Деплой ≠ релиз. Можно деплоить новый код, но фичу включать постепенно.
- LaunchDarkly — лидер коммерческий
- Unleash ⭐ — open source
- Flagsmith, GrowthBook — open source альтернативы
- OpenFeature — стандарт интерфейсов (от CNCF)
Релиз-менеджмент
- release-please (Google) — автоматический changelog по Conventional Commits
- semantic-release — Node экосистема
- Conventional Changelog
- SemVer: MAJOR.MINOR.PATCH
Безопасность пайплайнов
Подробно — модуль 13. Кратко:
- SAST, DAST, SCA, secret scanning, IaC scanning, container scanning, image signing — всё в pipeline
- OIDC к облакам — никаких long-lived secrets
- Ephemeral runners — после job — destroy
- SLSA framework уровней: 1-4
- В GitHub: pinned actions, allowed actions list, reusable workflows под контролем
Чек-лист
- ☐ GH Actions workflow с matrix, кешем, OIDC
- ☐ Reusable workflow или composite action написан
- ☐ Argo CD деплоит app из Git автоматически
- ☐ Понимаю canary через Argo Rollouts
- ☐ Pinned actions в SHA, минимум permissions
- ☐ Build Docker через Kaniko/buildah без daemon
- ☐ Cosign sign в pipeline
Источники
- Документация: GitHub Actions docs
- Argo CD: argo-cd.readthedocs.io
- Книга: «Continuous Delivery» — Jez Humble (классика)
- Книга: «GitOps and Kubernetes» — Yuen, Matyushentsev (Manning)
- YouTube: TechWorld with Nana
CI/CD освоено. Теперь — Kubernetes, главный навык DevOps.