Installing component 'all' with label 'develop' to AKS cluster #49
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Install components to Azure | |
run-name: Installing component '${{ github.event.inputs.component }}' with label '${{ github.event.inputs.label }}' to AKS cluster | |
on: | |
workflow_dispatch: | |
inputs: | |
component: | |
type: choice | |
description: Which component | |
required: true | |
options: | |
- frontend | |
- api | |
- api-mysql | |
- operator | |
- operator-stunner | |
- stunner | |
- mysql | |
- grafana | |
- all | |
label: | |
type: string | |
description: Image label to use | |
default: 'develop' | |
env: | |
REGISTRY: ghcr.io | |
NAMESPACE: austriandatalab | |
SUB_NAMESPACE: indiegamestream | |
jobs: | |
install: | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
with: | |
submodules: true | |
- name: Install Helm | |
uses: azure/[email protected] | |
with: | |
version: 'latest' | |
id: install1 | |
- name: Install kubectl | |
uses: azure/setup-kubectl@v3 | |
with: | |
version: 'latest' | |
id: install2 | |
- name: Login to Azure | |
run: az login --service-principal -u ${{ secrets.CLIENT_ID }} -p ${{ secrets.CLIENT_SECRET }} --tenant ${{ secrets.AZURERM_TENANT_ID }} | |
- name: Connect to tailscale | |
uses: tailscale/github-action@v2 | |
with: | |
oauth-client-id: ${{secrets.TAILSCALE_CLIENT_ID_2}} | |
oauth-secret: ${{secrets.TAILSCALE_CLIENT_SECRET_2}} | |
tags: tag:ci | |
- name: Configure kubernetes config | |
run: tailscale configure kubeconfig tailscale-operator | |
- name: Install Grafana | |
if: ${{ github.event.inputs.component == 'all' || contains(github.event.inputs.component, 'grafana') }} | |
run: | | |
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts | |
helm repo update | |
helm install prometheus prometheus-community/kube-prometheus-stack --create-namespace --namespace monitoring \ | |
--set grafana.service.type="LoadBalancer" --set grafana.service.loadBalancerClass="tailscale" \ | |
--set-json grafana.service.annotations='{"tailscale.com/hostname": "grafana"}' \ | |
--set-string grafana.adminPassword=${{ secrets.GRAFANA_ADMIN_PASSWORD }} | |
- name: Install MySQL | |
working-directory: ./helm/mysql | |
if: ${{ github.event.inputs.component == 'all' || contains(github.event.inputs.component, 'mysql') }} | |
run: | | |
helm repo add mysql-operator https://mysql.github.io/mysql-operator/ | |
helm repo update | |
helm install mysql-operator mysql-operator/mysql-operator --version "2.1.3" --wait \ | |
--create-namespace --namespace=mysql-operator | |
helm install mysql mysql-operator/mysql-innodbcluster --version "2.1.3" --wait \ | |
--create-namespace --namespace=mysql -f values.yaml \ | |
--set-string credentials.root.password=${{ secrets.MYSQL_ROOT_PASSWORD }} | |
- name: Install STUNner | |
working-directory: ./helm/stunner | |
if: ${{ github.event.inputs.component == 'all' || contains(github.event.inputs.component, 'stunner') }} | |
run: | | |
helm repo add stunner https://l7mp.io/stunner | |
helm repo update | |
helm dependency build . --skip-refresh | |
helm install stunner . --create-namespace --namespace=stunner | |
- name: Install game operator manifests | |
working-directory: ./operator | |
if: ${{ github.event.inputs.component == 'all' || contains(github.event.inputs.component, 'operator') }} | |
run: make install | |
- name: Deploy game operator | |
working-directory: ./operator | |
if: ${{ github.event.inputs.component == 'all' || contains(github.event.inputs.component, 'operator') }} | |
run: make deploy IMG=${{ env.REGISTRY }}/${{ env.NAMESPACE }}/${{ env.SUB_NAMESPACE }}/operator:${{ github.event.inputs.label }} | |
- name: Wait for MySQL to be ready | |
if: ${{ github.event.inputs.component == 'all' || contains(github.event.inputs.component, 'api') }} | |
run: | | |
while true; do | |
POD_STATUS=$(kubectl get pod mysql-0 -n mysql --no-headers -o custom-columns=":status.phase" 2>/dev/null); | |
if [ "$POD_STATUS" ]; then | |
echo "Pod mysql-0 has been created with status: $POD_STATUS"; | |
break; | |
else | |
echo "Waiting for pod mysql-0 to be created..."; | |
sleep 5; | |
fi | |
done | |
kubectl wait --for=condition=Ready pod/mysql-0 -n mysql --timeout=120s | |
while true; do | |
POD_STATUS=$(kubectl get pod -l app.kubernetes.io/component=router -n mysql --no-headers -o custom-columns=":status.phase" 2>/dev/null); \ | |
if [ "$POD_STATUS" ]; then | |
echo "MySQL router has been created with status: $POD_STATUS"; | |
break; | |
else | |
echo "Waiting for MySQL router to be created..."; | |
sleep 5; | |
fi | |
done | |
kubectl wait --for=condition=ready pod -l app.kubernetes.io/component=router -n mysql --timeout=120s | |
- name: Install API | |
working-directory: ./helm/api | |
if: ${{ github.event.inputs.component == 'all' || contains(github.event.inputs.component, 'api') }} | |
run: | | |
helm install -f values.yaml \ | |
--set-string env.mysqlRootPassword=${{ secrets.MYSQL_ROOT_PASSWORD }} \ | |
--set-string env.azureTenantId=${{ secrets.AZURERM_TENANT_ID }} \ | |
--set-string env.azureClientId=${{ secrets.CLIENT_ID }} \ | |
--set-string env.azureClientSecret=${{ secrets.CLIENT_SECRET }} \ | |
--set-string env.azureStorageAccount=${{ secrets.AZURERM_STORAGE_ACCOUNT_NAME }} \ | |
--set-string env.azureContainerName=${{ secrets.AZURERM_GAME_CONTAINER_NAME }} \ | |
--set-string env.azureAksClusterName=${{ secrets.AZURERM_AKS_CLUSTER_NAME }} \ | |
--set-string env.azurermSubscriptionId=${{ secrets.AZURERM_SUBSCRIPTION_ID }} \ | |
--set-string env.azurermResourceGroupName=${{ secrets.AZURERM_RESOURCE_GROUP_NAME }} \ | |
--set-string image.label=${{ github.event.inputs.label }} \ | |
api . | |
- name: Wait for external IP of API | |
if: ${{ github.event.inputs.component == 'all' || contains(github.event.inputs.component, 'frontend') }} | |
run: | | |
until [ -n "$(kubectl get svc api -n api -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')" ]; do | |
sleep 5 | |
done | |
- name: Install frontend | |
working-directory: ./helm/frontend | |
if: ${{ github.event.inputs.component == 'all' || contains(github.event.inputs.component, 'frontend') }} | |
run: | | |
helm install -f values.yaml \ | |
--set-string appConfig.apiUrl=http://$(kubectl get svc api -n api -o jsonpath='{.status.loadBalancer.ingress[0].hostname}'):$(kubectl get svc api -n api -o jsonpath='{.spec.ports[0].port}') \ | |
--set-string image.label=${{ github.event.inputs.label }} \ | |
frontend . | |
- name: Logout of Azure | |
if: always() | |
run: az logout |