--- name: gitops-workflows description: GitOps deployment workflows with ArgoCD and Flux. Use for setting up GitOps (ArgoCD 3.x, Flux 2.7), designing repository structures (monorepo/polyrepo, app-of-apps), multi-cluster deployments (ApplicationSets, hub-spoke), secrets management (SOPS+age, Sealed Secrets, External Secrets Operator), progressive delivery (Argo Rollouts, Flagger), troubleshooting sync issues, and OCI artifact management. Covers latest 2024-2025 features: ArgoCD annotation-based tracking, fine-grained RBAC, Flux OCI artifacts GA, image automation, source-watcher. --- # GitOps Workflows ## Overview This skill provides comprehensive GitOps workflows for continuous deployment to Kubernetes using ArgoCD 3.x and Flux 2.7+. **When to use this skill**: - Setting up GitOps from scratch (ArgoCD or Flux) - Designing Git repository structures - Multi-cluster deployments - Troubleshooting sync/reconciliation issues - Implementing secrets management - Progressive delivery (canary, blue-green) - Migrating between GitOps tools --- ## Core Workflow: GitOps Implementation Use this decision tree to determine your starting point: ``` Do you have GitOps installed? ├─ NO → Need to choose a tool │ └─ Want UI + easy onboarding? → ArgoCD (Workflow 1) │ └─ Want modularity + platform engineering? → Flux (Workflow 2) └─ YES → What's your goal? ├─ Sync issues / troubleshooting → Workflow 7 ├─ Multi-cluster deployment → Workflow 4 ├─ Secrets management → Workflow 5 ├─ Progressive delivery → Workflow 6 ├─ Repository structure → Workflow 3 └─ Tool comparison → Read references/argocd_vs_flux.md ``` --- ## 1. Initial Setup: ArgoCD 3.x **Latest Version**: v3.1.9 (stable), v3.2.0-rc4 (October 2025) ### Quick Install ```bash # Create namespace kubectl create namespace argocd # Install ArgoCD 3.x kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/v3.1.9/manifests/install.yaml # Get admin password kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d # Port forward to access UI kubectl port-forward svc/argocd-server -n argocd 8080:443 # Access: https://localhost:8080 ``` **→ Template**: [assets/argocd/install-argocd-3.x.yaml](assets/argocd/install-argocd-3.x.yaml) ### ArgoCD 3.x New Features **Breaking Changes**: - ✅ Annotation-based tracking (default, was labels) - ✅ RBAC logs enforcement enabled - ✅ Legacy metrics removed **New Features**: - ✅ Fine-grained RBAC (per-resource permissions) - ✅ Better defaults (resource exclusions for performance) - ✅ Secrets operators endorsement ### Deploy Your First Application ```bash # CLI method argocd app create guestbook \ --repo https://github.com/argoproj/argocd-example-apps.git \ --path guestbook \ --dest-server https://kubernetes.default.svc \ --dest-namespace default # Sync application argocd app sync guestbook ``` ### Health Check ```bash # Check application health python3 scripts/check_argocd_health.py \ --server https://argocd.example.com \ --token $ARGOCD_TOKEN ``` **→ Script**: [scripts/check_argocd_health.py](scripts/check_argocd_health.py) --- ## 2. Initial Setup: Flux 2.7 **Latest Version**: v2.7.1 (October 2025) ### Quick Install ```bash # Install Flux CLI brew install fluxcd/tap/flux # macOS # or: curl -s https://fluxcd.io/install.sh | sudo bash # Check prerequisites flux check --pre # Bootstrap Flux (GitHub) export GITHUB_TOKEN= flux bootstrap github \ --owner= \ --repository=fleet-infra \ --branch=main \ --path=clusters/production \ --personal # Enable source-watcher (Flux 2.7+) flux install --components-extra=source-watcher ``` **→ Template**: [assets/flux/flux-bootstrap-github.sh](assets/flux/flux-bootstrap-github.sh) ### Flux 2.7 New Features - ✅ Image automation GA - ✅ ExternalArtifact and ArtifactGenerator APIs - ✅ Source-watcher component for better performance - ✅ OpenTelemetry tracing support - ✅ CEL expressions for readiness evaluation ### Deploy Your First Application ```yaml # gitrepository.yaml apiVersion: source.toolkit.fluxcd.io/v1 kind: GitRepository metadata: name: podinfo namespace: flux-system spec: interval: 1m url: https://github.com/stefanprodan/podinfo ref: branch: master --- # kustomization.yaml apiVersion: kustomize.toolkit.fluxcd.io/v1 kind: Kustomization metadata: name: podinfo namespace: flux-system spec: interval: 5m path: "./kustomize" prune: true sourceRef: kind: GitRepository name: podinfo ``` ### Health Check ```bash # Check Flux health python3 scripts/check_flux_health.py --namespace flux-system ``` **→ Script**: [scripts/check_flux_health.py](scripts/check_flux_health.py) --- ## 3. Repository Structure Design **Decision: Monorepo or Polyrepo?** ### Monorepo Pattern **Best for**: Startups, small teams (< 20 apps), single team ``` gitops-repo/ ├── apps/ │ ├── frontend/ │ ├── backend/ │ └── database/ ├── infrastructure/ │ ├── ingress/ │ ├── monitoring/ │ └── secrets/ └── clusters/ ├── dev/ ├── staging/ └── production/ ``` ### Polyrepo Pattern **Best for**: Large orgs, multiple teams, clear boundaries ``` infrastructure-repo/ (Platform team) app-team-1-repo/ (Team 1) app-team-2-repo/ (Team 2) ``` ### Environment Structure (Kustomize) ``` app/ ├── base/ │ ├── deployment.yaml │ ├── service.yaml │ └── kustomization.yaml └── overlays/ ├── dev/ │ ├── kustomization.yaml │ └── replica-patch.yaml ├── staging/ └── production/ ``` **→ Reference**: [references/repo_patterns.md](references/repo_patterns.md) ### Validate Repository Structure ```bash python3 scripts/validate_gitops_repo.py /path/to/repo ``` **→ Script**: [scripts/validate_gitops_repo.py](scripts/validate_gitops_repo.py) --- ## 4. Multi-Cluster Deployments ### ArgoCD ApplicationSets **Cluster Generator** (deploy to all clusters): ```yaml apiVersion: argoproj.io/v1alpha1 kind: ApplicationSet metadata: name: cluster-apps spec: generators: - cluster: selector: matchLabels: environment: production template: metadata: name: '{{name}}-myapp' spec: source: repoURL: https://github.com/org/apps path: myapp destination: server: '{{server}}' ``` **→ Template**: [assets/applicationsets/cluster-generator.yaml](assets/applicationsets/cluster-generator.yaml) **Performance Benefit**: 83% faster deployments (30min → 5min) ### Generate ApplicationSets ```bash # Cluster generator python3 scripts/applicationset_generator.py cluster \ --name my-apps \ --repo-url https://github.com/org/repo \ --output appset.yaml # Matrix generator (cluster x apps) python3 scripts/applicationset_generator.py matrix \ --name my-apps \ --cluster-label production \ --directories app1,app2,app3 \ --output appset.yaml ``` **→ Script**: [scripts/applicationset_generator.py](scripts/applicationset_generator.py) ### Flux Multi-Cluster **Hub-and-Spoke**: Management cluster manages all clusters ```bash # Bootstrap each cluster flux bootstrap github --context prod-cluster --path clusters/production flux bootstrap github --context staging-cluster --path clusters/staging ``` **→ Reference**: [references/multi_cluster.md](references/multi_cluster.md) --- ## 5. Secrets Management **Never commit plain secrets to Git.** Choose a solution: ### Decision Matrix | Solution | Complexity | Best For | 2025 Trend | |----------|-----------|----------|------------| | **SOPS + age** | Medium | Git-centric, flexible | ↗️ Preferred | | **External Secrets Operator** | Medium | Cloud-native, dynamic | ↗️ Growing | | **Sealed Secrets** | Low | Simple, GitOps-first | → Stable | ### Option 1: SOPS + age (Recommended 2025) **Setup**: ```bash # Generate age key age-keygen -o key.txt # Public key: age1... # Create .sops.yaml cat < .sops.yaml creation_rules: - path_regex: .*.yaml encrypted_regex: ^(data|stringData)$ age: age1ql3z7hjy54pw3hyww5ayyfg7zqgvc7w3j2elw8zmrj2kg5sfn9aqmcac8p EOF # Encrypt secret kubectl create secret generic my-secret --dry-run=client -o yaml \ --from-literal=password=supersecret > secret.yaml sops -e secret.yaml > secret.enc.yaml # Commit encrypted version git add secret.enc.yaml .sops.yaml ``` **→ Template**: [assets/secrets/sops-age-config.yaml](assets/secrets/sops-age-config.yaml) ### Option 2: External Secrets Operator (v0.20+) **Best for**: Cloud-native apps, dynamic secrets, automatic rotation ### Option 3: Sealed Secrets **Best for**: Simple setup, static secrets, no external dependencies **→ Reference**: [references/secret_management.md](references/secret_management.md) ### Audit Secrets ```bash python3 scripts/secret_audit.py /path/to/repo ``` **→ Script**: [scripts/secret_audit.py](scripts/secret_audit.py) --- ## 6. Progressive Delivery ### Argo Rollouts (with ArgoCD) **Canary Deployment**: ```yaml apiVersion: argoproj.io/v1alpha1 kind: Rollout metadata: name: my-app spec: strategy: canary: steps: - setWeight: 20 - pause: {duration: 2m} - setWeight: 50 - pause: {duration: 2m} - setWeight: 100 ``` **→ Template**: [assets/progressive-delivery/argo-rollouts-canary.yaml](assets/progressive-delivery/argo-rollouts-canary.yaml) ### Flagger (with Flux) **Canary with Metrics Analysis**: ```yaml apiVersion: flagger.app/v1beta1 kind: Canary metadata: name: my-app spec: analysis: interval: 1m threshold: 5 maxWeight: 50 stepWeight: 10 metrics: - name: request-success-rate thresholdRange: min: 99 ``` **→ Reference**: [references/progressive_delivery.md](references/progressive_delivery.md) --- ## 7. Troubleshooting ### Common Issues **ArgoCD OutOfSync**: ```bash # Check differences argocd app diff my-app # Sync application argocd app sync my-app # Check health python3 scripts/check_argocd_health.py --server https://argocd.example.com --token $TOKEN ``` **Flux Not Reconciling**: ```bash # Check resources flux get all # Check specific kustomization flux get kustomizations kubectl describe kustomization my-app -n flux-system # Force reconcile flux reconcile kustomization my-app ``` **Detect Drift**: ```bash # ArgoCD drift detection python3 scripts/sync_drift_detector.py --argocd --app my-app # Flux drift detection python3 scripts/sync_drift_detector.py --flux ``` **→ Script**: [scripts/sync_drift_detector.py](scripts/sync_drift_detector.py) **→ Reference**: [references/troubleshooting.md](references/troubleshooting.md) --- ## 8. OCI Artifacts (Flux 2.6+) **GA Status**: Flux v2.6 (June 2025) ### Use OCIRepository for Helm Charts ```yaml apiVersion: source.toolkit.fluxcd.io/v1beta2 kind: OCIRepository metadata: name: podinfo-oci spec: interval: 5m url: oci://ghcr.io/stefanprodan/charts/podinfo ref: semver: ">=6.0.0" verify: provider: cosign ``` **→ Template**: [assets/flux/oci-helmrelease.yaml](assets/flux/oci-helmrelease.yaml) ### Verify OCI Artifacts ```bash python3 scripts/oci_artifact_checker.py \ --verify ghcr.io/org/app:v1.0.0 \ --provider cosign ``` **→ Script**: [scripts/oci_artifact_checker.py](scripts/oci_artifact_checker.py) **→ Reference**: [references/oci_artifacts.md](references/oci_artifacts.md) --- ## Quick Reference Commands ### ArgoCD ```bash # List applications argocd app list # Get application details argocd app get # Sync application argocd app sync # View diff argocd app diff # Delete application argocd app delete ``` ### Flux ```bash # Check Flux status flux check # Get all resources flux get all # Reconcile immediately flux reconcile source git flux reconcile kustomization # Suspend/Resume flux suspend kustomization flux resume kustomization # Export resources flux export source git --all > sources.yaml ``` --- ## Resources Summary ### Scripts (automation and diagnostics) - `check_argocd_health.py` - Diagnose ArgoCD sync issues (3.x compatible) - `check_flux_health.py` - Diagnose Flux reconciliation issues (2.7+ compatible) - `validate_gitops_repo.py` - Validate repository structure and manifests - `sync_drift_detector.py` - Detect drift between Git and cluster - `secret_audit.py` - Audit secrets management (SOPS, Sealed Secrets, ESO) - `applicationset_generator.py` - Generate ApplicationSet manifests - `promotion_validator.py` - Validate environment promotion workflows - `oci_artifact_checker.py` - Validate Flux OCI artifacts and verify signatures ### References (deep-dive documentation) - `argocd_vs_flux.md` - Comprehensive comparison (2024-2025), decision matrix - `repo_patterns.md` - Monorepo vs polyrepo, app-of-apps, environment structures - `secret_management.md` - SOPS+age, Sealed Secrets, ESO (2025 best practices) - `progressive_delivery.md` - Argo Rollouts, Flagger, canary/blue-green patterns - `multi_cluster.md` - ApplicationSets, Flux multi-tenancy, hub-spoke patterns - `troubleshooting.md` - Common sync issues, debugging commands - `best_practices.md` - CNCF GitOps principles, security, 2025 recommendations - `oci_artifacts.md` - Flux OCI artifacts (GA v2.6), signature verification ### Templates (production-ready configurations) - `argocd/install-argocd-3.x.yaml` - ArgoCD 3.x installation with best practices - `applicationsets/cluster-generator.yaml` - Multi-cluster ApplicationSet example - `flux/flux-bootstrap-github.sh` - Flux 2.7 bootstrap script - `flux/oci-helmrelease.yaml` - OCI artifact + HelmRelease example - `secrets/sops-age-config.yaml` - SOPS + age configuration - `progressive-delivery/argo-rollouts-canary.yaml` - Canary deployment with analysis