4 min read | by Jordi Prats
One of the key features of ArgoCD is the ApplicationSet, which provides a way to group multiple applications together and deploy them as a single unit. This allows you to manage and deploy multiple applications as a single entity, making it easier to coordinate deployments across multiple teams and applications.
We have several ways of generating Applications using and ApplicationSet, one of them is using the repositories Pull Requests.
The PR generator is a convenient way to implement a GitOps workflow, where changes to infrastructure are made through pull requests, ensuring that all changes are reviewed and approved before they are deployed.
It supports several SCMaaS providers such as GitHub, GitLab, Gitea, and Bitbucket Server. For this example we are going to use GitHub, but the changes to use any other provider are minimal.
First, we'll have to store the credentials in a secret, got GitHub it's going to be a PAT:
apiVersion: v1 kind: Secret metadata: name: github-token data: token: Z2hwXzEyMzQ1Njc4OTBwdXRhNDU2Nzg5ZXNwYW55YTg5MDEyMzQ1Ng==
Once this secret is available we just need to create the ApplicationSet, using the spec.template field to configure how the actual Applications are going to be generated. To be able to create them, we'll have some variables available:
With these values we can create applications using the PR the repo like this:
apiVersion: argoproj.io/v1alpha1 kind: ApplicationSet metadata: name: pr-versions namespace: argocd spec: generators: - pullRequest: github: owner: pet2cattle repo: demo-app tokenRef: secretName: github-token key: token requeueAfterSeconds: 600 template: metadata: name: "demo-app-pr{{ number }}" namespace: argocd spec: project: default destination: namespace: demo-app server: 'https://kubernetes.default.svc' source: repoURL: git@github.com:pet2cattle/demo-app.git path: manifests targetRevision: "{{ head_sha }}" kustomize: namePrefix: "pr{{ number }}-" commonLabels: app-instance: "pr{{ number }}" commonAnnotations: domain: "pr{{ number }}.127.0.0.1.nip.io" images: - "jordiprats/demoapp=jordiprats/demoapp:pr{{ number }}" syncPolicy: automated: selfHeal: true prune: true syncOptions: - CreateNamespace=true
If when we create the ApplicationSet there are no pull requests, we'll get an error condition as follows:
$ kubectl describe applicationset pr-versions apiVersion: argoproj.io/v1alpha1 kind: ApplicationSet (...) Status: Conditions: Last Transition Time: 2023-01-02T14:05:50Z Message: error listing repos: error listing pull requests for pet2cattle/demo-app: GET https://api.github.com/repos/pet2cattle/demo-app/pulls?per_page=100: 404 Not Found [] Reason: ApplicationGenerationFromParamsError Status: True Type: ErrorOccurred Last Transition Time: 2023-01-02T14:05:50Z Message: error listing repos: error listing pull requests for pet2cattle/demo-app: GET https://api.github.com/repos/pet2cattle/demo-app/pulls?per_page=100: 404 Not Found [] Reason: ErrorOccurred Status: False Type: ParametersGenerated Last Transition Time: 2023-01-02T14:05:50Z Message: error listing repos: error listing pull requests for pet2cattle/demo-app: GET https://api.github.com/repos/pet2cattle/demo-app/pulls?per_page=100: 404 Not Found [] Reason: ApplicationGenerationFromParamsError Status: False Type: ResourcesUpToDate Events: <none>
As soon as we create the first PR, the error will go away:
$ kubectl get applicationset pr-versions -o yaml apiVersion: argoproj.io/v1alpha1 kind: ApplicationSet (...) status: conditions: - lastTransitionTime: "2023-01-03T08:45:53Z" message: Successfully generated parameters for all Applications reason: ApplicationSetUpToDate status: "False" type: ErrorOccurred - lastTransitionTime: "2023-01-03T08:45:53Z" message: Successfully generated parameters for all Applications reason: ParametersGenerated status: "True" type: ParametersGenerated - lastTransitionTime: "2023-01-03T08:45:53Z" message: ApplicationSet up to date reason: ApplicationSetUpToDate status: "True" type: ResourcesUpToDate
Posted on 22/02/2023