when: branch: [main, high-performance] event: push matrix: SERVICE: - gateway - users - companies - job_seekers - customers - payments - employees - photographers - makeup_artists - tutors - developers - video_editors - graphic_designers - social_media_managers - fitness_trainers - catering_services - ugc_content_creators - cron steps: # Step 1: Detect if this service needs building - name: detect-changes image: alpine/git commands: - apk add --no-cache bash - | #!/bin/bash set -e # Get changed files from last commit CHANGED_FILES=$(git diff --name-only HEAD~1 HEAD || echo "") # Convert matrix SERVICE to path format SERVICE_PATH=$(echo "${SERVICE}" | tr '_' '-') # Check if shared crates changed (triggers all services) SHARED_CHANGED=false if echo "$CHANGED_FILES" | grep -q "^crates/"; then SHARED_CHANGED=true echo "⚠️ Shared crates changed - will build all services" fi # Check if this specific service changed SERVICE_CHANGED=false if echo "$CHANGED_FILES" | grep -q "^apps/${SERVICE_PATH}/"; then SERVICE_CHANGED=true echo "✅ Service ${SERVICE} has code changes" fi # Create marker file if [ "$SHARED_CHANGED" = "true" ] || [ "$SERVICE_CHANGED" = "true" ]; then echo "SHOULD_BUILD=true" > .build-${SERVICE} echo "🚀 Will build ${SERVICE}" else echo "SHOULD_BUILD=false" > .build-${SERVICE} echo "⏭️ Skipping ${SERVICE} - no changes detected" fi # Export for other steps cat .build-${SERVICE} >> ${CI_ENV} # Step 2: Build optimized Docker image (only if changed) - name: build image: woodpeckerci/plugin-docker-buildx:5.0.0 settings: registry: ghcr.io repo: ghcr.io/traceworks2023/nxtgauge-rust-${SERVICE} context: . dockerfile: Dockerfile.optimized build_args: - SERVICE_NAME=${SERVICE} tags: - ${CI_COMMIT_SHA} - latest - high-performance-latest logins: - registry: https://ghcr.io username: from_secret: GHCR_USERNAME password: from_secret: GHCR_TOKEN platforms: linux/amd64 when: - evaluate: 'env.SHOULD_BUILD == "true"' # Step 3: Deploy to Kubernetes (only if changed and on main/high-performance) - name: deploy image: bitnami/kubectl:latest secrets: [kube_config] commands: - | #!/bin/bash set -e # Check if we should deploy if [ "${SHOULD_BUILD}" != "true" ]; then echo "⏭️ Skipping deployment for ${SERVICE} - no changes" exit 0 fi # Setup kubeconfig mkdir -p ~/.kube echo "$KUBE_CONFIG" | base64 -d > ~/.kube/config chmod 600 ~/.kube/config # Convert service name to Kubernetes deployment name DEPLOYMENT_NAME=$(echo "${SERVICE}" | tr '_' '-') NAMESPACE="nxtgauge" echo "🚀 Deploying ${SERVICE} (deployment: nxtgauge-rust-${DEPLOYMENT_NAME})..." # Trigger rolling restart to pick up new image kubectl rollout restart deployment/nxtgauge-rust-${DEPLOYMENT_NAME} -n ${NAMESPACE} # Wait for rollout to complete (with timeout) echo "⏳ Waiting for rollout to complete..." kubectl rollout status deployment/nxtgauge-rust-${DEPLOYMENT_NAME} -n ${NAMESPACE} --timeout=300s echo "✅ ${SERVICE} deployed successfully!" # Show deployment status kubectl get deployment/nxtgauge-rust-${DEPLOYMENT_NAME} -n ${NAMESPACE} when: - evaluate: 'env.SHOULD_BUILD == "true"' - branch: [main, high-performance] # Step 4: Notify on success - name: notify-success image: alpine:latest commands: - echo "✅ Pipeline completed successfully for ${SERVICE}" when: - evaluate: 'env.SHOULD_BUILD == "true"' - status: success # Step 5: Notify on failure - name: notify-failure image: alpine:latest commands: - echo "❌ Pipeline failed for ${SERVICE}" - echo "Check logs for details" when: - evaluate: 'env.SHOULD_BUILD == "true"' - status: failure