Ctrl K
ComunidadGuías…

infrastructure/05-argocd/main.tf

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
# ============================================================
# ArgoCD Bootstrap
# ============================================================
# Installs ArgoCD immediately after Cilium CNI bootstrap.
# This allows GitOps management of all cluster workloads.
#
# Based on: ci-cd/argocd/environments/prod/values.yaml
#
# After this runs, the cluster will have:
# - ArgoCD installed and running
# - App of Apps deployed (manages all other Applications)
# - Default AppProject configured
# - Full GitOps capability available

locals {
  argocd_values = file("${var.project_root}/ci-cd/argocd/environments/prod/values.yaml")
  argocd_app = yamldecode(
    file("${var.project_root}/ci-cd/argocd/environments/prod/apps/argocd-helm.yaml")
  )
  argocd_chart_version = try(
    local.argocd_app.spec.sources[0].targetRevision,
    null
  )
  app_of_apps_manifest = yamldecode(
    file("${var.project_root}/ci-cd/argocd/environments/prod/app-of-apps.yaml")
  )
}

# ============================================================
# ArgoCD Helm Release
# ============================================================
# Installs ArgoCD from the official Helm chart using the same
# values as ci-cd/argocd/environments/prod/values.yaml

resource "helm_release" "argocd" {
  name       = "argocd"
  repository = "https://argoproj.github.io/argo-helm"
  chart      = "argo-cd"
  version    = local.argocd_chart_version
  namespace  = "argocd"

  values = [local.argocd_values]

  wait             = true
  wait_for_jobs    = true
  timeout          = 600
  create_namespace = true

  depends_on = [data.kubernetes_namespace_v1.probe]
}

# ============================================================
# App of Apps Deployment
# ============================================================
# Deploys the root Application that manages all other ArgoCD
# Applications via the app-of-apps pattern using kubectl.
# Uses null_resource because kubernetes_manifest validates during
# plan phase before ArgoCD CRDs exist.

resource "null_resource" "app_of_apps" {
  triggers = {
    manifest_hash = md5(yamlencode(local.app_of_apps_manifest))
    manifest      = yamlencode(local.app_of_apps_manifest)
    infra_root    = var.infra_root
  }

  depends_on = [
    helm_release.argocd,
    kubernetes_secret_v1.longhorn_crypto,
    kubernetes_secret_v1.longhorn_b2,
  ]

  provisioner "local-exec" {
    interpreter = ["bash", "-c"]
    command     = <<-EOT
      source ${self.triggers.infra_root}/scripts/common.sh  # Change to self.triggers
      load_tf_kube_env
      kubectl_wrapper apply -f - \
        <<'MANIFEST'
      ${self.triggers.manifest}  # Change to self.triggers
      MANIFEST
    EOT
  }
  provisioner "local-exec" {
    when        = destroy
    interpreter = ["bash", "-c"]
    command     = <<-EOT
      source ${self.triggers.infra_root}/scripts/common.sh  # Change to self.triggers
      load_tf_kube_env
      kubectl_wrapper delete application --ignore-not-found -f - \
        <<'MANIFEST'
      ${self.triggers.manifest}  # Change to self.triggers
      MANIFEST
    EOT
  }
}