An Anatomy of an ArgoCD ApplicationSet


TL; DR: Here’s a working ArgoCD Application Set in YAML with probably all popular features + comments. I wouldn’t expect anyone got theirselves here without knowing what an ArgoCD ApplicationSet is for but just in case.

---
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  annotations: {}
  labels:
    name: argocd-application-set
  name: argocd-application-set
  namespace: argocd
spec:
  generators:
  # list is usually the most versatile generator
  - list:
      elements:
      - cascadeDelete: false
        destination_namespace: argocd
        destination_server: https://kubernetes.default.svc
        disableDefaultLibs: false
        libs: []
        name: argocd
        path: argocd
        project: ci-cd
        prune: true
        repoURL: https://github.com:my-account/my-argo-repo.git
        selfHeal: true
        syncOptions: []
        targetRevision: HEAD
        # top level arguments
        tlas:
        - name: env
          value: nonprod
        - name: foo
          value: bar
        - name: cluster
          value: beta
      - <next item> ...

  goTemplate: true
  goTemplateOptions:
  - missingkey=error
  template:
    metadata:
      # value of String type can go like this
      name: '{{ .name }}'
    spec:
      destination:
        namespace: '{{ .destination_namespace }}'
        server: '{{ .destination_server }}'
      ignoreDifferences: []
      project: '{{ .project }}'
      source:
        path: '{{ .path }}'
        repoURL: '{{ .repoURL }}'
        targetRevision: '{{ .targetRevision }}'
      syncPolicy:
        syncOptions:
        # common value for all ArgoCD Applications
        - ApplyOutOfSyncOnly=true
  # advanced patching usiong conditions and loops
  # for values that are more than simple strings
  templatePatch: |
    metadata:
    {{ -if .cascadeDelete }}
      finalizers:
        - resources-finalizer.argocd.argoproj.io
    {{ -end }}
    spec:
      source:
        directory:
          jsonnet:
            tlas:
            {{ -range $tla in .tlas }}
              - name: '{{ $tla.name }}'
                value: '{{ $tla.value }}'
            {{ -end }}
            libs:
            {{ -if not .disableDefaultLibs }}
              - 'mylib.libsonnet'
            {{ -end }}
            {{ -range $lib in .libs }}
              - '{{ $lib }}'
            {{ -end }}
      syncPolicy:
        automated:
          prune: '{{ .prune }}'
          selfHeal: '{{ .selfHeal }}'

A good reference: https://medium.com/@geoffrey.muselli/argocd-at-scale-with-applicationset-go-template-7f326d8a61f3

🙂

,