name: CI UI on: pull_request: merge_group: permissions: contents: read concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: ${{ github.ref != 'refs/heads/main' }} jobs: changed-files-check: if: github.event_name != 'merge_group' uses: ./.github/workflows/changed-files.yaml with: files: | package.json yarn.lock packages/twenty-ui/** packages/twenty-shared/** ui-task: needs: changed-files-check if: needs.changed-files-check.outputs.any_changed == 'true' timeout-minutes: 30 runs-on: ubuntu-latest strategy: matrix: task: [lint, typecheck, test] steps: - name: Cancel Previous Runs uses: styfle/cancel-workflow-action@0.11.0 with: access_token: ${{ github.token }} - name: Fetch custom Github Actions and base branch history uses: actions/checkout@v4 with: fetch-depth: 10 - name: Install dependencies uses: ./.github/actions/yarn-install - name: Run ${{ matrix.task }} run: npx nx ${{ matrix.task }} twenty-ui ui-sb-build: needs: changed-files-check if: needs.changed-files-check.outputs.any_changed == 'true' timeout-minutes: 30 runs-on: ubuntu-latest steps: - name: Cancel Previous Runs uses: styfle/cancel-workflow-action@0.11.0 with: access_token: ${{ github.token }} - name: Fetch custom Github Actions and base branch history uses: actions/checkout@v4 with: fetch-depth: 10 - name: Install dependencies uses: ./.github/actions/yarn-install - name: Build storybook run: npx nx storybook:build twenty-ui - name: Upload storybook build uses: actions/upload-artifact@v4 with: name: storybook-twenty-ui path: packages/twenty-ui/storybook-static retention-days: 1 ui-sb-test: timeout-minutes: 30 runs-on: ubuntu-latest needs: ui-sb-build env: STORYBOOK_URL: http://localhost:6007 steps: - name: Fetch custom Github Actions and base branch history uses: actions/checkout@v4 with: fetch-depth: 10 - name: Install dependencies uses: ./.github/actions/yarn-install - name: Build dependencies run: npx nx build twenty-shared - name: Download storybook build uses: actions/download-artifact@v4 with: name: storybook-twenty-ui path: packages/twenty-ui/storybook-static - name: Install Playwright run: | cd packages/twenty-ui npx playwright install - name: Serve storybook & run tests run: | npx http-server packages/twenty-ui/storybook-static --port 6007 --silent & timeout 30 bash -c 'until curl -sf http://localhost:6007 > /dev/null 2>&1; do sleep 1; done' npx nx storybook:test twenty-ui visual-regression-dispatch: needs: ui-sb-build if: github.event_name == 'pull_request' timeout-minutes: 5 runs-on: ubuntu-latest steps: - name: Download storybook build uses: actions/download-artifact@v4 with: name: storybook-twenty-ui path: storybook-static - name: Package storybook run: tar -czf /tmp/storybook-twenty-ui.tar.gz -C storybook-static . - name: Upload storybook tarball uses: actions/upload-artifact@v4 with: name: storybook-twenty-ui-tarball path: /tmp/storybook-twenty-ui.tar.gz retention-days: 1 - name: Dispatch to ci-privileged uses: peter-evans/repository-dispatch@v2 with: token: ${{ secrets.CI_PRIVILEGED_DISPATCH_TOKEN }} repository: twentyhq/ci-privileged event-type: visual-regression client-payload: >- { "pr_number": "${{ github.event.pull_request.number }}", "run_id": "${{ github.run_id }}", "repo": "${{ github.repository }}", "project": "twenty-ui", "branch": "${{ github.head_ref }}", "commit": "${{ github.event.pull_request.head.sha }}" } ci-ui-status-check: if: always() && !cancelled() timeout-minutes: 5 runs-on: ubuntu-latest needs: [ changed-files-check, ui-task, ui-sb-build, ui-sb-test, ] steps: - name: Fail job if any needs failed if: contains(needs.*.result, 'failure') run: exit 1