11name : Reset environment
22run-name : " Reset ${{ inputs.environment }} environment"
3- # FIXME:
4- # - replace sleep 30 with kubectl wait for job completion
5- # - add status code checks
6- # - refactor multiple git hub steps into job list
7- # instead of having multiple similar steps we may have a matrix job with max-parallel: 1
83on :
94 workflow_dispatch :
105 inputs :
116 environment :
127 description : " Target environment"
138 required : true
14- default : " dev"
159 type : choice
1610 options :
1711 - demo
2216 environment :
2317 type : string
2418jobs :
25- reset :
26- environment : ${{ inputs.environment }}
19+ prepare :
20+ outputs :
21+ values-file : ${{ steps.get-values.outputs.values-file }}
2722 env :
2823 namespace : opencrvs-${{ inputs.environment }}
2924 runs-on :
@@ -32,77 +27,76 @@ jobs:
3227 - ${{ inputs.environment }}
3328 steps :
3429 - name : Get helm release values and Quote specific fields that are commonly numeric
30+ id : get-values
3531 run : |
3632 helm get values opencrvs -n ${namespace} -ojson | \
3733 jq '
34+ # Quote image tags
3835 if has("image") and (.image | has("tag")) and (.image.tag | type == "number") then
3936 .image.tag = (.image.tag | tostring)
4037 else . end |
38+
39+ # Quote version numbers
4140 if has("version") and (.version | type == "number") then
4241 .version = (.version | tostring)
4342 else . end |
43+
44+ # Quote port numbers if needed (optional)
4445 if has("service") and (.service | has("port")) and (.service.port | type == "number") then
4546 .service.port = (.service.port | tostring)
4647 else . end
47- ' > ${namespace}.json
48- - name : Cleanup environment
49- run : |
50- kubectl delete job -n ${namespace} --ignore-not-found=true data-cleanup
51- helm template -f ${namespace}.json \
52- --set data_cleanup.enabled=true \
53- --namespace ${namespace} \
54- -s templates/data-cleanup-job.yaml \
55- oci://ghcr.io/opencrvs/opencrvs-services | kubectl apply -n ${namespace} --wait=true -f -
56- kubectl wait --for=condition=complete job/data-cleanup -n ${namespace} --timeout=600s || true
57- kubectl logs job/data-cleanup -f --all-containers=true -n ${namespace} || true
58- - name : Re-run postgres on-update-core
59- run : |
60- kubectl delete job -n ${namespace} --ignore-not-found=true postgres-on-update-core;
61- helm template -f ${namespace}.json \
62- --namespace ${namespace} \
63- -s templates/postgres-on-update-core.yaml \
64- oci://ghcr.io/opencrvs/opencrvs-services | kubectl apply -n ${namespace} --wait=true -f -;
65- kubectl wait --for=condition=complete job/postgres-on-update-core -n ${namespace} --timeout=600s || true
66- kubectl logs job/postgres-on-update-core -f --all-containers=true -n ${namespace} || true
67- - name : Re-run postgres-data-migration
68- run : |
69- kubectl delete job -n ${namespace} --ignore-not-found=true postgres-data-migration;
70- helm template -f ${namespace}.json \
71- --namespace ${namespace} \
72- -s templates/postgres-migration-job.yaml \
73- oci://ghcr.io/opencrvs/opencrvs-services | kubectl apply -n ${namespace} --wait=true -f -;
74- kubectl wait --for=condition=complete job/postgres-data-migration -n ${namespace} --timeout=600s || true
75- kubectl logs job/postgres-data-migration -f --all-containers=true -n ${namespace} || true
76- - name : Re-run postgres on-update-analytics
77- run : |
78- kubectl delete job -n ${namespace} --ignore-not-found=true postgres-on-update-analytics;
79- helm template -f ${namespace}.json \
80- -s templates/postgres-on-update-analytics.yaml \
81- --namespace ${namespace} \
82- oci://ghcr.io/opencrvs/opencrvs-services | kubectl apply -n ${namespace} --wait=true -f -;
83- kubectl wait --for=condition=complete job/postgres-on-update-analytics -n ${namespace} --timeout=600s || true
84- kubectl logs job/postgres-on-update-analytics -f --all-containers=true -n ${namespace} || true
85- - name : Migration
86- run : |
87- kubectl delete job -n ${namespace} --ignore-not-found=true data-migration-on-reset
88- helm template -f ${namespace}.json \
89- --set data_migration.job_name=data-migration-on-reset \
90- -s templates/data-migration-job.yaml \
91- --namespace ${namespace} \
92- oci://ghcr.io/opencrvs/opencrvs-services | kubectl apply -n ${namespace} --wait=true -f -
93- kubectl wait --for=condition=complete job/data-migration-on-reset -n ${namespace} --timeout=600s || true
94- kubectl logs job/data-migration-on-reset -f -n ${namespace} || true
95- - name : Seeding data
96- run : |
97- kubectl delete job -n ${namespace} --ignore-not-found=true data-seed
98- kubectl delete pod -n ${namespace} -lapp=events;
99- kubectl wait --for=condition=ready pod -n ${namespace} -lapp=events --timeout=600s;
100- helm template -f ${namespace}.json \
101- --set data_seed.enabled=true \
102- --namespace ${namespace} \
103- -s templates/data-seed-job.yaml \
104- oci://ghcr.io/opencrvs/opencrvs-services | kubectl apply -n ${namespace} --wait -f -
105- sleep 10;
106- kubectl wait --for=condition=complete job/data-seed -n ${namespace} --timeout=600s || true
107- kubectl logs job/data-seed -f -n ${namespace} || true
108- kubectl delete pod -n ${namespace} -lapp=events;
48+ ' > /tmp/${namespace}.json
49+ echo "values-file=/tmp/${namespace}.json" >> $GITHUB_OUTPUT
50+ - name : Upload helm release values file /tmp/opencrvs-${{ inputs.environment }}.json
51+ uses : actions/upload-artifact@v4
52+ with :
53+ name : opencrvs-${{ inputs.environment }}-values-file
54+ path : /tmp/opencrvs-${{ inputs.environment }}.json
55+ retention-days : 1
56+ reset :
57+ name : ${{ matrix.job-name }}
58+ needs : prepare
59+ env :
60+ namespace : opencrvs-${{ inputs.environment }}
61+ runs-on : [self-hosted, k8s, e2e]
62+ strategy :
63+ max-parallel : 1 # Ensure jobs run one by one
64+ fail-fast : true # Stop on first failure
65+ matrix :
66+ job-name :
67+ - data-cleanup
68+ - postgres-on-update-core
69+ - postgres-data-migration
70+ - postgres-on-update-analytics
71+ - data-migration
72+ - data-seed
73+ - elasticsearch-reindex
74+ steps :
75+ - name : Download helm release values file into /tmp/opencrvs-${{ inputs.environment }}.json
76+ uses : actions/download-artifact@v4
77+ with :
78+ name : opencrvs-${{ inputs.environment }}-values-file
79+ path : /tmp
80+ - name : Create job ${{ matrix.job-name }} from helm template and apply it
81+ run : |
82+ kubectl delete job -n ${namespace} --ignore-not-found=true ${{ matrix.job-name }}
83+ helm template -f ${{ needs.prepare.outputs.values-file }} \
84+ --set data_cleanup.enabled=true \
85+ --set data_seed.enabled=true \
86+ --namespace ${namespace} \
87+ -s templates/${{ matrix.job-name }}-job.yaml \
88+ oci://ghcr.io/opencrvs/opencrvs-services | kubectl apply -n ${namespace} --wait=true -f -
89+ - name : Checking ${{ matrix.job-name }} job status
90+ run : |
91+ while true; do
92+ kubectl wait --for=condition=ready pod -ljob-name=${{ matrix.job-name }} --timeout=300s -n ${namespace} && \
93+ kubectl logs job/${{ matrix.job-name }} --all-containers -f -n ${namespace} && \
94+ touch /tmp/logs_stramed-${namespace}-${{ matrix.job-name }}.txt || break;
95+ sleep 1; done &
96+ echo "---------------------- Waiting for job completion ----------------------"
97+ kubectl wait --for=condition=complete job/${{ matrix.job-name }} -n ${namespace} --timeout=600s; status=$? || true
98+ [ $status -ne 0 ] && kubectl get pods -n ${namespace} --show-labels && kubectl describe pod -ljob-name=${job_name} -n ${namespace};
99+ [ ! -f /tmp/logs_stramed-${namespace}-${{ matrix.job-name }}.txt ] && kubectl logs job/${{ matrix.job-name }} --all-containers -n ${namespace} || \
100+ rm -vf /tmp/logs_stramed-${namespace}-${{ matrix.job-name }}.txt
101+ kill %1 2>/dev/null && echo "Stopped log streaming" || true
102+ exit $status
0 commit comments