← Back to notes

Argo CD в CI/CD: от
merge до стабильного rollout

2026-02-21


Argo CD как GitOps-контроллер

Сравнивает desired state в Git с live state в Kubernetes и приводит cluster к Git по заданной политике. Поддерживает plain-YAML, Kustomize, Helm, Jsonnet, custom config management plugins.


Sync policy

Поле syncPolicy.automated:

  • prune: true — удаляет ресурсы, исчезнувшие из Git;
  • selfHeal: true — восстанавливает ручные изменения в кластере;
  • allowEmpty: false (default) — защищает от пустого манифеста, который удалил бы всё.

Доп. опции в syncOptions: CreateNamespace=true, PrunePropagationPolicy=foreground, ServerSideApply=true, Replace=true, RespectIgnoreDifferences=true.

targetRevision: HEAD — антипаттерн в production: ссылается на «последний коммит» дефолтной ветки и нарушает воспроизводимость. Использовать тег или SHA.


Sync waves и hooks

Sync waves — порядок применения через annotation argocd.argoproj.io/sync-wave: "-1" (отрицательные применяются раньше). Полезно для CRD → operator → workload.

Resource hooks через argocd.argoproj.io/hook:

  • PreSync — миграции БД до деплоя;
  • Sync — основной поток;
  • PostSync — smoke tests;
  • SyncFail — cleanup при ошибке;
  • политики HookSucceeded/HookFailed/BeforeHookCreation определяют lifecycle hook-ресурса.

Drift detection и rollback

Argo CD непрерывно сравнивает Git и cluster. При расхождении:

  • статус OutOfSync;
  • selfHeal возвращает к Git автоматически;
  • ручной откат — git revert коммит и sync.

Прямой откат на предыдущий деплой:

argocd app history demo-app
argocd app rollback demo-app <history-id>

argocd app rollback отключает auto-sync на время отката, иначе controller сразу вернёт состояние к Git.


ApplicationSet

Шаблонизация Application для multi-cluster / multi-tenant:

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: tenants
spec:
  generators:
  - list:
      elements:
      - name: team-a
        cluster: prod
      - name: team-b
        cluster: prod
  template:
    metadata:
      name: '{{name}}'
    spec:
      project: default
      source:
        repoURL: https://git.example/apps.git
        targetRevision: v1.4.2
        path: 'apps/{{name}}'
      destination:
        server: https://kubernetes.default.svc
        namespace: '{{name}}'

Генераторы: List, Cluster, Git (files/directories), Matrix, PullRequest, SCMProvider.


Базовый Application

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: demo-app
spec:
  project: default
  source:
    repoURL: https://github.com/argoproj/argocd-example-apps.git
    path: guestbook
    targetRevision: v0.5.0   # тег или SHA, не HEAD
  destination:
    server: https://kubernetes.default.svc
    namespace: demo
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
      allowEmpty: false
    syncOptions:
    - CreateNamespace=true
    - ServerSideApply=true

Операционные команды

argocd app get demo-app
argocd app sync demo-app
argocd app history demo-app
argocd app rollback demo-app 12
argocd app diff demo-app

Guardrails

  • pre-merge: lint/scan/tests/policy (OPA/Kyverno);
  • разделение окружений и promotion strategy через теги/ветки;
  • запрет targetRevision: HEAD в prod;
  • runbook для git revert и argocd app rollback.

Ссылки

Argo CD в CI/CD: от merge до стабильного rollout | Aleksandr Suprun