Test drone
This commit is contained in:
		
							
								
								
									
										23
									
								
								.drone.yml
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								.drone.yml
									
									
									
									
									
								
							@@ -42,6 +42,29 @@ steps:
 | 
				
			|||||||
    repo: git.badhouseplants.net/allanger/badhouseplants-net
 | 
					    repo: git.badhouseplants.net/allanger/badhouseplants-net
 | 
				
			||||||
    tags: ${DRONE_COMMIT_SHA}
 | 
					    tags: ${DRONE_COMMIT_SHA}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- name: Deploy a preview ApplicationSet
 | 
				
			||||||
 | 
					  image: alpine/k8s
 | 
				
			||||||
 | 
					  when: 
 | 
				
			||||||
 | 
					    branch:
 | 
				
			||||||
 | 
					      exclude:
 | 
				
			||||||
 | 
					        - main
 | 
				
			||||||
 | 
					  environment:
 | 
				
			||||||
 | 
					    KUBECONFIG_CONTENT:
 | 
				
			||||||
 | 
					      from_secret: KUBECONFIG_CONTENT
 | 
				
			||||||
 | 
					    ARGO_APP_BRANCH: ${DRONE_BRANCH}
 | 
				
			||||||
 | 
					    ARGO_APP_HOSTNAME: "${DRONE_BRANCH}-dev.badhouseplants.net"
 | 
				
			||||||
 | 
					    ARGO_APP_IMAGE_TAG: ${DRONE_COMMIT_SHA}
 | 
				
			||||||
 | 
					  commands: 
 | 
				
			||||||
 | 
					    - mkdir $HOME/.kube
 | 
				
			||||||
 | 
					    - echo $KUBECONFIG_CONTENT | base64 -d > $HOME/.kube/config
 | 
				
			||||||
 | 
					    - apk update --no-cache && apk add yq gettext
 | 
				
			||||||
 | 
					    - export ARGO_APP_CHART_VERSION=`cat chart/Chart.yaml | yq '.version'
 | 
				
			||||||
 | 
					    - kubectl get -f applicationset.yaml -o yaml  > /tmp/old_appset.yaml
 | 
				
			||||||
 | 
					    - yq 'del(.spec.generators[].list.elements[] | select(.name == ""))' /tmp/old_application.set > /tmp/clean_appset.yaml
 | 
				
			||||||
 | 
					    - envsubst  < ./kube/template.yaml > /tmp/elements.yaml
 | 
				
			||||||
 | 
					    - yq '.spec.generators[].list.elements + load("/tmp/elements.yaml")' /tmp/clean_appset.yaml > /tmp/new_appset.yaml
 | 
				
			||||||
 | 
					    - kubectl apply -f /tmp/new_appset.yaml
 | 
				
			||||||
 | 
					
 | 
				
			||||||
---
 | 
					---
 | 
				
			||||||
# ----------------------------------------------
 | 
					# ----------------------------------------------
 | 
				
			||||||
# -- Upload a newer version of my CV
 | 
					# -- Upload a newer version of my CV
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -198,4 +198,127 @@ FROM git.badhouseplants.net/badhouseplants/hugo-builder
 | 
				
			|||||||
WORKDIR /src
 | 
					WORKDIR /src
 | 
				
			||||||
COPY . /src
 | 
					COPY . /src
 | 
				
			||||||
RUN hugo
 | 
					RUN hugo
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### How to deploy
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Previously I was using the same helmfile that I use for everything else in my k8s cluster. It was fine for static envs, but when I need to deploy them dynamically, it's not an option anymore. And here `ArgoCD` enters the room. I'm creating an `ApplicationSet` that looks like that: 
 | 
				
			||||||
 | 
					```YAML
 | 
				
			||||||
 | 
					apiVersion: argoproj.io/v1alpha1
 | 
				
			||||||
 | 
					kind: ApplicationSet
 | 
				
			||||||
 | 
					metadata:
 | 
				
			||||||
 | 
					  name: badhouseplants-net
 | 
				
			||||||
 | 
					  namespace: argo-system
 | 
				
			||||||
 | 
					spec:
 | 
				
			||||||
 | 
					  generators:
 | 
				
			||||||
 | 
					    - list:
 | 
				
			||||||
 | 
					        elements:
 | 
				
			||||||
 | 
					          - name: application # just not to lose a backward compability with the prevouos setup
 | 
				
			||||||
 | 
					            app: badhouseplants
 | 
				
			||||||
 | 
					            branch: main
 | 
				
			||||||
 | 
					            chart_version: 0.3.6
 | 
				
			||||||
 | 
					            # Image that is lates now, we'll get there later
 | 
				
			||||||
 | 
					            value: |
 | 
				
			||||||
 | 
					              hugo:
 | 
				
			||||||
 | 
					                image:
 | 
				
			||||||
 | 
					                  tag: latest
 | 
				
			||||||
 | 
					            # And this is an example of environemnt that I want to be created.
 | 
				
			||||||
 | 
					          - name: dynamic-charts
 | 
				
			||||||
 | 
					            app: badhouseplants
 | 
				
			||||||
 | 
					            branch: dynamic-charts
 | 
				
			||||||
 | 
					            chart_version: 0.3.6
 | 
				
			||||||
 | 
					            value: |
 | 
				
			||||||
 | 
					              istio:
 | 
				
			||||||
 | 
					                hosts:
 | 
				
			||||||
 | 
					                  - dynamic-charts-dev.badhouseplants.net
 | 
				
			||||||
 | 
					              hugo:
 | 
				
			||||||
 | 
					                image:
 | 
				
			||||||
 | 
					                  tag: 5d742a71731320883db698432303c92aee4d68a1
 | 
				
			||||||
 | 
					                baseURL: https://dynamic-charts-dev.badhouseplants.net/
 | 
				
			||||||
 | 
					                buildDrafts: true
 | 
				
			||||||
 | 
					  template:
 | 
				
			||||||
 | 
					    metadata:
 | 
				
			||||||
 | 
					      name: "{{ app }}-{{ name }}"
 | 
				
			||||||
 | 
					      namespace: argo-system
 | 
				
			||||||
 | 
					    spec:
 | 
				
			||||||
 | 
					      project: "default"
 | 
				
			||||||
 | 
					      source:
 | 
				
			||||||
 | 
					        helm:
 | 
				
			||||||
 | 
					          valueFiles:
 | 
				
			||||||
 | 
					            - values.yaml
 | 
				
			||||||
 | 
					          values: "{{ value }}"
 | 
				
			||||||
 | 
					        repoURL: https://git.badhouseplants.net/api/packages/allanger/helm
 | 
				
			||||||
 | 
					        targetRevision: "{{ chart_version }}"
 | 
				
			||||||
 | 
					        chart: badhouseplants-net
 | 
				
			||||||
 | 
					      destination:
 | 
				
			||||||
 | 
					        server: "https://kubernetes.default.svc"
 | 
				
			||||||
 | 
					        namespace: "{{ app }}-{{ name }}"
 | 
				
			||||||
 | 
					      syncPolicy:
 | 
				
			||||||
 | 
					        syncOptions:
 | 
				
			||||||
 | 
					          - CreateNamespace=true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					``` 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					But storing I don't like an idea of storing something like that in the repository. So in the git I'm putting something like that.
 | 
				
			||||||
 | 
					```YAML
 | 
				
			||||||
 | 
					apiVersion: argoproj.io/v1alpha1
 | 
				
			||||||
 | 
					kind: ApplicationSet
 | 
				
			||||||
 | 
					metadata:
 | 
				
			||||||
 | 
					  name: badhouseplants-net
 | 
				
			||||||
 | 
					  namespace: argo-system
 | 
				
			||||||
 | 
					spec:
 | 
				
			||||||
 | 
					  generators:
 | 
				
			||||||
 | 
					    - list:
 | 
				
			||||||
 | 
					        elements:
 | 
				
			||||||
 | 
					          - name: application 
 | 
				
			||||||
 | 
					            app: badhouseplants
 | 
				
			||||||
 | 
					            branch: main
 | 
				
			||||||
 | 
					            chart_version: 0.3.6
 | 
				
			||||||
 | 
					            value: |
 | 
				
			||||||
 | 
					              hugo:
 | 
				
			||||||
 | 
					                image:
 | 
				
			||||||
 | 
					                  tag: $ARGO_IMAGE_TAG
 | 
				
			||||||
 | 
					...
 | 
				
			||||||
 | 
					``` 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Since I'm not using latest anymore, I need to add use a new tag every time a new image is pushed. But let's test with the preview env first:
 | 
				
			||||||
 | 
					```YAML
 | 
				
			||||||
 | 
					# ./kube/template.yaml
 | 
				
			||||||
 | 
					...
 | 
				
			||||||
 | 
					- name: $ARGO_APP_BRANCH
 | 
				
			||||||
 | 
					  app: badhouseplants
 | 
				
			||||||
 | 
					  branch: $ARGO_APP_BRANCH
 | 
				
			||||||
 | 
					  chart_version: $ARGO_APP_CHART_VERSION
 | 
				
			||||||
 | 
					  value: |
 | 
				
			||||||
 | 
					    istio:
 | 
				
			||||||
 | 
					      hosts:
 | 
				
			||||||
 | 
					        - $ARGO_APP_HOSTNAME
 | 
				
			||||||
 | 
					    hugo:
 | 
				
			||||||
 | 
					      image:
 | 
				
			||||||
 | 
					        tag: $ARGO_APP_IMAGE_TAG
 | 
				
			||||||
 | 
					      baseURL: https://$ARGO_APP_HOSTNAME/
 | 
				
			||||||
 | 
					      buildDrafts: true
 | 
				
			||||||
 | 
					...
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					And the logic that I would like to have in my setup would be
 | 
				
			||||||
 | 
					- In the git repo there is only application set with the main instance only (production)
 | 
				
			||||||
 | 
					- After a new image is pushed to registry, I'm getting this application set as `yaml` and appending new generator to it.
 | 
				
			||||||
 | 
					- Applying a new `ApplicationSet` and syncing application using the `argo` cli tool
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					First, let's set environment variables:
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					- $ARGO_APP_BRANCH = $DRONE_BRANCH | I don't want to use it directly, in case if I want to stop using Drone
 | 
				
			||||||
 | 
					- $ARGO_APP_CHART_VERSION should be taken from the `./chart/Chart.yaml` file. `cat chart/Chart.yaml | yq '.version'`
 | 
				
			||||||
 | 
					- $ARGO_APP_HOSTNAME, I want it to look like that: "$DRONE_BRANCH-dev.badhouseplants.net"
 | 
				
			||||||
 | 
					- $ARGO_APP_IMAGE_TAG = $DRONE_COMMIT_SHA
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					So after setting all these variables, I can use `envsubst  < ./kube/template.yaml` to create a correct generator. After that I only need to append it to one that is already in k8s. *And not to append if it's already there*.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					So let's design out pipeline:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1. Get an application set is currently deployed to k8s
 | 
				
			||||||
 | 
					    ```BASH
 | 
				
			||||||
 | 
					    kubectl get application-set 
 | 
				
			||||||
 | 
					    ```
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user