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
 | 
			
		||||
    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
 | 
			
		||||
 
 | 
			
		||||
@@ -199,3 +199,126 @@ WORKDIR /src
 | 
			
		||||
COPY . /src
 | 
			
		||||
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