name: Build & Deploy Game on: [push] env: REGISTRY: git.zb-server.de BASE_DOMAIN: zb-server.de jobs: build-and-deploy: runs-on: ubuntu-latest steps: # 1. Code holen - name: Checkout Code uses: actions/checkout@v3 # 2. Variablen vorbereiten - name: Prepare Environment Variables id: prep run: | USERNAME_LOWER=$(echo "${{ gitea.actor }}" | tr '[:upper:]' '[:lower:]') REPO_LOWER=$(echo "${{ gitea.repository }}" | cut -d'/' -f2 | tr '[:upper:]' '[:lower:]') OWNER_LOWER=$(echo "${{ gitea.repository_owner }}" | tr '[:upper:]' '[:lower:]') BRANCH_LOWER=$(echo "${{ gitea.ref_name }}" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9-]/-/g') TARGET_NS="${REPO_LOWER}-${BRANCH_LOWER}" APP_URL="${TARGET_NS}.${{ env.BASE_DOMAIN }}" FULL_IMAGE_PATH="${OWNER_LOWER}/${REPO_LOWER}" IMAGE_TAG="${{ env.REGISTRY }}/${FULL_IMAGE_PATH}:${{ gitea.sha }}" echo "TARGET_NS=$TARGET_NS" >> $GITHUB_ENV echo "APP_URL=$APP_URL" >> $GITHUB_ENV echo "IMAGE_FULL=$IMAGE_TAG" >> $GITHUB_ENV echo "Deploying to Namespace: $TARGET_NS URL: $APP_URL" # 3. Docker Image bauen (Kaniko) - name: Build and Push uses: aevea/action-kaniko@v0.12.0 with: registry: ${{ env.REGISTRY }} username: ${{ gitea.actor }} password: ${{ secrets.PACKAGE_TOKEN }} image: ${{ env.FULL_IMAGE_PATH }} # Achtung: Hier muss evtl. angepasst werden wie im Prep step berechnet tag: ${{ gitea.sha }} cache: true extra_args: --skip-tls-verify-pull # 4. Kubectl einrichten (Interner Trick) - name: Setup Kubectl run: | curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" chmod +x kubectl mv kubectl /usr/local/bin/ mkdir -p $HOME/.kube echo "${{ secrets.KUBE_CONFIG }}" > $HOME/.kube/config chmod 600 $HOME/.kube/config # Der "Internal Kubernetes Trick" sed -i 's|server: https://.*:6443|server: https://kubernetes.default.svc:443|g' $HOME/.kube/config # 5. Deploy - name: Deploy to Kubernetes run: | # Namespace erstellen kubectl create namespace ${{ env.TARGET_NS }} --dry-run=client -o yaml | kubectl apply -f - # Platzhalter in den YAML Dateien ersetzen # Wir nutzen sed, um die Variablen in die Dateien zu schreiben # 1. Ingress sed -i "s|\${APP_URL}|${{ env.APP_URL }}|g" k8s/ingress.yaml # 2. App Deployment (Image & Secrets) # Hinweis: Secrets sollten idealerweise in den Repo-Settings hinterlegt sein ADMIN_USER="${{ secrets.ADMIN_USER || 'lehrer' }}" ADMIN_PASS="${{ secrets.ADMIN_PASS || 'geheim123' }}" sed -i "s|\${IMAGE_NAME}|${{ env.IMAGE_FULL }}|g" k8s/app.yaml sed -i "s|\${ADMIN_USER}|$ADMIN_USER|g" k8s/app.yaml sed -i "s|\${ADMIN_PASS}|$ADMIN_PASS|g" k8s/app.yaml # Anwenden im richtigen Namespace echo "Applying Redis..." kubectl apply -f k8s/redis.yaml -n ${{ env.TARGET_NS }} echo "Applying App..." kubectl apply -f k8s/app.yaml -n ${{ env.TARGET_NS }} echo "Applying Ingress..." kubectl apply -f k8s/ingress.yaml -n ${{ env.TARGET_NS }} # Force Restart damit das neue Image gezogen wird kubectl rollout restart deployment/escape-game -n ${{ env.TARGET_NS }} # 6. Info - name: Summary run: echo "🚀 Deployed to https://${{ env.APP_URL }}"