From c2d901c2457474d5a1d081cd628cb8b6463775a1 Mon Sep 17 00:00:00 2001 From: Alex Yang Date: Mon, 21 Aug 2023 18:36:39 -0500 Subject: [PATCH] ci: do not build core in e2e test (#3882) (cherry picked from commit bf00299bc707f95053790f623f58dd977b6361ad) --- .github/actions/setup-node/action.yml | 4 + .github/workflows/build.yml | 116 ---------------- .github/workflows/release.yml | 146 ++++++++++++++++++++ apps/core/package.json | 3 +- apps/core/server.mts | 18 --- packages/cli/src/bin/dev-core.ts | 45 ++++-- tests/affine-local/e2e/quick-search.spec.ts | 51 ++++--- yarn.lock | 1 - 8 files changed, 219 insertions(+), 165 deletions(-) delete mode 100644 apps/core/server.mts diff --git a/.github/actions/setup-node/action.yml b/.github/actions/setup-node/action.yml index 6baa856ce1..2d9c6123fa 100644 --- a/.github/actions/setup-node/action.yml +++ b/.github/actions/setup-node/action.yml @@ -121,3 +121,7 @@ runs: - name: Build Infra shell: bash run: yarn run build:infra + + - name: Build Plugins + shell: bash + run: yarn run build:plugins diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 16204f27b5..cebc9b6068 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -134,26 +134,6 @@ jobs: path: ./apps/storybook/storybook-static if-no-files-found: error - build-core: - name: Build @affine/core - runs-on: ubuntu-latest - environment: development - - steps: - - uses: actions/checkout@v3 - - name: Setup Node.js - uses: ./.github/actions/setup-node - - name: Build Plugins - run: yarn run build:plugins - - name: Build Core - run: yarn nx build @affine/core - - name: Upload core artifact - uses: actions/upload-artifact@v3 - with: - name: core - path: ./apps/core/dist - if-no-files-found: error - build-storage: name: Build Storage runs-on: ubuntu-latest @@ -240,7 +220,6 @@ jobs: name: E2E Plugin Test runs-on: ubuntu-latest environment: development - needs: build-core steps: - uses: actions/checkout@v3 - name: Setup Node.js @@ -248,11 +227,6 @@ jobs: with: playwright-install: true electron-install: false - - name: Download core artifact - uses: actions/download-artifact@v3 - with: - name: core - path: ./apps/core/dist - name: Run playwright tests run: yarn e2e --forbid-only working-directory: tests/affine-plugin @@ -329,8 +303,6 @@ jobs: matrix: shard: [1, 2, 3, 4, 5] environment: development - needs: build-core - steps: - uses: actions/checkout@v3 - name: Setup Node.js @@ -338,11 +310,6 @@ jobs: with: playwright-install: true electron-install: false - - name: Download core artifact - uses: actions/download-artifact@v3 - with: - name: core - path: ./apps/core/dist - name: Run playwright tests run: yarn e2e --forbid-only --shard=${{ matrix.shard }}/${{ strategy.job-total }} @@ -374,7 +341,6 @@ jobs: name: E2E Migration Test runs-on: ubuntu-latest environment: development - needs: build-core strategy: matrix: spec: @@ -388,12 +354,6 @@ jobs: playwright-install: true electron-install: false - - name: Download core artifact - uses: actions/download-artifact@v3 - with: - name: core - path: ./apps/core/dist - - name: Unzip run: yarn unzip working-directory: ./tests/affine-legacy/${{ matrix.spec.package }} @@ -432,79 +392,3 @@ jobs: flags: unittest name: affine fail_ci_if_error: false - - build-docker: - if: github.ref == 'refs/heads/master' - name: Build Docker - runs-on: ubuntu-latest - needs: - - build-server - - build-core - - build-storage - steps: - - uses: actions/checkout@v3 - - name: Download core artifact - uses: actions/download-artifact@v3 - with: - name: core - path: ./apps/core/dist - - name: Download server dist - uses: actions/download-artifact@v3 - with: - name: server-dist - path: ./apps/server/dist - - name: Download storage.node - uses: actions/download-artifact@v3 - with: - name: storage.node - path: ./apps/server - - name: Setup Git short hash - run: | - echo "GIT_SHORT_HASH=$(git rev-parse --short HEAD)" >> "$GITHUB_ENV" - - name: Login to GitHub Container Registry - uses: docker/login-action@v2 - with: - registry: ghcr.io - logout: false - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - name: Set up QEMU - uses: docker/setup-qemu-action@v2 - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 - - name: Build front Dockerfile - uses: docker/build-push-action@v4 - with: - context: . - push: true - pull: true - platforms: linux/amd64,linux/arm64 - provenance: true - file: .github/deployment/front/Dockerfile - tags: ghcr.io/toeverything/affine-front:${{ env.GIT_SHORT_HASH }},ghcr.io/toeverything/affine-front:latest - - # setup node without cache configuration - # Prisma cache is not compatible with docker build cache - - name: Setup Node.js - uses: actions/setup-node@v3 - with: - node-version-file: '.nvmrc' - registry-url: https://npm.pkg.github.com - scope: '@toeverything' - - - name: Install Node.js dependencies - run: yarn workspaces focus @affine/server --production - - - name: Generate Prisma client - run: yarn workspace @affine/server prisma generate - - - name: Build graphql Dockerfile - uses: docker/build-push-action@v4 - with: - context: . - push: true - pull: true - platforms: linux/amd64,linux/arm64 - provenance: true - file: .github/deployment/node/Dockerfile - tags: ghcr.io/toeverything/affine-graphql:${{ env.GIT_SHORT_HASH }},ghcr.io/toeverything/affine-graphql:latest diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e199358b96..1e8b3005cd 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -5,6 +5,13 @@ on: branches: - master +env: + BUILD_TYPE: stable + APP_NAME: affine + COVERAGE: false + DISTRIBUTION: browser + NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }} + jobs: release: name: Try publishing npm@latest release @@ -17,3 +24,142 @@ jobs: run: ./scripts/publish.sh env: NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + + build-core: + name: Build @affine/core + runs-on: ubuntu-latest + environment: development + + steps: + - uses: actions/checkout@v3 + - name: Setup Node.js + uses: ./.github/actions/setup-node + - name: Build Plugins + run: yarn run build:plugins + - name: Build Core + run: yarn nx build @affine/core + - name: Upload core artifact + uses: actions/upload-artifact@v3 + with: + name: core + path: ./apps/core/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-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/setup-rust + with: + target: 'x86_64-unknown-linux-gnu' + - name: Build Storage + run: yarn build:storage + - name: Upload storage.node + uses: actions/upload-artifact@v3 + with: + name: storage.node + path: ./packages/storage/storage.node + if-no-files-found: error + + build-docker: + if: github.ref == 'refs/heads/master' + name: Build Docker + runs-on: ubuntu-latest + needs: + - build-server + - build-core + - build-storage + steps: + - uses: actions/checkout@v3 + - name: Download core artifact + uses: actions/download-artifact@v3 + with: + name: core + path: ./apps/core/dist + - name: Download server dist + uses: actions/download-artifact@v3 + with: + name: server-dist + path: ./apps/server/dist + - name: Download storage.node + uses: actions/download-artifact@v3 + with: + name: storage.node + path: ./apps/server + - name: Setup Git short hash + run: | + echo "GIT_SHORT_HASH=$(git rev-parse --short HEAD)" >> "$GITHUB_ENV" + - name: Login to GitHub Container Registry + uses: docker/login-action@v2 + with: + registry: ghcr.io + logout: false + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + - name: Build front Dockerfile + uses: docker/build-push-action@v4 + with: + context: . + push: true + pull: true + platforms: linux/amd64,linux/arm64 + provenance: true + file: .github/deployment/front/Dockerfile + tags: ghcr.io/toeverything/affine-front:${{ env.GIT_SHORT_HASH }},ghcr.io/toeverything/affine-front:latest + + # setup node without cache configuration + # Prisma cache is not compatible with docker build cache + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version-file: '.nvmrc' + registry-url: https://npm.pkg.github.com + scope: '@toeverything' + + - name: Install Node.js dependencies + run: yarn workspaces focus @affine/server --production + + - name: Generate Prisma client + run: yarn workspace @affine/server prisma generate + + - name: Build graphql Dockerfile + uses: docker/build-push-action@v4 + with: + context: . + push: true + pull: true + platforms: linux/amd64,linux/arm64 + provenance: true + file: .github/deployment/node/Dockerfile + tags: ghcr.io/toeverything/affine-graphql:${{ env.GIT_SHORT_HASH }},ghcr.io/toeverything/affine-graphql:latest diff --git a/apps/core/package.json b/apps/core/package.json index dbcf521b1b..aea3fa8131 100644 --- a/apps/core/package.json +++ b/apps/core/package.json @@ -6,7 +6,7 @@ "scripts": { "build": "yarn -T run build-core", "dev": "yarn -T run dev-core", - "static-server": "ts-node-esm ./server.mts" + "static-server": "yarn -T run dev-core --static" }, "exports": { "./app": "./src/app.tsx", @@ -84,7 +84,6 @@ "swc-loader": "^0.2.3", "swc-plugin-coverage-instrument": "^0.0.20", "thread-loader": "^4.0.2", - "ts-node": "^10.9.1", "webpack": "^5.88.2", "webpack-cli": "^5.1.4", "webpack-dev-server": "^4.15.1", diff --git a/apps/core/server.mts b/apps/core/server.mts deleted file mode 100644 index 07a9eb279e..0000000000 --- a/apps/core/server.mts +++ /dev/null @@ -1,18 +0,0 @@ -// static server for web app -import express from 'express'; -const app = express(); - -const PORT = process.env.PORT || 8080; - -app.use('/', express.static('dist')); - -app.get('/*', (req, res) => { - if (req.url.startsWith('/plugins')) { - res.sendFile(req.url, { root: 'dist' }); - } - res.sendFile('index.html', { root: 'dist' }); -}); - -app.listen(PORT, () => { - console.log(`Server is running on port ${PORT}`); -}); diff --git a/packages/cli/src/bin/dev-core.ts b/packages/cli/src/bin/dev-core.ts index 29c2382610..5ee83dd07b 100644 --- a/packages/cli/src/bin/dev-core.ts +++ b/packages/cli/src/bin/dev-core.ts @@ -9,6 +9,41 @@ import { config } from 'dotenv'; import { type BuildFlags, projectRoot } from '../config/index.js'; import { watchI18N } from '../util/i18n.js'; +const cwd = path.resolve(projectRoot, 'apps', 'core'); + +const flags: BuildFlags = { + distribution: 'browser', + mode: 'development', + channel: 'canary', + coverage: false, + localBlockSuite: undefined, +}; + +if (process.argv.includes('--static')) { + await awaitChildProcess( + spawn( + 'node', + [ + '--loader', + 'ts-node/esm/transpile-only', + '../../node_modules/webpack/bin/webpack.js', + 'serve', + '--mode', + 'development', + '--env', + 'flags=' + Buffer.from(JSON.stringify(flags), 'utf-8').toString('hex'), + ].filter((v): v is string => !!v), + { + cwd, + stdio: 'inherit', + shell: true, + env: process.env, + } + ) + ); + process.exit(0); +} + const files = ['.env', '.env.local']; for (const file of files) { @@ -21,16 +56,6 @@ for (const file of files) { } } -const cwd = path.resolve(projectRoot, 'apps', 'core'); - -const flags: BuildFlags = { - distribution: 'browser', - mode: 'development', - channel: 'canary', - coverage: false, - localBlockSuite: undefined, -}; - const buildFlags = await p.group( { distribution: () => diff --git a/tests/affine-local/e2e/quick-search.spec.ts b/tests/affine-local/e2e/quick-search.spec.ts index e5a0df6f29..0548bef0bb 100644 --- a/tests/affine-local/e2e/quick-search.spec.ts +++ b/tests/affine-local/e2e/quick-search.spec.ts @@ -1,7 +1,11 @@ import { test } from '@affine-test/kit/playwright'; import { withCtrlOrMeta } from '@affine-test/kit/utils/keyboard'; import { openHomePage } from '@affine-test/kit/utils/load-page'; -import { newPage, waitEditorLoad } from '@affine-test/kit/utils/page-logic'; +import { + getBlockSuiteEditorTitle, + newPage, + waitEditorLoad, +} from '@affine-test/kit/utils/page-logic'; import { expect, type Page } from '@playwright/test'; const openQuickSearchByShortcut = async (page: Page) => @@ -184,40 +188,51 @@ test('Assert the recent browse pages are on the recent list', async ({ // create first page await newPage(page); await page.keyboard.insertText('sgtokidoki'); - await page.waitForTimeout(300); + await page.waitForTimeout(200); // create second page await openQuickSearchByShortcut(page); const addNewPage = page.getByTestId('quick-search-add-new-page'); await addNewPage.click(); await page.keyboard.insertText('theliquidhorse'); - await page.waitForTimeout(300); + await page.waitForTimeout(200); // create thrid page await openQuickSearchByShortcut(page); await addNewPage.click(); await page.keyboard.insertText('battlekot'); - await page.waitForTimeout(300); + await page.waitForTimeout(200); await openQuickSearchByShortcut(page); - // check does all 3 pages exists on recent page list - await expect(page.getByRole('button', { name: 'battlekot' })).toHaveCount(1); - await expect( - page.getByRole('button', { name: 'theliquidhorse' }) - ).toHaveCount(1); - await expect(page.getByRole('button', { name: 'sgtokidoki' })).toHaveCount(1); + await page.waitForTimeout(200); + { + // check does all 3 pages exists on recent page list + const quickSearchItems = page.locator('[cmdk-item]'); + expect(await quickSearchItems.nth(0).textContent()).toBe('battlekot'); + expect(await quickSearchItems.nth(1).textContent()).toBe('theliquidhorse'); + expect(await quickSearchItems.nth(2).textContent()).toBe('sgtokidoki'); + } - // create forth page, and check does the recent page list only contains 3 pages + // create forth page, and check does the recent page list only contains three pages await openHomePage(page); await page.waitForTimeout(1000); await openQuickSearchByShortcut(page); await addNewPage.click(); - await page.waitForTimeout(300); - await page.keyboard.insertText('affine is the best'); - await page.waitForTimeout(300); + await page.waitForTimeout(200); + { + const title = getBlockSuiteEditorTitle(page); + await title.type('affine is the best', { + delay: 50, + }); + } + await page.waitForTimeout(1000); await openQuickSearchByShortcut(page); - await expect( - page.getByRole('button', { name: 'affine is the best' }) - ).toHaveCount(1); - await expect(page.getByRole('button', { name: 'sgtokidoki' })).toHaveCount(0); + { + const quickSearchItems = page.locator('[cmdk-item]'); + expect(await quickSearchItems.nth(0).textContent()).toBe( + 'affine is the best' + ); + expect(await quickSearchItems.nth(1).textContent()).toBe('battlekot'); + expect(await quickSearchItems.nth(2).textContent()).toBe('theliquidhorse'); + } }); diff --git a/yarn.lock b/yarn.lock index cf1d93aaf9..0e495f5ae1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -281,7 +281,6 @@ __metadata: swc-plugin-coverage-instrument: ^0.0.20 swr: 2.2.1 thread-loader: ^4.0.2 - ts-node: ^10.9.1 webpack: ^5.88.2 webpack-cli: ^5.1.4 webpack-dev-server: ^4.15.1