Skip to content

Commit 45ce22a

Browse files
committed
feat: db_rollback workflow
1 parent 9e5b5c1 commit 45ce22a

File tree

3 files changed

+175
-0
lines changed

3 files changed

+175
-0
lines changed

.github/workflows/k8_db_rollback.yml

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
name: 'K8: Database Rollback'
2+
3+
on:
4+
workflow_call:
5+
inputs:
6+
num_migrations:
7+
description: 'Number of migrations to rollback'
8+
required: true
9+
default: 0
10+
type: number
11+
12+
# Special permissions required for OIDC authentication
13+
permissions:
14+
id-token: write
15+
contents: read
16+
actions: read
17+
18+
jobs:
19+
k8-db-rollback:
20+
name: 'K8: Database Rollback'
21+
runs-on: [self-hosted, "${{ github.ref_name }}"]
22+
environment: ${{ github.ref_name }}
23+
env:
24+
KUBELOGIN_VERSION: "v0.0.25"
25+
KUBERNETES_CLUSTER_REPO_NAME: "${{ vars.KUBERNETES_CLUSTER_REPO_NAME }}"
26+
KUBERNETES_CLUSTER_NAME: "${{ vars.KUBERNETES_CLUSTER_NAME }}"
27+
KUBERNETES_NAMESPACE: "${{ vars.KUBERNETES_NAMESPACE }}"
28+
KUBERNETES_MANIFEST_PATH: "${{ vars.KUBERNETES_MANIFEST_PATH }}"
29+
AZURE_RESOURCE_GROUP: "${{ vars.AZURE_RESOURCE_GROUP }}"
30+
AZURE_CONTAINER_REGISTRY: "${{ vars.AZURE_CONTAINER_REGISTRY }}"
31+
steps:
32+
- name: Checkout
33+
uses: actions/checkout@v4
34+
35+
- name: GitHub Configuration
36+
run: git config --global url."https://oauth2:${{ secrets.GH_TOKEN }}@github.com".insteadOf https://github.com
37+
38+
- name: Clone cicd-deployment-scripts
39+
run: git clone https://github.com/code-kern-ai/cicd-deployment-scripts.git
40+
41+
- name: Azure Cloud Login
42+
uses: azure/login@v2
43+
with:
44+
client-id: ${{ secrets.AZURE_CLIENT_ID }}
45+
tenant-id: ${{ secrets.AZURE_TENANT_ID }}
46+
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
47+
48+
- name: Set up kubelogin for non-interactive login
49+
uses: azure/use-kubelogin@v1
50+
with:
51+
kubelogin-version: ${{ env.KUBELOGIN_VERSION }}
52+
53+
- uses: azure/aks-set-context@v3
54+
with:
55+
resource-group: ${{ env.AZURE_RESOURCE_GROUP }}
56+
cluster-name: ${{ env.KUBERNETES_CLUSTER_NAME }}
57+
admin: 'false'
58+
use-kubelogin: 'true'
59+
60+
- name: Generate K8 Rollback Job
61+
shell: bash
62+
run: |
63+
cp \
64+
cicd-deployment-scripts/k8s/assets/db_rollback.tmpl \
65+
apps/${{ github.event.repository.name }}/${{ github.ref_name }}/db_rollback.yaml
66+
source cicd-deployment-scripts/k8s/db_rollback.sh \
67+
-e ${{ github.ref_name }} \
68+
-d ${{ github.event.repository.name }} \
69+
-n ${{ env.KUBERNETES_NAMESPACE }} \
70+
-r ${{ env.AZURE_CONTAINER_REGISTRY }} \
71+
-t latest \
72+
-m ${{ inputs.num_migrations }}
73+
74+
generate_db_rollback_job
75+
76+
- name: Apply K8 Rollback Job
77+
shell: bash
78+
run: |
79+
source cicd-deployment-scripts/k8s/db_rollback.sh \
80+
-e ${{ github.ref_name }} \
81+
-d ${{ github.event.repository.name }} \
82+
-n ${{ env.KUBERNETES_NAMESPACE }} \
83+
-r ${{ env.AZURE_CONTAINER_REGISTRY }} \
84+
-t latest \
85+
-m ${{ inputs.num_migrations }}
86+
87+
apply_db_rollback_job
88+
89+
- name: Delete K8 Rollback Job
90+
shell: bash
91+
run: |
92+
source cicd-deployment-scripts/k8s/db_rollback.sh \
93+
-e ${{ github.ref_name }} \
94+
-d ${{ github.event.repository.name }} \
95+
-n ${{ env.KUBERNETES_NAMESPACE }} \
96+
-r ${{ env.AZURE_CONTAINER_REGISTRY }} \
97+
-t latest \
98+
-m ${{ inputs.num_migrations }}
99+
100+
delete_db_rollback_job

k8s/assets/db_rollback.tmpl

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
apiVersion: batch/v1
2+
kind: Job
3+
metadata:
4+
name: ${KUBERNETES_DEPLOYMENT_NAME}-downgrade-${num_migrations}
5+
namespace: ${KUBERNETES_NAMESPACE}
6+
spec:
7+
template:
8+
spec:
9+
containers:
10+
- name: ${KUBERNETES_DEPLOYMENT_NAME}
11+
image: ${KUBERNETES_POD_IMAGE}
12+
command:
13+
- alembic
14+
- downgrade
15+
- -${num_migrations}
16+
resources:
17+
limits:
18+
cpu: "400m"
19+
memory: "256Mi"
20+
requests:
21+
cpu: "50m"
22+
memory: "64Mi"
23+
nodeSelector:
24+
nodepool/name: scale16gp
25+
restartPolicy: Never
26+
backoffLimit: 4

k8s/db_rollback.sh

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
# !/bin/bash
2+
set -e
3+
4+
ENVIRONMENT_NAME=""
5+
KUBERNETES_DEPLOYMENT_NAME=""
6+
KUBERNETES_NAMESPACE=""
7+
AZURE_CONTAINER_REGISTRY=""
8+
IMAGE_TAG=""
9+
num_migrations=""
10+
11+
while getopts e:d:r:t:n:m: flag
12+
do
13+
case "${flag}" in
14+
e) ENVIRONMENT_NAME=${OPTARG};;
15+
d) KUBERNETES_DEPLOYMENT_NAME=${OPTARG};;
16+
n) KUBERNETES_NAMESPACE=${OPTARG};;
17+
r) AZURE_CONTAINER_REGISTRY=${OPTARG};;
18+
t) IMAGE_TAG=${OPTARG};;
19+
m) num_migrations=${OPTARG};;
20+
esac
21+
done
22+
23+
kubectl config set-context --current --namespace=$KUBERNETES_NAMESPACE
24+
echo "Context set to namespace: \"$KUBERNETES_NAMESPACE\""
25+
26+
KUBERNETES_POD_IMAGE="${AZURE_CONTAINER_REGISTRY}/${KUBERNETES_DEPLOYMENT_NAME}:${IMAGE_TAG}"
27+
28+
function generate_db_rollback_job {
29+
echo "Generating DB Rollback job for ${KUBERNETES_DEPLOYMENT_NAME} in ${ENVIRONMENT_NAME}"
30+
sed -i.bak 's|${KUBERNETES_DEPLOYMENT_NAME}|'${KUBERNETES_DEPLOYMENT_NAME}'|g' apps/${KUBERNETES_DEPLOYMENT_NAME}/${ENVIRONMENT_NAME}/db_rollback.tmpl
31+
sed -i.bak 's|${KUBERNETES_POD_IMAGE}|'${KUBERNETES_POD_IMAGE}'|g' apps/${KUBERNETES_DEPLOYMENT_NAME}/${ENVIRONMENT_NAME}/db_rollback.tmpl
32+
sed -i.bak 's|${num_migrations}|'${num_migrations}'|g' apps/${KUBERNETES_DEPLOYMENT_NAME}/${ENVIRONMENT_NAME}/db_rollback.tmpl
33+
34+
mv apps/${KUBERNETES_DEPLOYMENT_NAME}/${ENVIRONMENT_NAME}/db_rollback.tmpl apps/${KUBERNETES_DEPLOYMENT_NAME}/${ENVIRONMENT_NAME}/db_rollback.yml
35+
echo "::notice::Generated DB Rollback job successfully"
36+
cat apps/${KUBERNETES_DEPLOYMENT_NAME}/${ENVIRONMENT_NAME}/db_rollback.yml
37+
}
38+
39+
function apply_db_rollback_job {
40+
echo "Applying DB Rollback job for ${KUBERNETES_DEPLOYMENT_NAME} in ${ENVIRONMENT_NAME}"
41+
kubectl apply --filename apps/${KUBERNETES_DEPLOYMENT_NAME}/${ENVIRONMENT_NAME}/db_rollback.yml
42+
echo "::notice::Applied DB Rollback job successfully"
43+
}
44+
45+
function delete_db_rollback_job {
46+
echo "Deleting DB Rollback job for ${KUBERNETES_DEPLOYMENT_NAME} in ${ENVIRONMENT_NAME}"
47+
kubectl delete --filename apps/${KUBERNETES_DEPLOYMENT_NAME}/${ENVIRONMENT_NAME}/db_rollback.yml
48+
echo "::notice::Deleted DB Rollback job successfully"
49+
}

0 commit comments

Comments
 (0)