123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- apiVersion: argoproj.io/v1alpha1
- kind: Workflow
- metadata:
- generateName: k8s-bluegreen-
- annotations:
- argocd.argoproj.io/hook: Sync
- spec:
- entrypoint: k8s-bluegreen
- arguments:
- parameters:
- - name: deployment-name
- - name: service-name
- - name: new-deployment-manifest
- - name: new-service-manifest
-
- templates:
- - name: k8s-bluegreen
- steps:
-
- - - name: create-blue-deployment
- template: clone-deployment
-
- - - name: wait-for-blue-deployment
- template: wait-deployment-ready
- arguments:
- parameters:
- - name: deployment-name
- value: '{{workflow.parameters.deployment-name}}-blue'
-
- - - name: switch-service-to-blue-deployment
- template: patch-service
-
- - - name: apply-green-deployment
- template: apply-manifest
- arguments:
- parameters:
- - name: manifest
- value: '{{workflow.parameters.new-deployment-manifest}}'
-
- - - name: wait-for-green-deployment
- template: wait-deployment-ready
- arguments:
- parameters:
- - name: deployment-name
- value: '{{workflow.parameters.deployment-name}}'
-
- - - name: approve
- template: approve
-
- - - name: switch-service-to-green-deployment
- template: apply-manifest
- arguments:
- parameters:
- - name: manifest
- value: '{{workflow.parameters.new-service-manifest}}'
-
- - - name: delete-cloned-deployment
- template: delete-deployment
-
-
-
-
- - name: clone-deployment
- container:
- image: argoproj/argoexec:v2.1.1
- command: [sh, -c, -x]
- args:
- - kubectl get --export -o json deployment.apps/{{workflow.parameters.deployment-name}} > /original-deploy &&
- jq -r '.metadata.name+="-blue" |
- .spec.template.metadata.labels += (.spec.template.metadata.labels | to_entries | map(select(.key != "applications.argoproj.io/app-name")) | map(.value+="-blue") | from_entries) |
- .spec.selector.matchLabels += (.spec.selector.matchLabels | to_entries | map(select(.key != "applications.argoproj.io/app-name")) | map(.value+="-blue") | from_entries)'
- /original-deploy > /cloned-deploy &&
- cat /cloned-deploy &&
- kubectl apply -o yaml -f /cloned-deploy
-
-
- - name: apply-manifest
- inputs:
- parameters:
- - name: manifest
- artifacts:
- - name: manifest-file
- path: /manifest
- raw:
- data: '{{inputs.parameters.manifest}}'
- container:
- image: argoproj/argoexec:v2.1.1
- command: [sh, -c, -x]
- args:
- - cp /manifest /manifest-new &&
- APP_NAME=$(kubectl get -n default -f /manifest-new -o json | jq -r '.metadata.labels."applications.argoproj.io/app-name"') &&
- if [ "$APP_NAME" != "null" ]; then
- jq -r --arg APP_NAME "$APP_NAME" '.metadata.labels."applications.argoproj.io/app-name" = $APP_NAME' /manifest-new > /manifest-new.tmp &&
- mv /manifest-new.tmp /manifest-new &&
- if [ "$(jq -r .spec.template.metadata.labels /manifest-new)" != "null" ]; then
- jq -r --arg APP_NAME "$APP_NAME" '.spec.template.metadata.labels."applications.argoproj.io/app-name" = $APP_NAME' /manifest-new > /manifest-new.tmp &&
- mv /manifest-new.tmp /manifest-new ;
- fi ;
- fi &&
- cat /manifest-new &&
- kubectl apply -f /manifest-new
-
-
- - name: wait-deployment-ready
- inputs:
- parameters:
- - name: deployment-name
- container:
- image: argoproj/argoexec:v2.1.1
- command: [kubectl, rollout, status, --watch=true, 'deployments/{{inputs.parameters.deployment-name}}']
-
- - name: patch-service
- container:
- image: argoproj/argoexec:v2.1.1
- command: [sh, -c, -x]
- args:
- - kubectl get -n default service {{workflow.parameters.service-name}} --export -o json > /original-svc &&
- jq '.spec.selector = (.spec.selector | with_entries(.value+="-blue"))' /original-svc > /blue-svc &&
- kubectl apply -o yaml -f /blue-svc
- - name: delete-deployment
- resource:
- action: delete
- manifest: |
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- name: {{workflow.parameters.deployment-name}}-blue
- - name: approve
- container:
- image: argoproj/argoexec:v2.1.1
- command: [sleep, "30"]
|