From cb60dcf352c241d40525ce4d6a813b3e3c0d6223 Mon Sep 17 00:00:00 2001 From: Kelly Date: Thu, 11 Dec 2025 12:37:35 -0700 Subject: [PATCH] ci: Add root-level woodpecker config for CI detection --- .woodpecker.yml | 213 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 213 insertions(+) create mode 100644 .woodpecker.yml diff --git a/.woodpecker.yml b/.woodpecker.yml new file mode 100644 index 00000000..1038f3b2 --- /dev/null +++ b/.woodpecker.yml @@ -0,0 +1,213 @@ +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 + # =========================================== + docker-backend: + image: woodpeckerci/plugin-docker-buildx + settings: + registry: code.cannabrands.app + repo: code.cannabrands.app/creationshop/dispensary-scraper + tags: + - latest + - ${CI_COMMIT_SHA:0:8} + dockerfile: backend/Dockerfile + context: backend + username: + from_secret: registry_username + password: + from_secret: registry_password + platforms: linux/amd64 + provenance: false + build_args: + APP_BUILD_VERSION: ${CI_COMMIT_SHA:0:8} + APP_GIT_SHA: ${CI_COMMIT_SHA} + APP_BUILD_TIME: ${CI_PIPELINE_CREATED} + CONTAINER_IMAGE_TAG: ${CI_COMMIT_SHA:0:8} + depends_on: [] + when: + branch: master + event: push + + docker-cannaiq: + image: woodpeckerci/plugin-docker-buildx + settings: + registry: code.cannabrands.app + repo: code.cannabrands.app/creationshop/cannaiq-frontend + tags: + - latest + - ${CI_COMMIT_SHA:0:8} + dockerfile: cannaiq/Dockerfile + context: cannaiq + username: + from_secret: registry_username + password: + from_secret: registry_password + platforms: linux/amd64 + provenance: false + depends_on: [] + when: + branch: master + event: push + + docker-findadispo: + image: woodpeckerci/plugin-docker-buildx + settings: + registry: code.cannabrands.app + repo: code.cannabrands.app/creationshop/findadispo-frontend + tags: + - latest + - ${CI_COMMIT_SHA:0:8} + dockerfile: findadispo/frontend/Dockerfile + context: findadispo/frontend + username: + from_secret: registry_username + password: + from_secret: registry_password + platforms: linux/amd64 + provenance: false + depends_on: [] + when: + branch: master + event: push + + docker-findagram: + image: woodpeckerci/plugin-docker-buildx + settings: + registry: code.cannabrands.app + repo: code.cannabrands.app/creationshop/findagram-frontend + tags: + - latest + - ${CI_COMMIT_SHA:0:8} + dockerfile: findagram/frontend/Dockerfile + context: findagram/frontend + username: + from_secret: registry_username + password: + from_secret: registry_password + platforms: linux/amd64 + provenance: false + depends_on: [] + when: + branch: master + event: push + + # =========================================== + # STAGE 3: Run Database Migrations (before deploy) + # =========================================== + migrate: + image: code.cannabrands.app/creationshop/dispensary-scraper:${CI_COMMIT_SHA:0:8} + environment: + CANNAIQ_DB_HOST: + from_secret: db_host + CANNAIQ_DB_PORT: + from_secret: db_port + CANNAIQ_DB_NAME: + from_secret: db_name + CANNAIQ_DB_USER: + from_secret: db_user + CANNAIQ_DB_PASS: + from_secret: db_pass + commands: + - cd /app + - node dist/db/migrate.js + depends_on: + - docker-backend + when: + branch: master + event: push + + # =========================================== + # STAGE 4: Deploy (after 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 + - kubectl set image deployment/scraper scraper=code.cannabrands.app/creationshop/dispensary-scraper:${CI_COMMIT_SHA:0:8} -n dispensary-scraper + - kubectl set image deployment/scraper-worker worker=code.cannabrands.app/creationshop/dispensary-scraper:${CI_COMMIT_SHA:0:8} -n dispensary-scraper + - kubectl set image deployment/cannaiq-frontend cannaiq-frontend=code.cannabrands.app/creationshop/cannaiq-frontend:${CI_COMMIT_SHA:0:8} -n dispensary-scraper + - kubectl set image deployment/findadispo-frontend findadispo-frontend=code.cannabrands.app/creationshop/findadispo-frontend:${CI_COMMIT_SHA:0:8} -n dispensary-scraper + - kubectl set image deployment/findagram-frontend findagram-frontend=code.cannabrands.app/creationshop/findagram-frontend:${CI_COMMIT_SHA:0:8} -n dispensary-scraper + - kubectl rollout status deployment/scraper -n dispensary-scraper --timeout=300s + - kubectl rollout status deployment/cannaiq-frontend -n dispensary-scraper --timeout=120s + depends_on: + - migrate + - docker-cannaiq + - docker-findadispo + - docker-findagram + when: + branch: master + event: push