Skip to content

Commit fc200b7

Browse files
authored
feat: purge Helm and restore modern OpenShift template for Java (#491)
1 parent 663e1a4 commit fc200b7

32 files changed

Lines changed: 906 additions & 1273 deletions

‎.github/workflows/.deploy.yml‎

Lines changed: 88 additions & 142 deletions
Original file line numberDiff line numberDiff line change
@@ -1,180 +1,126 @@
1-
name: .Deploys
1+
name: .Deploy
22

33
on:
44
workflow_call:
55
inputs:
6-
atomic:
7-
description: Atomic deployment? That means fail all or nothing
8-
default: false
9-
required: false
10-
type: boolean
11-
directory:
12-
description: Chart directory
13-
default: "charts/app"
14-
required: false
15-
type: string
166
environment:
17-
description: Environment name; omit for PRs
18-
required: false
7+
description: GitHub/OpenShift environment
8+
default: ""
199
type: string
20-
oc_server:
21-
default: https://api.silver.devops.gov.bc.ca:6443
22-
description: OpenShift server
23-
required: false
24-
type: string
25-
params:
26-
description: Extra parameters to pass to helm upgrade
27-
required: false
10+
target:
11+
description: Deployment target; usually PR number, test or prod
12+
default: ${{ github.event.number }}
2813
type: string
2914
tag:
30-
description: Specify a tag to deploy; defaults to PR number
31-
required: false
15+
description: Container tag
16+
default: ${{ github.event.number }}
3217
type: string
3318
triggers:
34-
description: Paths used to trigger a deployment; e.g. ('./backend/' './frontend/)
35-
required: false
36-
type: string
37-
db_user:
38-
description: The database user
39-
required: false
40-
default: "app"
19+
description: Triggers for deployment
20+
default: ""
4121
type: string
42-
debug:
43-
description: Debug mode
44-
default: false
45-
required: false
46-
type: boolean
47-
48-
### Usually a bad idea / not recommended
49-
timeout-minutes:
50-
description: "Timeout minutes"
51-
default: 30
52-
required: false
53-
type: number
54-
values:
55-
description: "Values file"
56-
default: "values.yaml"
57-
required: false
58-
type: string
59-
outputs:
60-
tag:
61-
description: "Which tag was used for deployment?"
62-
value: ${{ jobs.deploy.outputs.tag }}
63-
triggered:
64-
description: "Has a deployment has been triggered?"
65-
value: ${{ jobs.deploy.outputs.triggered }}
6622

6723
secrets:
24+
db_password:
25+
description: Database password (required except on pull_request)
26+
required: false
6827
oc_namespace:
6928
description: OpenShift namespace
7029
required: true
7130
oc_token:
7231
description: OpenShift token
7332
required: true
33+
outputs:
34+
triggered:
35+
description: Has deployment been triggered?
36+
value: ${{ jobs.init.outputs.triggered }}
7437

7538
permissions: {}
7639

7740
jobs:
78-
deploy:
79-
name: Stack
41+
init:
42+
name: Deploy (init)
8043
environment: ${{ inputs.environment }}
81-
runs-on: ubuntu-24.04
8244
outputs:
83-
tag: ${{ inputs.tag || steps.pr.outputs.pr }}
8445
triggered: ${{ steps.deploy.outputs.triggered }}
85-
timeout-minutes: ${{ inputs.timeout-minutes }}
46+
runs-on: ubuntu-24.04
8647
steps:
87-
- uses: bcgov/actions-openshift/crunchy@75454b2b33edf37135f6f167775c77a3414207f6 # v0.3.0
88-
name: Deploy Crunchy
89-
id: deploy_crunchy
90-
with:
91-
oc_namespace: ${{ secrets.oc_namespace }}
92-
oc_token: ${{ secrets.oc_token }}
93-
environment: ${{ inputs.environment }}
94-
values_file: charts/crunchy/values.yml
95-
triggers: ${{ inputs.triggers }}
96-
# Variables
97-
- if: inputs.tag == ''
98-
id: pr
99-
uses: bcgov/action-get-pr@3931962bf13b3f4702d0013ec7c836f752ff1a3b # v0.3.0
100-
101-
- id: vars
48+
- name: Database password
49+
id: db
50+
env:
51+
EVENT_NAME: ${{ github.event_name }}
52+
DB_PASSWORD: ${{ secrets.db_password }}
10253
run: |
103-
# Vars: tag and release
104-
105-
# Tag defaults to PR number, but can be overridden by inputs.tag
106-
tag=${{ inputs.tag || steps.pr.outputs.pr }}
107-
108-
# Release name includes run numbers to ensure uniqueness
109-
release=${{ github.event.repository.name }}-${{ inputs.environment || steps.pr.outputs.pr || inputs.tag }}
110-
111-
# version, to support helm packaging for non-pr based releases (workflow_dispatch). default to 1.0.0+github run number
112-
version=1.0.0+${{ github.run_number }}
113-
114-
# Summary
115-
echo "tag=${tag}"
116-
echo "release=${release}"
117-
echo "version=${version}"
118-
119-
# Output
120-
echo "tag=${tag}" >> $GITHUB_OUTPUT
121-
echo "release=${release}" >> $GITHUB_OUTPUT
122-
echo "version=${version}" >> $GITHUB_OUTPUT
123-
124-
- name: Stop pre-existing deployments on PRs (status = pending-upgrade)
125-
if: github.event_name == 'pull_request'
126-
uses: bcgov/actions-openshift/oc-runner@75454b2b33edf37135f6f167775c77a3414207f6 # v0.3.0
54+
if [ "${EVENT_NAME}" = "pull_request" ]; then
55+
password="$(openssl rand -hex 16)"
56+
if [ -z "${password}" ]; then
57+
echo "::error::openssl failed to generate a PR database password"
58+
exit 1
59+
fi
60+
else
61+
if [ -z "${DB_PASSWORD}" ]; then
62+
echo "::error::db_password GitHub secret is required for ${EVENT_NAME} deploys"
63+
exit 1
64+
fi
65+
password="${DB_PASSWORD}"
66+
fi
67+
echo "::add-mask::${password}"
68+
echo "password=${password}" >> "${GITHUB_OUTPUT}"
69+
- uses: bcgov/actions-openshift/deployer@75454b2b33edf37135f6f167775c77a3414207f6 # v0.3.0
70+
id: deploy
12771
with:
72+
file: common/openshift.init.yml
12873
oc_namespace: ${{ secrets.oc_namespace }}
129-
oc_token: ${{ secrets.oc_token }}
13074
oc_server: ${{ vars.oc_server }}
75+
oc_token: ${{ secrets.oc_token }}
76+
# Secret + NetworkPolicies: create if missing. Postgres ignores
77+
# POSTGRES_PASSWORD after first boot; restamping the Secret desyncs Flyway.
78+
# New NetworkPolicy names still apply; existing NP specs do not update.
79+
overwrite: false
80+
parameters: -p DB_PASSWORD="${{ steps.db.outputs.password }}"
81+
-p ZONE="${{ inputs.target }}"
82+
-p NAME="${{ github.event.repository.name }}"
13183
triggers: ${{ inputs.triggers }}
132-
commands: |
133-
# Interrupt any previous deployments (PR only)
134-
PREVIOUS=$(helm status ${{ steps.vars.outputs.release }} -o json | jq .info.status || true)
135-
if [[ ${PREVIOUS} =~ pending ]]; then
136-
echo "Rollback triggered"
137-
helm rollback ${{ steps.vars.outputs.release }} || \
138-
helm uninstall ${{ steps.vars.outputs.release }}
139-
fi
84+
debug: true
14085

141-
- uses: actions/checkout@v6
142-
- name: Debug Values File
143-
if: inputs.debug
144-
run: ls -l charts/crunchy/values.yml
145-
- name: Helm Deploy
86+
deploy:
87+
name: Deploy (${{ matrix.name }})
88+
environment: ${{ inputs.environment }}
89+
needs: [init]
90+
runs-on: ubuntu-24.04
91+
timeout-minutes: 15
92+
strategy:
93+
matrix:
94+
name: [database, backend-java, backend-py]
95+
include:
96+
- name: database
97+
file: common/openshift.database.yml
98+
overwrite: false
99+
parameters: -p DB_PVC_SIZE="256Mi"
100+
- name: backend-java
101+
file: backend-java/openshift.deploy.yml
102+
overwrite: true
103+
parameters: -p IMAGE_TAG="${{ inputs.tag }}"
104+
-p COMPONENT="backend-java"
105+
- name: backend-py
106+
file: backend-py/openshift.deploy.yml
107+
overwrite: true
108+
parameters: -p IMAGE_TAG="${{ inputs.tag }}"
109+
-p COMPONENT="backend-py"
110+
-p MIGRATIONS="migrations-py"
111+
outputs:
112+
triggered: ${{ steps.deploy.outputs.triggered }}
113+
steps:
114+
- uses: bcgov/actions-openshift/deployer@75454b2b33edf37135f6f167775c77a3414207f6 # v0.3.0
146115
id: deploy
147-
uses: bcgov/actions-openshift/oc-runner@75454b2b33edf37135f6f167775c77a3414207f6 # v0.3.0
148116
with:
117+
file: ${{ matrix.file }}
149118
oc_namespace: ${{ secrets.oc_namespace }}
150-
oc_token: ${{ secrets.oc_token }}
151119
oc_server: ${{ vars.oc_server }}
120+
oc_token: ${{ secrets.oc_token }}
121+
overwrite: ${{ matrix.overwrite }}
122+
debug: true
123+
parameters: -p ZONE="${{ inputs.target }}"
124+
-p NAME="${{ github.event.repository.name }}"
125+
${{ matrix.parameters }}
152126
triggers: ${{ inputs.triggers }}
153-
ref: ${{ github.ref }}
154-
commands: |
155-
# Deploy
156-
157-
# If directory provided, cd to it
158-
[ -z "${{ inputs.directory }}" ]|| cd ${{ inputs.directory }}
159-
160-
# Helm package
161-
sed -i 's/^name:.*/name: ${{ github.event.repository.name }}/' Chart.yaml
162-
helm package -u . --app-version="tag-${{ steps.vars.outputs.tag }}_run-${{ github.run_number }}" --version=${{ steps.pr.outputs.pr || steps.vars.outputs.version }}
163-
# print the values.yaml file to see the values being used
164-
# Helm upgrade/rollout
165-
helm upgrade \
166-
--set-string global.repository=${{ github.repository }} \
167-
--set-string global.tag="${{ steps.vars.outputs.tag }}" \
168-
--set-string global.config.databaseUser="${{ inputs.db_user }}" \
169-
--set-string global.databaseAlias="${{ steps.deploy_crunchy.outputs.release }}-crunchy" \
170-
${{ inputs.params }} \
171-
--install --wait ${{ inputs.atomic && '--atomic' || '' }} ${{ steps.vars.outputs.release }} \
172-
--timeout ${{ inputs.timeout-minutes }}m \
173-
--values ${{ inputs.values }} \
174-
./${{ github.event.repository.name }}-${{ steps.pr.outputs.pr || steps.vars.outputs.version }}.tgz
175-
176-
# Helm release history
177-
helm history ${{ steps.vars.outputs.release }}
178-
179-
# Completed pod cleanup
180-
oc delete po --field-selector=status.phase==Succeeded || true

‎.github/workflows/merge.yml‎

Lines changed: 21 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,16 @@ on:
1111
workflow_dispatch:
1212
inputs:
1313
tag:
14-
description: "Image tag set to deploy; e.g. PR number or prod"
14+
description: "Image tag to deploy; e.g. PR number or prod"
1515
type: string
1616
default: "prod"
1717

1818
concurrency:
1919
group: ${{ github.workflow }}
2020
cancel-in-progress: true
21+
2122
permissions: {}
23+
2224
jobs:
2325
vars:
2426
name: Set Variables
@@ -32,24 +34,27 @@ jobs:
3234
- name: PR Number
3335
id: pr
3436
uses: bcgov/action-get-pr@3931962bf13b3f4702d0013ec7c836f752ff1a3b # v0.3.0
37+
3538
deploy-test:
3639
name: Deploy (TEST)
3740
permissions:
3841
contents: read # Required for repository access
42+
needs: [vars]
3943
uses: ./.github/workflows/.deploy.yml
4044
secrets:
45+
db_password: ${{ secrets.db_password }}
4146
oc_namespace: ${{ secrets.OC_NAMESPACE }}
4247
oc_token: ${{ secrets.OC_TOKEN }}
4348
with:
4449
environment: test
45-
db_user: appproxy
46-
tag: ${{ inputs.tag }}
50+
target: test
51+
tag: ${{ inputs.tag || needs.vars.outputs.pr }}
4752

4853
integration-tests:
49-
needs: [deploy-test]
5054
name: Integration Tests for APIs
55+
needs: [deploy-test]
5156
permissions:
52-
contents: read # Required for checkout
57+
contents: read
5358
defaults:
5459
run:
5560
working-directory: integration-tests
@@ -59,33 +64,20 @@ jobs:
5964
name: [quarkus, fastapi]
6065
include:
6166
- name: quarkus
62-
baseUrl: https://quickstart-openshift-backends-test-backend-java.apps.silver.devops.gov.bc.ca
67+
baseUrl: https://${{ github.event.repository.name }}-test-backend-java.apps.silver.devops.gov.bc.ca
6368
- name: fastapi
64-
baseUrl: https://quickstart-openshift-backends-test-backend-py.apps.silver.devops.gov.bc.ca
69+
baseUrl: https://${{ github.event.repository.name }}-test-backend-py.apps.silver.devops.gov.bc.ca
6570
steps:
6671
- uses: actions/checkout@v6
67-
name: Checkout
68-
- name: Cache node modules
69-
id: cache-npm
70-
uses: actions/cache@v5
71-
env:
72-
cache-name: cache-node-modules
72+
- uses: actions/setup-node@v5
7373
with:
74-
# npm cache files are stored in `~/.npm` on Linux/macOS
75-
path: ~/.npm
76-
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }}
77-
restore-keys: |
78-
${{ runner.os }}-build-${{ env.cache-name }}-
79-
${{ runner.os }}-build-
80-
${{ runner.os }}-
81-
- if: ${{ steps.cache-npm.outputs.cache-hit != 'true' }}
82-
name: List the state of node modules
83-
continue-on-error: true
84-
run: npm list
74+
node-version: "22"
75+
cache: npm
76+
cache-dependency-path: integration-tests/package-lock.json
8577
- name: Install dependencies
8678
run: npm ci
8779
- name: Run integration tests
88-
run: BASE_URL=${{ matrix.baseUrl }} API_NAME=${{ matrix.name }} node src/main.js
80+
run: BASE_URL=${{ matrix.baseUrl }} API_NAME=${{ matrix.name }} node src/main.js
8981

