Skip to content

Commit 4603064

Browse files
committed
feat(ci): db migrations
1 parent 60361b1 commit 4603064

File tree

6 files changed

+191
-39
lines changed

6 files changed

+191
-39
lines changed

.github/workflows/k8s_db_migrate.yml

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
name: 'K8: Database Migrate'
2+
3+
on:
4+
workflow_call:
5+
inputs:
6+
alembic_upgrade_rev:
7+
description: 'Rev of migration to migrate to'
8+
required: false
9+
default: 'head'
10+
type: string
11+
docker_image_tag:
12+
description: 'Docker Image Tag'
13+
required: false
14+
default: 'latest'
15+
type: string
16+
17+
# Special permissions required for OIDC authentication
18+
permissions:
19+
id-token: write
20+
contents: read
21+
actions: read
22+
23+
jobs:
24+
k8-db-migrate:
25+
name: 'K8: Database Migrate'
26+
runs-on: [self-hosted, "${{ github.ref_name }}"]
27+
environment: ${{ github.ref_name }}
28+
env:
29+
KUBELOGIN_VERSION: "v0.0.25"
30+
KUBERNETES_CLUSTER_REPO_NAME: "${{ vars.KUBERNETES_CLUSTER_REPO_NAME }}"
31+
KUBERNETES_CLUSTER_NAME: "${{ vars.KUBERNETES_CLUSTER_NAME }}"
32+
KUBERNETES_NAMESPACE: "${{ vars.KUBERNETES_NAMESPACE }}"
33+
KUBERNETES_MANIFEST_PATH: "${{ vars.KUBERNETES_MANIFEST_PATH }}"
34+
AZURE_RESOURCE_GROUP: "${{ vars.AZURE_RESOURCE_GROUP }}"
35+
AZURE_CONTAINER_REGISTRY: "${{ vars.AZURE_CONTAINER_REGISTRY }}"
36+
steps:
37+
- name: Checkout
38+
uses: actions/checkout@v4
39+
40+
- name: GitHub Configuration
41+
run: git config --global url."https://oauth2:${{ secrets.GH_TOKEN }}@github.com".insteadOf https://github.com
42+
43+
- name: Clone cicd-deployment-scripts
44+
run: git clone https://github.com/code-kern-ai/cicd-deployment-scripts.git
45+
46+
- name: Clone ${{ env.KUBERNETES_CLUSTER_REPO_NAME }}
47+
run: git clone https://github.com/code-kern-ai/${{ env.KUBERNETES_CLUSTER_REPO_NAME }}.git
48+
49+
- name: Azure Cloud Login
50+
uses: azure/login@v2
51+
with:
52+
client-id: ${{ secrets.AZURE_CLIENT_ID }}
53+
tenant-id: ${{ secrets.AZURE_TENANT_ID }}
54+
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
55+
56+
- name: Set up kubelogin for non-interactive login
57+
uses: azure/use-kubelogin@v1
58+
with:
59+
kubelogin-version: ${{ env.KUBELOGIN_VERSION }}
60+
61+
- uses: azure/aks-set-context@v3
62+
with:
63+
resource-group: ${{ env.AZURE_RESOURCE_GROUP }}
64+
cluster-name: ${{ env.KUBERNETES_CLUSTER_NAME }}
65+
admin: 'false'
66+
use-kubelogin: 'true'
67+
68+
- name: Apply Alembic Migrate
69+
shell: bash
70+
run: |
71+
bash cicd-deployment-scripts/k8s/db_migrate.sh \
72+
-e ${{ github.ref_name }} \
73+
-d ${{ github.event.repository.name }} \
74+
-p ${{ github.workspace }}/${{ env.KUBERNETES_CLUSTER_REPO_NAME }} \
75+
-n ${{ env.KUBERNETES_NAMESPACE }} \
76+
-r ${{ env.AZURE_CONTAINER_REGISTRY }} \
77+
-t ${{ inputs.docker_image_tag }} \
78+
-a ${{ inputs.alembic_upgrade_rev }}

.github/workflows/k8s_db_rollback.yml

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@ on:
88
required: false
99
default: 'base'
1010
type: string
11+
docker_image_tag:
12+
description: 'Docker Image Tag'
13+
required: false
14+
default: 'latest'
15+
type: string
1116

1217
# Special permissions required for OIDC authentication
1318
permissions:
@@ -37,6 +42,9 @@ jobs:
3742

3843
- name: Clone cicd-deployment-scripts
3944
run: git clone https://github.com/code-kern-ai/cicd-deployment-scripts.git
45+
46+
- name: Clone ${{ env.KUBERNETES_CLUSTER_REPO_NAME }}
47+
run: git clone https://github.com/code-kern-ai/${{ env.KUBERNETES_CLUSTER_REPO_NAME }}.git
4048

4149
- name: Azure Cloud Login
4250
uses: azure/login@v2
@@ -63,7 +71,8 @@ jobs:
6371
bash cicd-deployment-scripts/k8s/db_rollback.sh \
6472
-e ${{ github.ref_name }} \
6573
-d ${{ github.event.repository.name }} \
74+
-p ${{ github.workspace }}/${{ env.KUBERNETES_CLUSTER_REPO_NAME }} \
6675
-n ${{ env.KUBERNETES_NAMESPACE }} \
6776
-r ${{ env.AZURE_CONTAINER_REGISTRY }} \
68-
-t latest \
77+
-t ${{ inputs.docker_image_tag }} \
6978
-a ${{ inputs.alembic_downgrade_rev }}

.github/workflows/k8s_test.yml

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,21 @@ permissions:
1515
actions: read
1616

1717
jobs:
18-
call-az-acr-push:
18+
call-az-acr-push-test:
1919
uses: code-kern-ai/cicd-deployment-scripts/.github/workflows/az_acr_test.yml@dev
2020
secrets: inherit
2121

22+
call-k8-db-migrate:
23+
uses: code-kern-ai/cicd-deployment-scripts/.github/workflows/k8s_db_migrate.yml@dev
24+
needs: [call-az-acr-push-test]
25+
secrets: inherit
26+
with:
27+
docker_image_tag: ${{ needs.call-az-acr-push-test.outputs.GH_REF_NAME }}
28+
2229
k8-test:
2330
name: 'K8: Test'
2431
runs-on: [self-hosted, dev]
25-
needs: [call-az-acr-push]
32+
needs: [call-az-acr-push-test, call-k8-db-migrate]
2633
environment: dev
2734
env:
2835
KUBELOGIN_VERSION: "v0.0.25"
@@ -31,16 +38,10 @@ jobs:
3138
KUBERNETES_MANIFEST_PATH: "${{ vars.KUBERNETES_MANIFEST_PATH }}"
3239
AZURE_RESOURCE_GROUP: "${{ vars.AZURE_RESOURCE_GROUP }}"
3340
AZURE_CONTAINER_REGISTRY: "${{ vars.AZURE_CONTAINER_REGISTRY }}"
34-
outputs:
35-
GH_REF_NAME: ${{ steps.branch_name.outputs.GH_REF_NAME }}
3641
steps:
3742
# Checkout the repository to the GitHub Actions runner
3843
- name: Checkout
3944
uses: actions/checkout@v4
40-
41-
- name: Configure branch name
42-
id: branch_name
43-
run: echo "GH_REF_NAME=$(echo ${{ github.event.pull_request.head.ref }} | sed 's|/|-|g')" >> $GITHUB_OUTPUT
4445

4546
- name: GitHub Configuration
4647
run: git config --global url."https://oauth2:${{ secrets.GH_TOKEN }}@github.com".insteadOf https://github.com
@@ -75,6 +76,6 @@ jobs:
7576
bash cicd-deployment-scripts/k8s/test.sh \
7677
-n ${{ env.KUBERNETES_NAMESPACE }} \
7778
-d ${{ github.event.repository.name }} \
78-
-t test-${{ steps.branch_name.outputs.GH_REF_NAME }} \
79+
-t ${{ needs.call-az-acr-push-test.outputs.GH_REF_NAME }} \
7980
-r ${{ env.AZURE_CONTAINER_REGISTRY }} \
8081
-c "${{ inputs.test_cmd }}"

