steps: # =========================================== # PR VALIDATION: Parallel type checks (PRs only) # =========================================== typecheck-backend: image: code.cannabrands.app/creationshop/node:20 commands: - cd backend - npm ci --prefer-offline - npx tsc --noEmit depends_on: [] when: event: pull_request typecheck-cannaiq: image: code.cannabrands.app/creationshop/node:20 commands: - cd cannaiq - npm ci --prefer-offline - npx tsc --noEmit depends_on: [] when: event: pull_request typecheck-findadispo: image: code.cannabrands.app/creationshop/node:20 commands: - cd findadispo/frontend - npm ci --prefer-offline - npx tsc --noEmit 2>/dev/null || true depends_on: [] when: event: pull_request typecheck-findagram: image: code.cannabrands.app/creationshop/node:20 commands: - cd findagram/frontend - npm ci --prefer-offline - npx tsc --noEmit 2>/dev/null || true depends_on: [] when: event: pull_request # =========================================== # AUTO-MERGE: Merge PR after all checks pass # =========================================== auto-merge: image: alpine:latest environment: GITEA_TOKEN: from_secret: gitea_token commands: - apk add --no-cache curl - | echo "Merging PR #${CI_COMMIT_PULL_REQUEST}..." curl -s -X POST \ -H "Authorization: token $GITEA_TOKEN" \ -H "Content-Type: application/json" \ -d '{"Do":"merge"}' \ "https://code.cannabrands.app/api/v1/repos/Creationshop/dispensary-scraper/pulls/${CI_COMMIT_PULL_REQUEST}/merge" depends_on: - typecheck-backend - typecheck-cannaiq - typecheck-findadispo - typecheck-findagram when: event: pull_request # =========================================== # MASTER DEPLOY: Parallel Docker builds # NOTE: cache_from/cache_to removed due to plugin bug splitting on commas # =========================================== docker-backend: image: plugins/docker settings: registry: code.cannabrands.app repo: code.cannabrands.app/creationshop/dispensary-scraper tags: - latest - sha-${CI_COMMIT_SHA:0:8} dockerfile: backend/Dockerfile context: backend username: from_secret: registry_username password: from_secret: registry_password build_args: - APP_BUILD_VERSION=sha-${CI_COMMIT_SHA:0:8} - APP_GIT_SHA=${CI_COMMIT_SHA} - APP_BUILD_TIME=${CI_PIPELINE_CREATED} - CONTAINER_IMAGE_TAG=sha-${CI_COMMIT_SHA:0:8} depends_on: [] when: branch: master event: push docker-cannaiq: image: plugins/docker settings: registry: code.cannabrands.app repo: code.cannabrands.app/creationshop/cannaiq-frontend tags: - latest - sha-${CI_COMMIT_SHA:0:8} dockerfile: cannaiq/Dockerfile context: cannaiq username: from_secret: registry_username password: from_secret: registry_password depends_on: [] when: branch: master event: push docker-findadispo: image: plugins/docker settings: registry: code.cannabrands.app repo: code.cannabrands.app/creationshop/findadispo-frontend tags: - latest - sha-${CI_COMMIT_SHA:0:8} dockerfile: findadispo/frontend/Dockerfile context: findadispo/frontend username: from_secret: registry_username password: from_secret: registry_password depends_on: [] when: branch: master event: push docker-findagram: image: plugins/docker settings: registry: code.cannabrands.app repo: code.cannabrands.app/creationshop/findagram-frontend tags: - latest - sha-${CI_COMMIT_SHA:0:8} dockerfile: findagram/frontend/Dockerfile context: findagram/frontend username: from_secret: registry_username password: from_secret: registry_password depends_on: [] when: branch: master event: push # =========================================== # STAGE 3: Deploy and Run Migrations # =========================================== deploy: image: bitnami/kubectl:latest environment: KUBECONFIG_CONTENT: from_secret: kubeconfig_data commands: - mkdir -p ~/.kube - echo "$KUBECONFIG_CONTENT" | tr -d '[:space:]' | base64 -d > ~/.kube/config - chmod 600 ~/.kube/config # Deploy backend first - kubectl set image deployment/scraper scraper=code.cannabrands.app/creationshop/dispensary-scraper:sha-${CI_COMMIT_SHA:0:8} -n dispensary-scraper - kubectl rollout status deployment/scraper -n dispensary-scraper --timeout=300s # Note: Migrations run automatically at startup via auto-migrate # Deploy remaining services # Resilience: ensure workers are scaled up if at 0 - REPLICAS=$(kubectl get deployment scraper-worker -n dispensary-scraper -o jsonpath='{.spec.replicas}'); if [ "$REPLICAS" = "0" ]; then echo "Scaling workers from 0 to 5"; kubectl scale deployment/scraper-worker --replicas=5 -n dispensary-scraper; fi - kubectl set image deployment/scraper-worker worker=code.cannabrands.app/creationshop/dispensary-scraper:sha-${CI_COMMIT_SHA:0:8} -n dispensary-scraper - kubectl set image deployment/cannaiq-frontend cannaiq-frontend=code.cannabrands.app/creationshop/cannaiq-frontend:sha-${CI_COMMIT_SHA:0:8} -n dispensary-scraper - kubectl set image deployment/findadispo-frontend findadispo-frontend=code.cannabrands.app/creationshop/findadispo-frontend:sha-${CI_COMMIT_SHA:0:8} -n dispensary-scraper - kubectl set image deployment/findagram-frontend findagram-frontend=code.cannabrands.app/creationshop/findagram-frontend:sha-${CI_COMMIT_SHA:0:8} -n dispensary-scraper - kubectl rollout status deployment/cannaiq-frontend -n dispensary-scraper --timeout=120s depends_on: - docker-backend - docker-cannaiq - docker-findadispo - docker-findagram when: branch: master event: push