Files
cannaiq/.gitea/workflows/deploy.yml
Kelly c6ab066d25 ci: Add Gitea Actions CI/CD pipeline
- ci.yml: Runs on all branches - typecheck backend, build all 3 frontends
- deploy.yml: Runs on master only after CI passes
  - Builds and pushes 4 Docker images to Gitea registry
  - Deploys to Kubernetes (scraper, scraper-worker, 3 frontends)

Required secrets:
- REGISTRY_USERNAME: Gitea username
- REGISTRY_PASSWORD: Gitea password/token
- KUBECONFIG: Base64-encoded kubeconfig

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-07 12:10:19 -07:00

144 lines
4.9 KiB
YAML

name: Deploy
on:
push:
branches: [master, main]
jobs:
# CI jobs run first in parallel
typecheck-backend:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install dependencies
working-directory: backend
run: npm ci
- name: TypeScript check
working-directory: backend
run: npx tsc --noEmit
continue-on-error: true # TODO: Remove once legacy errors fixed
build-cannaiq:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install & Build
working-directory: cannaiq
run: |
npm ci
npx tsc --noEmit
npm run build
build-findadispo:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install & Build
working-directory: findadispo/frontend
run: |
npm ci
npm run build
build-findagram:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install & Build
working-directory: findagram/frontend
run: |
npm ci
npm run build
# Deploy only after ALL CI jobs pass
deploy:
needs: [typecheck-backend, build-cannaiq, build-findadispo, build-findagram]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to Gitea Registry
uses: docker/login-action@v3
with:
registry: code.cannabrands.app
username: ${{ secrets.REGISTRY_USERNAME }}
password: ${{ secrets.REGISTRY_PASSWORD }}
# Build and push all 4 images
- name: Build and push Backend
uses: docker/build-push-action@v5
with:
context: ./backend
push: true
tags: |
code.cannabrands.app/creationshop/dispensary-scraper:latest
code.cannabrands.app/creationshop/dispensary-scraper:${{ github.sha }}
- name: Build and push CannaiQ
uses: docker/build-push-action@v5
with:
context: ./cannaiq
push: true
tags: |
code.cannabrands.app/creationshop/cannaiq-frontend:latest
code.cannabrands.app/creationshop/cannaiq-frontend:${{ github.sha }}
- name: Build and push FindADispo
uses: docker/build-push-action@v5
with:
context: ./findadispo/frontend
push: true
tags: |
code.cannabrands.app/creationshop/findadispo-frontend:latest
code.cannabrands.app/creationshop/findadispo-frontend:${{ github.sha }}
- name: Build and push Findagram
uses: docker/build-push-action@v5
with:
context: ./findagram/frontend
push: true
tags: |
code.cannabrands.app/creationshop/findagram-frontend:latest
code.cannabrands.app/creationshop/findagram-frontend:${{ github.sha }}
# Deploy to Kubernetes
- name: Set up kubectl
uses: azure/setup-kubectl@v3
- name: Configure kubeconfig
run: |
mkdir -p ~/.kube
echo "${{ secrets.KUBECONFIG }}" | base64 -d > ~/.kube/config
chmod 600 ~/.kube/config
- name: Deploy to Kubernetes
run: |
kubectl set image deployment/scraper scraper=code.cannabrands.app/creationshop/dispensary-scraper:${{ github.sha }} -n dispensary-scraper
kubectl set image deployment/scraper-worker scraper-worker=code.cannabrands.app/creationshop/dispensary-scraper:${{ github.sha }} -n dispensary-scraper
kubectl set image deployment/cannaiq-frontend cannaiq-frontend=code.cannabrands.app/creationshop/cannaiq-frontend:${{ github.sha }} -n dispensary-scraper
kubectl set image deployment/findadispo-frontend findadispo-frontend=code.cannabrands.app/creationshop/findadispo-frontend:${{ github.sha }} -n dispensary-scraper
kubectl set image deployment/findagram-frontend findagram-frontend=code.cannabrands.app/creationshop/findagram-frontend:${{ github.sha }} -n dispensary-scraper
- name: Wait for rollout
run: |
kubectl rollout status deployment/scraper -n dispensary-scraper --timeout=300s
kubectl rollout status deployment/scraper-worker -n dispensary-scraper --timeout=300s
kubectl rollout status deployment/cannaiq-frontend -n dispensary-scraper --timeout=120s
kubectl rollout status deployment/findadispo-frontend -n dispensary-scraper --timeout=120s
kubectl rollout status deployment/findagram-frontend -n dispensary-scraper --timeout=120s
echo "All deployments rolled out successfully"