kremalicious/blog

View on GitHub
.github/workflows/ci.yml

Summary

Maintainability
Test Coverage
name: 'CI'

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - '**'

env:
  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
  PUBLIC_TYPEKIT_ID: ${{ secrets.GATSBY_TYPEKIT_ID }}
  PUBLIC_MAPBOX_ACCESS_TOKEN: ${{ secrets.GATSBY_MAPBOX_ACCESS_TOKEN }}
  PUBLIC_UMAMI_SCRIPT_URL: ${{ secrets.GATSBY_UMAMI_SCRIPT_URL }}
  PUBLIC_UMAMI_WEBSITE_ID: ${{ secrets.GATSBY_UMAMI_WEBSITE_ID }}
  PUBLIC_INFURA_ID: ${{ secrets.GATSBY_INFURA_ID }}
  PUBLIC_WALLETCONNECT_ID: ${{ secrets.GATSBY_WALLETCONNECT_ID }}
  PUBLIC_WEB3_API_URL: ${{ secrets.PUBLIC_WEB3_API_URL }}

jobs:
  lint:
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, macos-latest]
        node: ['20']
    runs-on: ${{ matrix.os }}
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node }}
          cache: 'npm'
      - run: npm ci
      - run: npm run lint

  typecheck:
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, macos-latest]
        node: ['20']
    runs-on: ${{ matrix.os }}
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node }}
          cache: 'npm'
      - run: npm ci
      - run: npm run prebuild
      - run: npm run typecheck

  test-unit:
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, macos-latest]
        node: ['20']
    runs-on: ${{ matrix.os }}
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node }}
          cache: 'npm'
      - run: npm ci
      - run: npm run test:unit
      - uses: actions/upload-artifact@v4
        if: matrix.os == 'ubuntu-latest' && matrix.node == '20'
        with:
          name: coverage-${{ matrix.os }}-${{ matrix.node }}
          path: coverage/

  test-e2e:
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest]
        node: ['20']
    runs-on: ${{ matrix.os }}
    timeout-minutes: 60
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node }}
          cache: 'npm'
      - run: npm ci
      - run: npx playwright install --with-deps
      - run: npm run test:e2e

  build:
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, macos-latest]
        node: ['20']
    runs-on: ${{ matrix.os }}
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node }}
          cache: 'npm'
      - name: Cache Astro build output
        uses: actions/cache@v4
        with:
          path: ${{ github.workspace }}/.astro
          key: ${{ matrix.os }}-${{ matrix.node }}-astro-build-${{ hashFiles('content/**/*.jpg', 'content/**/*.png') }}
          restore-keys: ${{ matrix.os }}-${{ matrix.node }}-astro-build-
      - run: npm ci
      - run: NODE_OPTIONS="--max-old-space-size=4096" npm run build
      - name: Zip artifact for deployment
        if: github.ref == 'refs/heads/main' && matrix.os == 'ubuntu-latest' && matrix.node == '20'
        run: zip dist.zip ./dist -r
      - uses: actions/upload-artifact@v4
        if: github.ref == 'refs/heads/main' && matrix.os == 'ubuntu-latest' && matrix.node == '20'
        with:
          name: dist-${{ matrix.os }}-${{ matrix.node }}
          path: dist.zip

  coverage:
    runs-on: ubuntu-latest
    needs: [test-unit]
    if: ${{ success() && github.actor != 'dependabot[bot]' }}
    steps:
      - uses: actions/checkout@v4
      - uses: actions/download-artifact@v4
        with:
          name: coverage-ubuntu-latest-20
      - uses: paambaati/codeclimate-action@v5.0.0
        env:
          CC_TEST_REPORTER_ID: ${{ secrets.CC_TEST_REPORTER_ID }}

  deploy:
    needs: [lint, typecheck, test-unit, test-e2e, build]
    if: success() && github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4
      - uses: actions/download-artifact@v4
        with:
          name: dist-ubuntu-latest-20
      - name: unzip artifact
        run: unzip dist.zip
      - name: Deploy to S3
        run: npm run deploy:s3
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          AWS_DEFAULT_REGION: ${{ secrets.AWS_DEFAULT_REGION }}