name: CI on: push: branches: [main, develop] pull_request: branches: [main] concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true env: NODE_VERSION: "20" PNPM_VERSION: "9" jobs: lint: name: Lint runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Setup Node.js ${{ env.NODE_VERSION }} uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} cache: "npm" - name: Install dependencies run: npm ci - name: Run linter run: npm run lint typecheck: name: Type Check runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Setup Node.js ${{ env.NODE_VERSION }} uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} cache: "npm" - name: Install dependencies run: npm ci - name: Build all packages run: npm run build test: name: Test Suite runs-on: ubuntu-latest services: postgres: image: postgres:16-alpine env: POSTGRES_DB: shieldai POSTGRES_USER: shieldai POSTGRES_PASSWORD: shieldai_dev ports: - 5432:5432 options: >- --health-cmd "pg_isready -U shieldai" --health-interval 5s --health-timeout 5s --health-retries 5 redis: image: redis:7-alpine ports: - 6379:6379 options: >- --health-cmd "redis-cli ping" --health-interval 5s --health-timeout 5s --health-retries 5 steps: - uses: actions/checkout@v4 - name: Setup Node.js ${{ env.NODE_VERSION }} uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} cache: "npm" - name: Install dependencies run: npm ci - name: Generate Prisma client run: npx prisma generate --schema=packages/db/prisma/schema.prisma env: DATABASE_URL: "postgresql://shieldai:shieldai_dev@localhost:5432/shieldai" - name: Run tests run: npm run test env: DATABASE_URL: "postgresql://shieldai:shieldai_dev@localhost:5432/shieldai" REDIS_URL: "redis://localhost:6379" docker-build: name: Docker Build runs-on: ubuntu-latest needs: [lint, typecheck] strategy: matrix: include: - name: api context: . dockerfile: packages/api/Dockerfile - name: darkwatch context: . dockerfile: services/darkwatch/Dockerfile - name: spamshield context: . dockerfile: services/spamshield/Dockerfile - name: voiceprint context: . dockerfile: services/voiceprint/Dockerfile steps: - uses: actions/checkout@v4 - name: Build Docker image uses: docker/build-push-action@v5 with: context: ${{ matrix.context }} file: ${{ matrix.dockerfile }} push: false tags: shieldai-${{ matrix.name }}:${{ github.sha }} cache-from: type=gha cache-to: type=gha,mode=max