diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml new file mode 100644 index 0000000..8af7944 --- /dev/null +++ b/.gitea/workflows/deploy.yml @@ -0,0 +1,121 @@ +name: CI and Deploy + +on: + push: + branches: [main] + workflow_dispatch: + inputs: + run_full_e2e: + description: 'Run full E2E tests after deploy' + type: boolean + default: false + run_coverage: + description: 'Run coverage tests' + type: boolean + default: false + +jobs: + ci-gate: + runs-on: ubuntu-latest + container: + image: mcr.microsoft.com/playwright:v1.51.1-jammy + options: -v /var/run/docker.sock:/var/run/docker.sock --ipc=host + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + + - name: Cache npm + uses: actions/cache@v4 + with: + path: ~/.npm + key: npm-${{ hashFiles('package-lock.json') }} + restore-keys: npm- + + - name: Install dependencies + run: npm ci + + - name: Generate Prisma client + run: npx prisma generate + + - name: Lint + run: npm run lint + + - name: Unit tests + run: | + if [ "${{ inputs.run_coverage }}" = "true" ]; then + npm run test:coverage + else + npm run test + fi + + - name: Smoke E2E tests + run: | + npx playwright install chromium + npm run test:e2e:smoke + + build-and-deploy: + needs: ci-gate + runs-on: ubuntu-latest + container: + options: -v /var/run/docker.sock:/var/run/docker.sock + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Build Docker image + run: | + docker build \ + --build-arg NEXT_PUBLIC_AMAP_API_KEY="${{ secrets.AMAP_API_KEY }}" \ + -t no-whatever:latest \ + -t no-whatever:${{ github.sha }} \ + . + + - name: Deploy + run: | + docker stop no-whatever || true + docker rm no-whatever || true + mkdir -p /data/no-whatever + chown 1001:1001 /data/no-whatever + docker run -d \ + --name no-whatever \ + --network nginx \ + -p 3721:3721 \ + -v /data/no-whatever:/app/data \ + -e DATABASE_URL=file:/app/data/prod.db \ + -e AMAP_API_KEY="${{ secrets.AMAP_API_KEY }}" \ + -e DEEPSEEK_API_KEY="${{ secrets.DEEPSEEK_API_KEY }}" \ + --restart unless-stopped \ + no-whatever:latest + + full-e2e: + needs: build-and-deploy + if: ${{ inputs.run_full_e2e }} + runs-on: ubuntu-latest + container: + image: mcr.microsoft.com/playwright:v1.51.1-jammy + options: --ipc=host + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + + - name: Install dependencies + run: npm ci + + - name: Full E2E tests + run: | + npx prisma generate + npx playwright install chromium + npm run test:e2e