k8s/db_migrate.sh

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
# !/bin/bash
2+
set -e
3+
4+
ENVIRONMENT_NAME=""
5+
KUBERNETES_DEPLOYMENT_NAME=""
6+
KUBERNETES_DEPLOYMENT_REPO_PATH=""
7+
KUBERNETES_NAMESPACE=""
8+
AZURE_CONTAINER_REGISTRY=""
9+
IMAGE_TAG=""
10+
alembic_upgrade_rev=""
11+
12+
while getopts e:d:p:n:r:t:a: flag
13+
do
14+
case "${flag}" in
15+
e) ENVIRONMENT_NAME=${OPTARG};;
16+
d) KUBERNETES_DEPLOYMENT_NAME=${OPTARG};;
17+
p) KUBERNETES_DEPLOYMENT_REPO_PATH=${OPTARG};;
18+
n) KUBERNETES_NAMESPACE=${OPTARG};;
19+
r) AZURE_CONTAINER_REGISTRY=${OPTARG};;
20+
t) IMAGE_TAG=${OPTARG};;
21+
a) alembic_upgrade_rev=${OPTARG};;
22+
esac
23+
done
24+
25+
kubectl config set-context --current --namespace=$KUBERNETES_NAMESPACE
26+
echo "Context set to namespace: \"$KUBERNETES_NAMESPACE\""
27+
28+
echo "::group::Migrating to revision: $alembic_upgrade_rev"
29+
30+
sed 's|${ALEMBIC_COMMAND}|upgrade|g' \
31+
$KUBERNETES_DEPLOYMENT_REPO_PATH/infrastructure/$ENVIRONMENT_NAME/job/$KUBERNETES_DEPLOYMENT_NAME-migrate.tmpl \
32+
> $KUBERNETES_DEPLOYMENT_REPO_PATH/infrastructure/$ENVIRONMENT_NAME/job/$KUBERNETES_DEPLOYMENT_NAME-migrate.yml
33+
sed -i.bak 's|${ALEMBIC_ARGS}|'${alembic_upgrade_rev}'|g' $KUBERNETES_DEPLOYMENT_REPO_PATH/infrastructure/$ENVIRONMENT_NAME/job/$KUBERNETES_DEPLOYMENT_NAME-migrate.yml
34+
sed -i.bak 's|${IMAGE_TAG}|'${IMAGE_TAG}'|g' $KUBERNETES_DEPLOYMENT_REPO_PATH/infrastructure/$ENVIRONMENT_NAME/job/$KUBERNETES_DEPLOYMENT_NAME-migrate.yml
35+
36+
rm $KUBERNETES_DEPLOYMENT_REPO_PATH/infrastructure/$ENVIRONMENT_NAME/job/$KUBERNETES_DEPLOYMENT_NAME-migrate.yml.bak
37+
cat $KUBERNETES_DEPLOYMENT_REPO_PATH/infrastructure/$ENVIRONMENT_NAME/job/$KUBERNETES_DEPLOYMENT_NAME-migrate.yml
38+
echo "::endgroup::"
39+
40+
echo "::group::Apply Kubernetes Job"
41+
kubectl apply --filename $KUBERNETES_DEPLOYMENT_REPO_PATH/infrastructure/$ENVIRONMENT_NAME/job/$KUBERNETES_DEPLOYMENT_NAME-migrate.yml
42+
43+
echo "Waiting for migration job to complete ..."
44+
kubectl wait --for=condition=complete --timeout 60s job/$KUBERNETES_DEPLOYMENT_NAME-migrate
45+
echo "::endgroup::"
46+
47+
echo "::group::Rolling out deployment"
48+
kubectl rollout restart deployment/$KUBERNETES_DEPLOYMENT_NAME
49+
kubectl rollout status deployment/$KUBERNETES_DEPLOYMENT_NAME
50+
51+
kubectl rollout restart deployment/cognition-gateway
52+
kubectl rollout status deployment/cognition-gateway
53+
54+
kubectl delete job/$KUBERNETES_DEPLOYMENT_NAME-migrate
55+
echo "::endgroup::"

k8s/db_rollback.sh

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,18 @@ set -e
33

44
ENVIRONMENT_NAME=""
55
KUBERNETES_DEPLOYMENT_NAME=""
6+
KUBERNETES_DEPLOYMENT_REPO_PATH=""
67
KUBERNETES_NAMESPACE=""
78
AZURE_CONTAINER_REGISTRY=""
89
IMAGE_TAG=""
910
alembic_downgrade_rev=""
1011

11-
while getopts e:d:r:t:n:a: flag
12+
while getopts e:d:p:n:r:t:a: flag
1213
do
1314
case "${flag}" in
1415
e) ENVIRONMENT_NAME=${OPTARG};;
1516
d) KUBERNETES_DEPLOYMENT_NAME=${OPTARG};;
17+
p) KUBERNETES_DEPLOYMENT_REPO_PATH=${OPTARG};;
1618
n) KUBERNETES_NAMESPACE=${OPTARG};;
1719
r) AZURE_CONTAINER_REGISTRY=${OPTARG};;
1820
t) IMAGE_TAG=${OPTARG};;
@@ -23,6 +25,31 @@ done
2325
kubectl config set-context --current --namespace=$KUBERNETES_NAMESPACE
2426
echo "Context set to namespace: \"$KUBERNETES_NAMESPACE\""
2527

26-
echo "Rolling back to migration revision: $rev_rollback_migrations"
27-
kubectl exec -i deployment/${KUBERNETES_DEPLOYMENT_NAME} -c $KUBERNETES_DEPLOYMENT_NAME -- alembic downgrade ${rev_rollback_migrations}
28-
kubectl rollout status deployment/${KUBERNETES_DEPLOYMENT_NAME}
28+
echo "::group::Migrating to revision: $alembic_downgrade_rev"
29+
30+
sed 's|${ALEMBIC_COMMAND}|downgrade|g' \
31+
$KUBERNETES_DEPLOYMENT_REPO_PATH/infrastructure/$ENVIRONMENT_NAME/job/$KUBERNETES_DEPLOYMENT_NAME-migrate.tmpl \
32+
> $KUBERNETES_DEPLOYMENT_REPO_PATH/infrastructure/$ENVIRONMENT_NAME/job/$KUBERNETES_DEPLOYMENT_NAME-migrate.yml
33+
sed -i.bak 's|${ALEMBIC_ARGS}|'${alembic_downgrade_rev}'|g' $KUBERNETES_DEPLOYMENT_REPO_PATH/infrastructure/$ENVIRONMENT_NAME/job/$KUBERNETES_DEPLOYMENT_NAME-migrate.yml
34+
sed -i.bak 's|${IMAGE_TAG}|'${IMAGE_TAG}'|g' $KUBERNETES_DEPLOYMENT_REPO_PATH/infrastructure/$ENVIRONMENT_NAME/job/$KUBERNETES_DEPLOYMENT_NAME-migrate.yml
35+
36+
rm $KUBERNETES_DEPLOYMENT_REPO_PATH/infrastructure/$ENVIRONMENT_NAME/job/$KUBERNETES_DEPLOYMENT_NAME-migrate.yml.bak
37+
cat $KUBERNETES_DEPLOYMENT_REPO_PATH/infrastructure/$ENVIRONMENT_NAME/job/$KUBERNETES_DEPLOYMENT_NAME-migrate.yml
38+
echo "::endgroup::"
39+
40+
echo "::group::Apply Kubernetes Job"
41+
kubectl apply --filename $KUBERNETES_DEPLOYMENT_REPO_PATH/infrastructure/$ENVIRONMENT_NAME/job/$KUBERNETES_DEPLOYMENT_NAME-migrate.yml
42+
43+
echo "Waiting for migration job to complete ..."
44+
kubectl wait --for=condition=complete --timeout 60s job/$KUBERNETES_DEPLOYMENT_NAME-migrate
45+
echo "::endgroup::"
46+
47+
echo "::group::Rolling out deployment"
48+
kubectl rollout restart deployment/$KUBERNETES_DEPLOYMENT_NAME
49+
kubectl rollout status deployment/$KUBERNETES_DEPLOYMENT_NAME
50+
51+
kubectl rollout restart deployment/cognition-gateway
52+
kubectl rollout status deployment/cognition-gateway
53+
54+
kubectl delete job/$KUBERNETES_DEPLOYMENT_NAME-migrate
55+
echo "::endgroup::"

k8s/test.sh

Lines changed: 7 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,14 @@ do
1818
esac
1919
done
2020

