From 7ca1439604bbe21dfbda7d6a131ad314362742ec Mon Sep 17 00:00:00 2001 From: fropa Date: Thu, 18 Jun 2026 13:22:49 +0400 Subject: [PATCH] Stage to main (#347) * add staging * set 1 replica only --------- Co-authored-by: beso tsiklauri --- .github/workflows/aks_deploy.yml | 12 ++-- .github/workflows/aks_stage_deploy.yml | 91 ++++++++++++++++++++++++++ kube/{ => prod}/deployment.yaml | 0 kube/{ => prod}/hpa.yaml | 0 kube/{ => prod}/httproute.yaml | 0 kube/{ => prod}/pdb.yaml | 0 kube/{ => prod}/service.yaml | 0 kube/stage/deployment.yaml | 59 +++++++++++++++++ kube/stage/httproute.yaml | 35 ++++++++++ kube/stage/service.yaml | 13 ++++ 10 files changed, 204 insertions(+), 6 deletions(-) create mode 100644 .github/workflows/aks_stage_deploy.yml rename kube/{ => prod}/deployment.yaml (100%) rename kube/{ => prod}/hpa.yaml (100%) rename kube/{ => prod}/httproute.yaml (100%) rename kube/{ => prod}/pdb.yaml (100%) rename kube/{ => prod}/service.yaml (100%) create mode 100644 kube/stage/deployment.yaml create mode 100644 kube/stage/httproute.yaml create mode 100644 kube/stage/service.yaml diff --git a/.github/workflows/aks_deploy.yml b/.github/workflows/aks_deploy.yml index 31f63f5..f7e0ed5 100644 --- a/.github/workflows/aks_deploy.yml +++ b/.github/workflows/aks_deploy.yml @@ -1,4 +1,4 @@ -name: AKS deployment - core-frontend-reader +name: AKS prod on: push: @@ -76,15 +76,15 @@ jobs: - name: Apply Service and HTTPRoute run: | - kubectl apply -f kube/service.yaml - kubectl apply -f kube/httproute.yaml - kubectl apply -f kube/pdb.yaml - kubectl apply -f kube/hpa.yaml + kubectl apply -f kube/prod/service.yaml + kubectl apply -f kube/prod/httproute.yaml + kubectl apply -f kube/prod/pdb.yaml + kubectl apply -f kube/prod/hpa.yaml - name: Deploy to AKS run: | export IMAGE="${{ steps.image.outputs.ref }}" - envsubst < kube/deployment.yaml | kubectl apply -f - + envsubst < kube/prod/deployment.yaml | kubectl apply -f - - name: Wait for rollout run: | diff --git a/.github/workflows/aks_stage_deploy.yml b/.github/workflows/aks_stage_deploy.yml new file mode 100644 index 0000000..6433be6 --- /dev/null +++ b/.github/workflows/aks_stage_deploy.yml @@ -0,0 +1,91 @@ +name: AKS stage + +on: + push: + branches: [stage] + schedule: + - cron: '0 4 * * *' + workflow_dispatch: + +env: + ACR_NAME: corecontainers + IMAGE_NAME: core-frontend-reader + RESOURCE_GROUP: core-frontend + AKS_CLUSTER_NAME: core-frontend-kubernetes-cluster + NAMESPACE: core-frontend-stage + DEPLOYMENT_NAME: core-frontend-reader + +jobs: + build-and-deploy: + runs-on: ubuntu-24.04-arm + environment: azure + permissions: + id-token: write + contents: read + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Azure Login + uses: azure/login@v2 + with: + client-id: ${{ secrets.AZURE_CLIENT_ID }} + tenant-id: ${{ secrets.AZURE_TENANT_ID }} + subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + + - name: Set image reference + id: image + run: | + TAG=$(echo ${{ github.sha }} | cut -c1-7) + echo "ref=${{ env.ACR_NAME }}.azurecr.io/aks-${{ env.IMAGE_NAME }}:$TAG" >> $GITHUB_OUTPUT + + - name: Docker ACR Login + run: az acr login --name ${{ env.ACR_NAME }} + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Docker build and push + run: | + docker buildx build \ + --platform linux/arm64 \ + --push \ + --build-arg GA_TRACKING_CODE=${{ secrets.GA_TRACKING_CODE }} \ + --build-arg NPM_TOKEN=${{ secrets.NPM_TOKEN }} \ + -t ${{ steps.image.outputs.ref }} . + + - name: Get AKS credentials + run: | + az aks get-credentials \ + --resource-group ${{ env.RESOURCE_GROUP }} \ + --name ${{ env.AKS_CLUSTER_NAME }} \ + --admin \ + --overwrite-existing + + - name: Sync secrets to AKS + env: + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + GA_TRACKING_CODE: ${{ secrets.GA_TRACKING_CODE }} + run: | + kubectl create secret generic core-frontend-reader-secrets \ + --namespace core-frontend-stage \ + --from-literal=NPM_TOKEN="${{ env.NPM_TOKEN }}" \ + --from-literal=GA_TRACKING_CODE="${{ secrets.GA_TRACKING_CODE }}" \ + --dry-run=client -o yaml | kubectl apply -f - + + - name: Apply Service and HTTPRoute + run: | + kubectl apply -f kube/stage/service.yaml + kubectl apply -f kube/stage/httproute.yaml + + - name: Deploy to AKS + run: | + export IMAGE="${{ steps.image.outputs.ref }}" + envsubst < kube/stage/deployment.yaml | kubectl apply -f - + + - name: Wait for rollout + run: | + kubectl rollout status deployment/${{ env.DEPLOYMENT_NAME }} \ + --namespace ${{ env.NAMESPACE }} \ + --timeout=300s diff --git a/kube/deployment.yaml b/kube/prod/deployment.yaml similarity index 100% rename from kube/deployment.yaml rename to kube/prod/deployment.yaml diff --git a/kube/hpa.yaml b/kube/prod/hpa.yaml similarity index 100% rename from kube/hpa.yaml rename to kube/prod/hpa.yaml diff --git a/kube/httproute.yaml b/kube/prod/httproute.yaml similarity index 100% rename from kube/httproute.yaml rename to kube/prod/httproute.yaml diff --git a/kube/pdb.yaml b/kube/prod/pdb.yaml similarity index 100% rename from kube/pdb.yaml rename to kube/prod/pdb.yaml diff --git a/kube/service.yaml b/kube/prod/service.yaml similarity index 100% rename from kube/service.yaml rename to kube/prod/service.yaml diff --git a/kube/stage/deployment.yaml b/kube/stage/deployment.yaml new file mode 100644 index 0000000..7bc5be2 --- /dev/null +++ b/kube/stage/deployment.yaml @@ -0,0 +1,59 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: core-frontend-reader + namespace: core-frontend-stage +spec: + replicas: 1 + selector: + matchLabels: + app: core-frontend-reader + template: + metadata: + labels: + app: core-frontend-reader + spec: + nodeSelector: + agentpool: userpool + containers: + - name: reader + image: ${IMAGE} + env: + - name: NODE_ENV + value: production + imagePullPolicy: IfNotPresent + envFrom: + - secretRef: + name: core-frontend-reader-secrets + ports: + - name: http + containerPort: 8080 + startupProbe: + httpGet: + path: /reader/healthz + port: http + failureThreshold: 30 + periodSeconds: 5 + readinessProbe: + httpGet: + path: /reader/healthz + port: http + initialDelaySeconds: 5 + periodSeconds: 10 + timeoutSeconds: 3 + failureThreshold: 3 + livenessProbe: + httpGet: + path: /reader/healthz + port: http + initialDelaySeconds: 15 + periodSeconds: 20 + timeoutSeconds: 5 + failureThreshold: 3 + resources: + requests: + cpu: 100m + memory: 256Mi + limits: + cpu: 1000m + memory: 1000Mi \ No newline at end of file diff --git a/kube/stage/httproute.yaml b/kube/stage/httproute.yaml new file mode 100644 index 0000000..3c6c21d --- /dev/null +++ b/kube/stage/httproute.yaml @@ -0,0 +1,35 @@ +apiVersion: gateway.networking.k8s.io/v1 +kind: HTTPRoute +metadata: + name: core-frontend-reader + namespace: core-frontend-stage +spec: + hostnames: + - stg.core.ac.uk + parentRefs: + - group: gateway.networking.k8s.io + kind: Gateway + name: public-gateway + namespace: gateway-system + rules: + - backendRefs: + - name: core-frontend-reader + port: 80 + matches: + - path: + type: PathPrefix + value: /reader + + - backendRefs: + - name: core-frontend-reader + port: 80 + filters: + - type: URLRewrite + urlRewrite: + path: + type: ReplacePrefixMatch + replacePrefixMatch: / + matches: + - path: + type: PathPrefix + value: /static/reader diff --git a/kube/stage/service.yaml b/kube/stage/service.yaml new file mode 100644 index 0000000..425bb14 --- /dev/null +++ b/kube/stage/service.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + name: core-frontend-reader + namespace: core-frontend-stage +spec: + type: ClusterIP + selector: + app: core-frontend-reader + ports: + - name: http + port: 80 + targetPort: http \ No newline at end of file