name: 🚀 Deploy on: push: branches: - main - dev pull_request: {} permissions: actions: write contents: read jobs: lint: name: ⬣ ESLint runs-on: ubuntu-latest steps: - name: 🛑 Cancel Previous Runs uses: styfle/cancel-workflow-action@0.11.0 - name: ⬇️ Checkout repo uses: actions/checkout@v3 - name: ⎔ Setup node uses: actions/setup-node@v3 with: node-version: 16 - name: 📥 Download deps uses: bahmutov/npm-install@v1 with: useLockFile: false - name: 🔬 Lint run: npm run lint typecheck: name: ʦ TypeScript runs-on: ubuntu-latest steps: - name: 🛑 Cancel Previous Runs uses: styfle/cancel-workflow-action@0.11.0 - name: ⬇️ Checkout repo uses: actions/checkout@v3 - name: ⎔ Setup node uses: actions/setup-node@v3 with: node-version: 16 - name: 📥 Download deps uses: bahmutov/npm-install@v1 with: useLockFile: false - name: 🔎 Type check run: npm run typecheck --if-present vitest: name: ⚡ Vitest runs-on: ubuntu-latest steps: - name: 🛑 Cancel Previous Runs uses: styfle/cancel-workflow-action@0.11.0 - name: ⬇️ Checkout repo uses: actions/checkout@v3 - name: ⎔ Setup node uses: actions/setup-node@v3 with: node-version: 16 - name: 📥 Download deps uses: bahmutov/npm-install@v1 with: useLockFile: false - name: ⚡ Run vitest run: npm run test -- --coverage cypress: name: ⚫️ Cypress runs-on: ubuntu-latest steps: - name: 🛑 Cancel Previous Runs uses: styfle/cancel-workflow-action@0.11.0 - name: ⬇️ Checkout repo uses: actions/checkout@v3 - name: 🏄 Copy test env vars run: cp .env.example .env - name: ⎔ Setup node uses: actions/setup-node@v3 with: node-version: 16 - name: 📥 Download deps uses: bahmutov/npm-install@v1 with: useLockFile: false - name: 🛠 Setup Database run: npx prisma migrate reset --force - name: ⚙️ Build run: npm run build - name: 🌳 Cypress run uses: cypress-io/github-action@v4 with: start: npm run start:mocks wait-on: "http://localhost:8811" env: PORT: "8811" build: name: 🐳 Build # only build/deploy main branch on pushes if: ${{ (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/dev') && github.event_name == 'push' }} runs-on: ubuntu-latest steps: - name: 🛑 Cancel Previous Runs uses: styfle/cancel-workflow-action@0.11.0 - name: ⬇️ Checkout repo uses: actions/checkout@v3 - name: 👀 Read app name uses: SebRollen/toml-action@v1.0.0 id: app_name with: file: "fly.toml" field: "app" - name: 🐳 Set up Docker Buildx uses: docker/setup-buildx-action@v2 # Setup cache - name: ⚡️ Cache Docker layers uses: actions/cache@v3 with: path: /tmp/.buildx-cache key: ${{ runner.os }}-buildx-${{ github.sha }} restore-keys: | ${{ runner.os }}-buildx- - name: 🔑 Fly Registry Auth uses: docker/login-action@v2 with: registry: registry.fly.io username: x password: ${{ secrets.FLY_API_TOKEN }} - name: 🐳 Docker build uses: docker/build-push-action@v3 with: context: . push: true tags: registry.fly.io/${{ steps.app_name.outputs.value }}:${{ github.ref_name }}-${{ github.sha }} build-args: | COMMIT_SHA=${{ github.sha }} cache-from: type=local,src=/tmp/.buildx-cache cache-to: type=local,mode=max,dest=/tmp/.buildx-cache-new # This ugly bit is necessary if you don't want your cache to grow forever # till it hits GitHub's limit of 5GB. # Temp fix # https://github.com/docker/build-push-action/issues/252 # https://github.com/moby/buildkit/issues/1896 - name: 🚚 Move cache run: | rm -rf /tmp/.buildx-cache mv /tmp/.buildx-cache-new /tmp/.buildx-cache deploy: name: 🚀 Deploy runs-on: ubuntu-latest needs: [lint, typecheck, vitest, cypress, build] # only build/deploy main branch on pushes if: ${{ (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/dev') && github.event_name == 'push' }} steps: - name: 🛑 Cancel Previous Runs uses: styfle/cancel-workflow-action@0.11.0 - name: ⬇️ Checkout repo uses: actions/checkout@v3 - name: 👀 Read app name uses: SebRollen/toml-action@v1.0.0 id: app_name with: file: "fly.toml" field: "app" - name: 🚀 Deploy Staging if: ${{ github.ref == 'refs/heads/dev' }} uses: superfly/flyctl-actions@1.3 with: args: "deploy --app ${{ steps.app_name.outputs.value }}-staging --image registry.fly.io/${{ steps.app_name.outputs.value }}:${{ github.ref_name }}-${{ github.sha }}" env: FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }} - name: 🚀 Deploy Production if: ${{ github.ref == 'refs/heads/main' }} uses: superfly/flyctl-actions@1.3 with: args: "deploy --image registry.fly.io/${{ steps.app_name.outputs.value }}:${{ github.ref_name }}-${{ github.sha }}" env: FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }}