name: MT5 Helm GitOps Deploy on: push: branches: [ "main" ] tags: [ "*" ] workflow_dispatch: env: # Gleicher Registry-Prefix wie im boday_tf-Projekt REGISTRY: localhost:3005 # Host-Header für Traefik-Ingress des Web-UI (leer = kein Ingress, kein Health-Check per HTTP) INGRESS_HOST: mt5.local jobs: build-and-deploy: runs-on: ubuntu-latest container: catthehacker/ubuntu:act-latest steps: - name: Checkout Code uses: actions/checkout@v4 # HINWEIS: Terraform-Binary kommt wie bei boday_tf über das globale Runner-Volume (:ro) - name: Trust Local Nginx Certificate Inside Container run: | mkdir -p /usr/local/share/ca-certificates/ cp nginx_ssl/nginx.crt /usr/local/share/ca-certificates/nginx-sandbox.crt 2>/dev/null || echo "Nutze Workspace-Zertifikat" update-ca-certificates # Docker verlangt Image-Namen in Kleinbuchstaben – "MetaTrader5-Docker-Image" würde sonst scheitern - name: Compute Image Name run: | IMAGE="${REGISTRY}/$(echo '${{ github.repository }}' | tr '[:upper:]' '[:lower:]')" echo "IMAGE=${IMAGE}" >> "$GITHUB_ENV" echo "Image: ${IMAGE}" - name: Log in to Local Registry run: echo "${{ secrets.REGISTRY_TOKEN }}" | docker login ${REGISTRY} -u ${{ github.actor }} --password-stdin # Ein Build, zwei Tags (das Image ist ~4 GB – doppelt bauen kostet unnötig Zeit) - name: Build MT5 Image run: | docker build --platform linux/amd64 \ -t ${IMAGE}:${{ github.sha }} \ -t ${IMAGE}:latest \ . - name: Push MT5 Image run: | docker push ${IMAGE}:${{ github.sha }} docker push ${IMAGE}:latest - name: Prepare Kubernetes Access run: | echo "${{ secrets.KUBECONFIG_DATA }}" > ./kind_kubeconfig chmod 600 ./kind_kubeconfig # Erster Rollout kann bis 15 Min dauern (Wine + MT5 Installation nach /config) # init mit Retry, weil der DNS-Resolver sporadisch "server misbehaving" liefert - name: Terraform Deploy env: TF_VAR_vnc_password: ${{ secrets.MT5_VNC_PASSWORD }} run: | terraform --version for i in 1 2 3; do terraform init && break if [ "$i" = "3" ]; then echo "terraform init nach 3 Versuchen fehlgeschlagen"; exit 1; fi echo "init fehlgeschlagen, Versuch $i – neuer Anlauf in 10s" sleep 10 done terraform apply -auto-approve \ -var="image_repository=${IMAGE}" \ -var="app_version=${{ github.sha }}" \ -var="vnc_user=${{ secrets.MT5_VNC_USER || 'trader' }}" \ -var="ingress_host=${INGRESS_HOST}" # KasmVNC antwortet ohne Login mit 401 – daher mit Basic Auth prüfen und auf den Erststart warten - name: Verify App Health if: env.INGRESS_HOST != '' env: VNC_USER: ${{ secrets.MT5_VNC_USER || 'trader' }} VNC_PASS: ${{ secrets.MT5_VNC_PASSWORD }} run: | for i in $(seq 1 40); do CODE=$(curl -s -o /dev/null -w '%{http_code}' --connect-timeout 5 \ -u "${VNC_USER}:${VNC_PASS}" -H "Host: ${INGRESS_HOST}" \ http://local-k3s-platform:80/ || true) echo "Versuch ${i}: HTTP ${CODE}" if [ "${CODE}" = "200" ]; then echo "Erfolg: MetaTrader 5 Web-UI läuft via Helm im GitOps-Standard!" exit 0 fi sleep 15 done echo "MT5 Web-UI nach 10 Minuten nicht erreichbar" exit 1 - name: Cleanup Kubeconfig if: always() run: rm -f ./kind_kubeconfig