9082
deploy-prod:
9183
name: Deploy (prod)
@@ -94,17 +86,13 @@ jobs:
9486
needs: [integration-tests, vars]
9587
uses: ./.github/workflows/.deploy.yml
9688
secrets:
89+
db_password: ${{ secrets.db_password }}
9790
oc_namespace: ${{ secrets.OC_NAMESPACE }}
9891
oc_token: ${{ secrets.OC_TOKEN }}
9992
with:
10093
environment: prod
101-
db_user: appproxy
102-
params: --set global.autoscaling=true
103-
--set backend-py.pdb.enabled=true
104-
--set backend-java.pdb.enabled=true
105-
--set backend-py.deploymentStrategy=RollingUpdate
106-
--set backend-java.deploymentStrategy=RollingUpdate
107-
tag: ${{ inputs.tag }}
94+
target: prod
95+
tag: ${{ inputs.tag || needs.vars.outputs.pr }}
10896

10997
promote:
11098
name: Promote Images
@@ -114,7 +102,7 @@ jobs:
114102
packages: write
115103
strategy:
116104
matrix:
117-
package: [backend-py, backend-java, migrations-py]
105+
package: [backend-java, backend-py, migrations-py]
118106
timeout-minutes: 1
119107
steps:
120108
- uses: shrink/actions-docker-registry-tag@e6aaef25c595b6e0edd18bf4c7dbfea3abd43299 # v5

0 commit comments

Comments
 (0)