21+
echo "::group::Kubernetes Context"
2122
kubectl config set-context --current --namespace=$KUBERNETES_NAMESPACE
2223
echo "Context set to namespace: \"$KUBERNETES_NAMESPACE\""
23-
24-
set +e
25-
alembic_exitcode=0
26-
ALEMBIC_CURRENT_REVISION=$(kubectl exec -i deployment/${KUBERNETES_DEPLOYMENT_NAME} -c $KUBERNETES_DEPLOYMENT_NAME -- alembic current 2> /dev/null)
27-
alembic_exitcode=$?
28-
set -e
24+
echo "::endgroup::"
2925

3026
echo "::notice::running test command: kubectl exec -i deployment/${KUBERNETES_DEPLOYMENT_NAME} -c $KUBERNETES_DEPLOYMENT_NAME -- '$TEST_CMD'"
3127

28+
echo "::group::Upgrade deployment image"
3229
KUBERNETES_POD_EXISTING_IMAGE=$(kubectl get pod --output json \
3330
--selector app=${KUBERNETES_DEPLOYMENT_NAME} \
3431
| jq -r '.items[0] | .spec.containers[0].image')
@@ -37,33 +34,18 @@ kubectl set image deployment/${KUBERNETES_DEPLOYMENT_NAME} ${KUBERNETES_DEPLOYME
3734
echo "::warning::using ${AZURE_CONTAINER_REGISTRY}/${KUBERNETES_DEPLOYMENT_NAME}:${TEST_IMAGE_TAG}"
3835

3936
kubectl rollout status deployment ${KUBERNETES_DEPLOYMENT_NAME}
37+
echo "::endgroup::"
4038

41-
if [ $alembic_exitcode -eq 0 ]; then
42-
kubectl exec -i deployment/${KUBERNETES_DEPLOYMENT_NAME} -c $KUBERNETES_DEPLOYMENT_NAME -- alembic upgrade head
43-
fi
44-
39+
echo "::group::Running test command"
4540
set +e
4641
exitcode=0
4742
echo "::warning::running test command: kubectl exec -i deployment/${KUBERNETES_DEPLOYMENT_NAME} -c $KUBERNETES_DEPLOYMENT_NAME -- '$TEST_CMD'"
48-
kubectl exec -i deployment/${KUBERNETES_DEPLOYMENT_NAME} -c $KUBERNETES_DEPLOYMENT_NAME -- "$TEST_CMD"
43+
kubectl exec -i deployment/${KUBERNETES_DEPLOYMENT_NAME} -c $KUBERNETES_DEPLOYMENT_NAME -- ''$TEST_CMD''
4944
exitcode=$?
5045
set -e
46+
echo "::endgroup::"
5147

5248
kubectl set image deployment/${KUBERNETES_DEPLOYMENT_NAME} ${KUBERNETES_DEPLOYMENT_NAME}=${KUBERNETES_POD_EXISTING_IMAGE}
5349
echo "::notice::using ${KUBERNETES_POD_EXISTING_IMAGE}"
5450

55-
if [ $alembic_exitcode -eq 0 ] && [ $exitcode -ne 0 ]; then
56-
ALEMBIC_HEAD=${ALEMBIC_CURRENT_REVISION:0:12}
57-
58-
ALEMBIC_UPDATED_REVISION=$(kubectl exec -i deployment/${KUBERNETES_DEPLOYMENT_NAME} -c $KUBERNETES_DEPLOYMENT_NAME -- alembic current)
59-
ALEMBIC_UPDATED_HEAD=${ALEMBIC_UPDATED_REVISION:0:12}
60-
61-
if [ $ALEMBIC_HEAD = $ALEMBIC_UPDATED_HEAD ]; then
62-
echo "::notice::skipping alembic downgrade"
63-
else
64-
echo "::notice::downgrading to alembic revision: $ALEMBIC_HEAD"
65-
kubectl exec -i deployment/${KUBERNETES_DEPLOYMENT_NAME} -c $KUBERNETES_DEPLOYMENT_NAME -- alembic downgrade $ALEMBIC_HEAD
66-
fi
67-
fi
68-
6951
exit $exitcode

0 commit comments

Comments
 (0)