@@ -21,20 +21,203 @@ concurrency:
2121 group : api-services-${{ github.workflow }}-${{ github.ref }}
2222 cancel-in-progress : true
2323
24+ permissions :
25+ contents : read
26+
27+ env :
28+ CSPROJ_PATH : api/net/TNO.API.csproj
29+ IMAGE_NAME : api
30+ OPENSHIFT_SERVER : https://api.silver.devops.gov.bc.ca:6443
31+ OPENSHIFT_TOOLS_NAMESPACE : 9b301c-tools
32+
2433jobs :
25- pipeline :
26- uses : ./.github/workflows/_reusable-dotnet-cicd.yml
27- with :
28- image_name : api
29- csproj_path : api/net/TNO.API.csproj
30- dockerfile : api/net/Dockerfile
31- component : api-services
32- deployment_name : api-services
33- kustomize_dev_path : openshift/kustomize/api-services/overlays/dev
34- kustomize_test_path : openshift/kustomize/api-services/overlays/test
35- dev_branch : folder-collection
36- rollout_timeout : ' 600s'
37- continue_on_error_verify : true
38- health_check_method : port_forward
39- secrets :
40- OPENSHIFT_TOKEN : ${{ secrets.OPENSHIFT_TOKEN }}
34+ ci :
35+ name : CI — Validate (.NET 9)
36+ runs-on : ubuntu-latest
37+ steps :
38+ - uses : actions/checkout@v4
39+
40+ - name : Setup .NET 9
41+ uses : actions/setup-dotnet@v5
42+ with :
43+ dotnet-version : 9.x
44+
45+ - name : Restore
46+ run : dotnet restore "${{ env.CSPROJ_PATH }}"
47+
48+ - name : Check vulnerable packages
49+ run : dotnet list "${{ env.CSPROJ_PATH }}" package --vulnerable --include-transitive
50+
51+ - name : Lint
52+ run : dotnet format "${{ env.CSPROJ_PATH }}" --verify-no-changes --verbosity diagnostic
53+
54+ - name : Build
55+ run : dotnet build "${{ env.CSPROJ_PATH }}" --configuration Release --no-restore
56+
57+ cd-dev :
58+ name : CD — Deploy to Dev
59+ runs-on : ubuntu-latest
60+ needs : ci
61+ if : (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && (github.ref == 'refs/heads/dev' || github.ref == 'refs/heads/folder-collection') && github.repository == 'bcgov/tno'
62+ environment : dev
63+ env :
64+ IMAGE_TAG : dev
65+ OPENSHIFT_NAMESPACE : 9b301c-dev
66+ KUSTOMIZE_PATH : openshift/kustomize/api-services/overlays/dev
67+ steps :
68+ - uses : actions/checkout@v4
69+
70+ - name : Build Docker Image
71+ run : |
72+ docker build \
73+ -f api/net/Dockerfile \
74+ -t ${{ env.IMAGE_NAME }}:${{ github.sha }} \
75+ .
76+
77+ - name : Login to OpenShift Image Registry
78+ run : |
79+ echo "${{ secrets.OPENSHIFT_TOKEN }}" | docker login \
80+ image-registry.apps.silver.devops.gov.bc.ca \
81+ -u serviceaccount \
82+ --password-stdin
83+
84+ - name : Push Image to OpenShift Registry
85+ run : |
86+ docker tag \
87+ ${{ env.IMAGE_NAME }}:${{ github.sha }} \
88+ image-registry.apps.silver.devops.gov.bc.ca/${{ env.OPENSHIFT_TOOLS_NAMESPACE }}/${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }}
89+ docker push \
90+ image-registry.apps.silver.devops.gov.bc.ca/${{ env.OPENSHIFT_TOOLS_NAMESPACE }}/${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }}
91+ docker tag \
92+ ${{ env.IMAGE_NAME }}:${{ github.sha }} \
93+ image-registry.apps.silver.devops.gov.bc.ca/${{ env.OPENSHIFT_TOOLS_NAMESPACE }}/${{ env.IMAGE_NAME }}:${{ github.sha }}
94+ docker push \
95+ image-registry.apps.silver.devops.gov.bc.ca/${{ env.OPENSHIFT_TOOLS_NAMESPACE }}/${{ env.IMAGE_NAME }}:${{ github.sha }}
96+
97+ - name : Install oc CLI
98+ uses : redhat-actions/openshift-tools-installer@v1
99+ with :
100+ oc : latest
101+
102+ - name : Login to OpenShift
103+ run : |
104+ oc login \
105+ --token=${{ secrets.OPENSHIFT_TOKEN }} \
106+ --server=${{ env.OPENSHIFT_SERVER }}
107+
108+ - name : Deploy via Kustomize
109+ run : oc apply -k ${{ env.KUSTOMIZE_PATH }} -n ${{ env.OPENSHIFT_NAMESPACE }}
110+
111+ - name : Rollout Restart
112+ run : |
113+ oc rollout restart deployment/api-services \
114+ -n ${{ env.OPENSHIFT_NAMESPACE }}
115+
116+ - name : Verify Deployment
117+ continue-on-error : true
118+ run : |
119+ oc rollout status deployment/api-services \
120+ -n ${{ env.OPENSHIFT_NAMESPACE }} \
121+ --timeout=600s
122+
123+ - name : Deployment Report
124+ if : always()
125+ run : |
126+ echo "--- pod status ---"
127+ oc get pods -l component=api-services -n ${{ env.OPENSHIFT_NAMESPACE }}
128+ echo "--- health check ---"
129+ POD=$(oc get pod -l component=api-services \
130+ -n ${{ env.OPENSHIFT_NAMESPACE }} \
131+ --sort-by=.metadata.creationTimestamp \
132+ -o jsonpath='{.items[-1].metadata.name}')
133+ oc port-forward $POD 8080:8080 -n ${{ env.OPENSHIFT_NAMESPACE }} &
134+ sleep 10
135+ curl -sf http://localhost:8080/health || true
136+ kill %1
137+ echo "--- recent logs ---"
138+ sleep 60
139+ oc logs $POD -n ${{ env.OPENSHIFT_NAMESPACE }} --tail=20 || true
140+
141+ cd-test :
142+ name : CD — Deploy to Test
143+ runs-on : ubuntu-latest
144+ needs : ci
145+ if : (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && github.ref == 'refs/heads/master' && github.repository == 'bcgov/tno'
146+ environment : test
147+ env :
148+ IMAGE_TAG : test
149+ OPENSHIFT_NAMESPACE : 9b301c-test
150+ KUSTOMIZE_PATH : openshift/kustomize/api-services/overlays/test
151+ steps :
152+ - uses : actions/checkout@v4
153+
154+ - name : Build Docker Image
155+ run : |
156+ docker build \
157+ -f api/net/Dockerfile \
158+ -t ${{ env.IMAGE_NAME }}:${{ github.sha }} \
159+ .
160+
161+ - name : Login to OpenShift Image Registry
162+ run : |
163+ echo "${{ secrets.OPENSHIFT_TOKEN }}" | docker login \
164+ image-registry.apps.silver.devops.gov.bc.ca \
165+ -u serviceaccount \
166+ --password-stdin
167+
168+ - name : Push Image to OpenShift Registry
169+ run : |
170+ docker tag \
171+ ${{ env.IMAGE_NAME }}:${{ github.sha }} \
172+ image-registry.apps.silver.devops.gov.bc.ca/${{ env.OPENSHIFT_TOOLS_NAMESPACE }}/${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }}
173+ docker push \
174+ image-registry.apps.silver.devops.gov.bc.ca/${{ env.OPENSHIFT_TOOLS_NAMESPACE }}/${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }}
175+ docker tag \
176+ ${{ env.IMAGE_NAME }}:${{ github.sha }} \
177+ image-registry.apps.silver.devops.gov.bc.ca/${{ env.OPENSHIFT_TOOLS_NAMESPACE }}/${{ env.IMAGE_NAME }}:${{ github.sha }}
178+ docker push \
179+ image-registry.apps.silver.devops.gov.bc.ca/${{ env.OPENSHIFT_TOOLS_NAMESPACE }}/${{ env.IMAGE_NAME }}:${{ github.sha }}
180+
181+ - name : Install oc CLI
182+ uses : redhat-actions/openshift-tools-installer@v1
183+ with :
184+ oc : latest
185+
186+ - name : Login to OpenShift
187+ run : |
188+ oc login \
189+ --token=${{ secrets.OPENSHIFT_TOKEN }} \
190+ --server=${{ env.OPENSHIFT_SERVER }}
191+
192+ - name : Deploy via Kustomize
193+ run : oc apply -k ${{ env.KUSTOMIZE_PATH }} -n ${{ env.OPENSHIFT_NAMESPACE }}
194+
195+ - name : Rollout Restart
196+ run : |
197+ oc rollout restart deployment/api-services \
198+ -n ${{ env.OPENSHIFT_NAMESPACE }}
199+
200+ - name : Verify Deployment
201+ continue-on-error : true
202+ run : |
203+ oc rollout status deployment/api-services \
204+ -n ${{ env.OPENSHIFT_NAMESPACE }} \
205+ --timeout=600s
206+
207+ - name : Deployment Report
208+ if : always()
209+ run : |
210+ echo "--- pod status ---"
211+ oc get pods -l component=api-services -n ${{ env.OPENSHIFT_NAMESPACE }}
212+ echo "--- health check ---"
213+ POD=$(oc get pod -l component=api-services \
214+ -n ${{ env.OPENSHIFT_NAMESPACE }} \
215+ --sort-by=.metadata.creationTimestamp \
216+ -o jsonpath='{.items[-1].metadata.name}')
217+ oc port-forward $POD 8080:8080 -n ${{ env.OPENSHIFT_NAMESPACE }} &
218+ sleep 10
219+ curl -sf http://localhost:8080/health || true
220+ kill %1
221+ echo "--- recent logs ---"
222+ sleep 60
223+ oc logs $POD -n ${{ env.OPENSHIFT_NAMESPACE }} --tail=20 || true
0 commit comments