name: Build & Test on: push: branches: - master - v[0-9]+.[0-9]+.x-staging - v[0-9]+.[0-9]+.x paths-ignore: - README.md - .github/** - '!.github/workflows/build.yml' - '!.github/actions/build-rust/action.yml' - '!.github/actions/setup-node/action.yml' pull_request: merge_group: branches: - master - v[0-9]+.[0-9]+.x-staging - v[0-9]+.[0-9]+.x paths-ignore: - README.md - .github/** - '!.github/workflows/build.yml' - '!.github/actions/build-rust/action.yml' - '!.github/actions/setup-node/action.yml' env: DEBUG: napi:* BUILD_TYPE: canary APP_NAME: affine AFFINE_ENV: dev COVERAGE: true DISTRIBUTION: browser MACOSX_DEPLOYMENT_TARGET: '10.13' NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }} jobs: lint: name: Lint runs-on: ubuntu-latest environment: development steps: - uses: actions/checkout@v3 - name: Setup Node.js uses: ./.github/actions/setup-node with: electron-install: false - name: Run i18n codegen run: yarn i18n-codegen gen - name: Run ESLint run: yarn lint:eslint --max-warnings=0 - name: Run Prettier # Set nmMode in `actions/setup-node` will modify the .yarnrc.yml run: | git checkout .yarnrc.yml yarn lint:prettier - name: Run circular run: yarn circular - name: Run Type Check run: yarn typecheck build-prototype: name: Build Prototype runs-on: ubuntu-latest environment: development steps: - uses: actions/checkout@v3 - name: Setup Node.js uses: ./.github/actions/setup-node with: electron-install: false - name: Build Prototype run: yarn nx build prototype - name: Upload prototype artifact uses: actions/upload-artifact@v3 with: name: prototype path: ./apps/prototype/dist if-no-files-found: error build-server: name: Build Server runs-on: ubuntu-latest environment: development steps: - uses: actions/checkout@v3 - name: Setup Node.js uses: ./.github/actions/setup-node with: electron-install: false - name: Build Server run: yarn nx build @affine/server - name: Upload server dist uses: actions/upload-artifact@v3 with: name: server-dist path: ./apps/server/dist if-no-files-found: error build-docs: name: Build Docs runs-on: ubuntu-latest environment: development steps: - uses: actions/checkout@v3 - name: Setup Node.js uses: ./.github/actions/setup-node with: electron-install: false - run: yarn nx build @affine/docs env: NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }} build-storage: name: Build Storage runs-on: ubuntu-latest env: RUSTFLAGS: '-C debuginfo=1' environment: development steps: - uses: actions/checkout@v3 - name: Setup Node.js uses: ./.github/actions/setup-node - name: Setup Rust uses: ./.github/actions/build-rust with: target: 'x86_64-unknown-linux-gnu' package: '@affine/storage' nx_token: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }} - name: Upload storage.node uses: actions/upload-artifact@v3 with: name: storage.node path: ./packages/storage/storage.node if-no-files-found: error server-test: name: Server Test runs-on: ubuntu-latest environment: development needs: build-storage services: postgres: image: postgres env: POSTGRES_PASSWORD: affine options: >- --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 ports: - 5432:5432 steps: - uses: actions/checkout@v3 - name: Setup Node.js uses: ./.github/actions/setup-node - name: Initialize database run: | psql -h localhost -U postgres -c "CREATE DATABASE affine;" psql -h localhost -U postgres -c "CREATE USER affine WITH PASSWORD 'affine';" psql -h localhost -U postgres -c "ALTER USER affine WITH SUPERUSER;" env: PGPASSWORD: affine - name: Generate prisma client run: | yarn exec prisma generate yarn exec prisma db push working-directory: apps/server env: DATABASE_URL: postgresql://affine:affine@localhost:5432/affine - name: Run init-db script run: yarn exec ts-node-esm ./scripts/init-db.ts working-directory: apps/server env: DATABASE_URL: postgresql://affine:affine@localhost:5432/affine - name: Download storage.node uses: actions/download-artifact@v3 with: name: storage.node path: ./apps/server - name: Run server tests run: yarn test:coverage working-directory: apps/server env: CARGO_TARGET_DIR: '${{ github.workspace }}/target' DATABASE_URL: postgresql://affine:affine@localhost:5432/affine - name: Upload server test coverage results uses: codecov/codecov-action@v3 with: token: ${{ secrets.CODECOV_TOKEN }} files: ./apps/server/.coverage/lcov.info flags: server-test name: affine fail_ci_if_error: false server-e2e-test: name: Server E2E Test runs-on: ubuntu-latest environment: development needs: build-storage services: postgres: image: postgres env: POSTGRES_PASSWORD: affine options: >- --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 ports: - 5432:5432 steps: - uses: actions/checkout@v3 - name: Setup Node.js uses: ./.github/actions/setup-node with: playwright-install: true - name: Initialize database run: | psql -h localhost -U postgres -c "CREATE DATABASE affine;" psql -h localhost -U postgres -c "CREATE USER affine WITH PASSWORD 'affine';" psql -h localhost -U postgres -c "ALTER USER affine WITH SUPERUSER;" env: PGPASSWORD: affine - name: Generate prisma client run: | yarn exec prisma generate yarn exec prisma db push working-directory: apps/server env: DATABASE_URL: postgresql://affine:affine@localhost:5432/affine - name: Run init-db script run: yarn exec ts-node-esm ./scripts/init-db.ts working-directory: apps/server env: DATABASE_URL: postgresql://affine:affine@localhost:5432/affine - name: Download storage.node uses: actions/download-artifact@v3 with: name: storage.node path: ./apps/server - name: Run playwright tests run: yarn e2e --forbid-only working-directory: tests/affine-cloud env: COVERAGE: true DATABASE_URL: postgresql://affine:affine@localhost:5432/affine - name: Collect code coverage report run: yarn exec nyc report -t .nyc_output --report-dir .coverage --reporter=lcov - name: Upload e2e test coverage results uses: codecov/codecov-action@v3 with: token: ${{ secrets.CODECOV_TOKEN }} files: ./.coverage/lcov.info flags: server-e2etest name: affine fail_ci_if_error: false - name: Upload test results if: ${{ failure() }} uses: actions/upload-artifact@v3 with: name: test-results-e2e-server path: ./tests/affine-cloud/test-results if-no-files-found: ignore e2e-plugin-test: name: E2E Plugin Test runs-on: ubuntu-latest environment: development steps: - uses: actions/checkout@v3 - name: Setup Node.js uses: ./.github/actions/setup-node with: playwright-install: true electron-install: false - name: Run playwright tests run: yarn e2e --forbid-only working-directory: tests/affine-plugin env: COVERAGE: true - name: Collect code coverage report run: yarn exec nyc report -t .nyc_output --report-dir .coverage --reporter=lcov - name: Upload e2e test coverage results uses: codecov/codecov-action@v3 with: token: ${{ secrets.CODECOV_TOKEN }} files: ./.coverage/lcov.info flags: e2e-plugin-test name: affine fail_ci_if_error: false - name: Upload test results if: ${{ failure() }} uses: actions/upload-artifact@v3 with: name: test-results-e2e-plugin path: ./test-results if-no-files-found: ignore e2e-prototype-test: name: E2E Prototype Test runs-on: ubuntu-latest environment: development needs: build-prototype steps: - uses: actions/checkout@v3 - name: Setup Node.js uses: ./.github/actions/setup-node with: playwright-install: true electron-install: false - name: Download prototype artifact uses: actions/download-artifact@v3 with: name: prototype path: ./apps/prototype/dist - name: Run playwright tests run: yarn e2e --forbid-only working-directory: tests/affine-prototype env: COVERAGE: true # - name: Collect code coverage report # run: yarn exec nyc report -t .nyc_output --report-dir .coverage --reporter=lcov # - name: Upload e2e test coverage results # uses: codecov/codecov-action@v3 # with: # token: ${{ secrets.CODECOV_TOKEN }} # files: ./.coverage/lcov.info # flags: e2etest-prototype # name: affine # fail_ci_if_error: false - name: Upload test results if: ${{ failure() }} uses: actions/upload-artifact@v3 with: name: test-results-e2e-prototype path: ./test-results if-no-files-found: ignore e2e-test: name: E2E Test runs-on: ubuntu-latest strategy: fail-fast: false matrix: shard: [1, 2, 3, 4, 5] environment: development steps: - uses: actions/checkout@v3 - name: Setup Node.js uses: ./.github/actions/setup-node with: playwright-install: true electron-install: false - name: Run playwright tests run: yarn e2e --forbid-only --shard=${{ matrix.shard }}/${{ strategy.job-total }} working-directory: tests/affine-local env: COVERAGE: true - name: Collect code coverage report run: yarn exec nyc report -t .nyc_output --report-dir .coverage --reporter=lcov - name: Upload e2e test coverage results uses: codecov/codecov-action@v3 with: token: ${{ secrets.CODECOV_TOKEN }} files: ./.coverage/lcov.info flags: e2etest name: affine fail_ci_if_error: false - name: Upload test results if: ${{ failure() }} uses: actions/upload-artifact@v3 with: name: test-results-e2e-${{ matrix.shard }} path: ./test-results if-no-files-found: ignore e2e-migration-test: name: E2E Migration Test runs-on: ubuntu-latest environment: development strategy: matrix: spec: - { package: 0.7.0-canary.18 } - { package: 0.8.0-canary.7 } steps: - uses: actions/checkout@v3 - name: Setup Node.js uses: ./.github/actions/setup-node with: playwright-install: true electron-install: false - name: Unzip run: yarn unzip working-directory: ./tests/affine-legacy/${{ matrix.spec.package }} - name: Run playwright tests run: yarn e2e --forbid-only working-directory: ./tests/affine-legacy/${{ matrix.spec.package }} - name: Upload test results if: ${{ failure() }} uses: actions/upload-artifact@v3 with: name: test-results-e2e-migration-${{ matrix.spec.package }} path: ./tests/affine-legacy/${{ matrix.spec.package }}/test-results if-no-files-found: ignore unit-test: name: Unit Test runs-on: ubuntu-latest environment: development steps: - uses: actions/checkout@v3 - name: Setup Node.js uses: ./.github/actions/setup-node with: electron-install: false - name: Unit Test run: yarn nx test:coverage @affine/monorepo - name: Upload unit test coverage results uses: codecov/codecov-action@v3 with: token: ${{ secrets.CODECOV_TOKEN }} files: ./.coverage/store/lcov.info flags: unittest name: affine fail_ci_if_error: false