diff --git a/.github/workflows/build-master.yml b/.github/workflows/build-master.yml new file mode 100644 index 0000000000..0c5eea47bd --- /dev/null +++ b/.github/workflows/build-master.yml @@ -0,0 +1,186 @@ +name: Build & Test + +on: + push: + branches: [master] + +jobs: + build-frontend: + name: Build frontend + runs-on: ubuntu-latest + environment: production + + steps: + - uses: actions/checkout@v3 + - name: Use Node.js LTS + uses: actions/setup-node@v3 + with: + node-version-file: '.nvmrc' + cache: 'yarn' + registry-url: https://npm.pkg.github.com + scope: '@toeverything' + - name: Get yarn cache directory path + id: yarn-cache-dir-path + run: echo "::set-output name=dir::$(yarn config get cacheFolder)" + - uses: actions/cache@v3 + id: yarn-cache + with: + path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-yarn- + + - run: node scripts/module-resolve/ci.cjs + + - run: yarn install + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_GITHUB_AUTH_TOKEN }} + + - name: Build + run: yarn build + env: + NEXT_PUBLIC_FIREBASE_API_KEY: ${{ secrets.NEXT_PUBLIC_FIREBASE_API_KEY }} + NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN: ${{ secrets.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN }} + NEXT_PUBLIC_FIREBASE_PROJECT_ID: ${{ secrets.NEXT_PUBLIC_FIREBASE_PROJECT_ID }} + NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET: ${{ secrets.NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET }} + NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID: ${{ secrets.NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID }} + NEXT_PUBLIC_FIREBASE_APP_ID: ${{ secrets.NEXT_PUBLIC_FIREBASE_APP_ID }} + NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID: ${{ secrets.NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID }} + + - name: Export + run: yarn export + + - name: Upload artifact + uses: actions/upload-artifact@v3 + with: + path: ./apps/web/out + + publish-frontend: + name: Push frontend image + runs-on: ubuntu-latest + needs: build-frontend + + permissions: + contents: read + packages: write + + env: + REGISTRY: ghcr.io + IMAGE_NAME: 'toeverything/affine-pathfinder' + IMAGE_TAG: canary-${{ github.sha }} + IMAGE_TAG_LATEST: nightly-latest + + steps: + - name: Check out the repo + uses: actions/checkout@v3 + + - name: Download artifact + uses: actions/download-artifact@v3 + with: + name: artifact + path: apps/web/out/ + + - name: Log in to Docker Hub + uses: docker/login-action@v2 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v4 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + tags: | + ${{ env.IMAGE_TAG }} + ${{ env.IMAGE_TAG_LATEST }} + + - name: Build Docker image + uses: docker/build-push-action@v3 + with: + context: . + push: true + file: ./.github/deployment/Dockerfile + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + + test-frontend: + name: Test Frontend + runs-on: ubuntu-latest + environment: development + needs: build-frontend + services: + octobase: + image: ghcr.io/toeverything/cloud:nightly-latest + ports: + - 3000:3000 + env: + SIGN_KEY: 'test123' + RUST_LOG: 'debug' + JWST_DEV: '1' + credentials: + username: ${{ github.actor }} + password: ${{ secrets.ACTIONS_PACKAGE_PUBLISH }} + + steps: + - uses: actions/checkout@v3 + - name: Use Node.js 18 + uses: actions/setup-node@v3 + with: + node-version: 18 + cache: 'yarn' + - name: Get yarn cache directory path + id: yarn-cache-dir-path + run: echo "::set-output name=dir::$(yarn config get cacheFolder)" + - uses: actions/cache@v3 + id: yarn-cache + with: + path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-yarn- + - run: yarn install + - name: Download artifact + uses: actions/download-artifact@v3 + with: + name: artifact + path: ./apps/web/.next + + - name: Install playwright browsers + run: npx playwright install chromium + - name: Run e2e & unit tests + run: | + yarn test --forbid-only + yarn run test:unit:coverage + 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: true + + - 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: true + + - name: Upload test results + if: ${{ failure() }} + uses: actions/upload-artifact@v2 + with: + name: test-results-e2e + path: ./test-results + if-no-files-found: ignore diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7e1c3e14e8..cb92de6f38 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,9 +1,7 @@ name: Build & Test on: - push: - branches: [master] - pull_request: + pull_request_target: branches: [master] pull_request_target: branches: [master] @@ -13,13 +11,12 @@ on: concurrency: # The concurrency group contains the workflow name and the branch name for # pull requests or the commit hash for any other events. - group: ${{ github.workflow }}-${{ github.event_name == 'pull_request' && github.head_ref || github.sha }} + group: ${{ github.workflow }}-${{ github.event_name == 'pull_request_target' && github.head_ref || github.sha }} cancel-in-progress: true jobs: build: name: Build on Pull Request - if: github.ref != 'refs/heads/master' runs-on: ubuntu-latest environment: development @@ -181,185 +178,3 @@ jobs: flags: unittest name: affine fail_ci_if_error: true - - build-frontend: - name: Build frontend - if: github.ref == 'refs/heads/master' - runs-on: ubuntu-latest - environment: production - - steps: - - uses: actions/checkout@v3 - - name: Use Node.js LTS - uses: actions/setup-node@v3 - with: - node-version-file: '.nvmrc' - cache: 'yarn' - registry-url: https://npm.pkg.github.com - scope: '@toeverything' - - name: Get yarn cache directory path - id: yarn-cache-dir-path - run: echo "::set-output name=dir::$(yarn config get cacheFolder)" - - uses: actions/cache@v3 - id: yarn-cache - with: - path: ${{ steps.yarn-cache-dir-path.outputs.dir }} - key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} - restore-keys: | - ${{ runner.os }}-yarn- - - - run: node scripts/module-resolve/ci.cjs - - - run: yarn install - env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_GITHUB_AUTH_TOKEN }} - - - name: Build - run: yarn build - env: - NEXT_PUBLIC_FIREBASE_API_KEY: ${{ secrets.NEXT_PUBLIC_FIREBASE_API_KEY }} - NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN: ${{ secrets.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN }} - NEXT_PUBLIC_FIREBASE_PROJECT_ID: ${{ secrets.NEXT_PUBLIC_FIREBASE_PROJECT_ID }} - NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET: ${{ secrets.NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET }} - NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID: ${{ secrets.NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID }} - NEXT_PUBLIC_FIREBASE_APP_ID: ${{ secrets.NEXT_PUBLIC_FIREBASE_APP_ID }} - NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID: ${{ secrets.NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID }} - - - name: Export - run: yarn export - - - name: Upload artifact - uses: actions/upload-artifact@v3 - with: - path: ./apps/web/out - - publish-frontend: - name: Push frontend image - if: github.ref == 'refs/heads/master' - runs-on: ubuntu-latest - needs: build-frontend - - permissions: - contents: read - packages: write - - env: - REGISTRY: ghcr.io - IMAGE_NAME: 'toeverything/affine-pathfinder' - IMAGE_TAG: canary-${{ github.sha }} - IMAGE_TAG_LATEST: nightly-latest - - steps: - - name: Check out the repo - uses: actions/checkout@v3 - - - name: Download artifact - uses: actions/download-artifact@v3 - with: - name: artifact - path: apps/web/out/ - - - name: Log in to Docker Hub - uses: docker/login-action@v2 - with: - registry: ${{ env.REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Extract metadata (tags, labels) for Docker - id: meta - uses: docker/metadata-action@v4 - with: - images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} - tags: | - ${{ env.IMAGE_TAG }} - ${{ env.IMAGE_TAG_LATEST }} - - - name: Build Docker image - uses: docker/build-push-action@v3 - with: - context: . - push: true - file: ./.github/deployment/Dockerfile - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} - - test-frontend: - name: Test Frontend - runs-on: ubuntu-latest - environment: development - needs: build-frontend - services: - octobase: - image: ghcr.io/toeverything/cloud:nightly-latest - ports: - - 3000:3000 - env: - SIGN_KEY: 'test123' - RUST_LOG: 'debug' - JWST_DEV: '1' - credentials: - username: ${{ github.actor }} - password: ${{ secrets.ACTIONS_PACKAGE_PUBLISH }} - - steps: - - uses: actions/checkout@v3 - - name: Use Node.js 18 - uses: actions/setup-node@v3 - with: - node-version: 18 - cache: 'yarn' - - name: Get yarn cache directory path - id: yarn-cache-dir-path - run: echo "::set-output name=dir::$(yarn config get cacheFolder)" - - uses: actions/cache@v3 - id: yarn-cache - with: - path: ${{ steps.yarn-cache-dir-path.outputs.dir }} - key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} - restore-keys: | - ${{ runner.os }}-yarn- - - run: yarn install - - name: Download artifact - uses: actions/download-artifact@v3 - with: - name: artifact - path: ./apps/web/.next - - - name: Install playwright browsers - run: npx playwright install chromium - - name: Run e2e & unit tests - run: | - yarn test --forbid-only - yarn run test:unit:coverage - 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: true - - - 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: true - - - name: Upload test results - if: ${{ failure() }} - uses: actions/upload-artifact@v2 - with: - name: test-results-e2e - path: ./test-results - if-no-files-found: ignore