ci: use claude code to fix upgrade issues #841
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: E2E Test | |
| permissions: {} | |
| on: | |
| workflow_dispatch: | |
| schedule: | |
| # Run every day at 0:00 GMT (8:00 AM Singapore time) | |
| - cron: '0 0 * * *' | |
| push: | |
| branches: | |
| - main | |
| paths-ignore: | |
| - '**/*.md' | |
| pull_request: | |
| types: [opened, synchronize, labeled] | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.sha }} | |
| cancel-in-progress: ${{ github.ref_name != 'main' }} | |
| defaults: | |
| run: | |
| shell: bash | |
| jobs: | |
| detect-changes: | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: read | |
| pull-requests: read | |
| outputs: | |
| related-files-changed: ${{ steps.filter.outputs.related-files }} | |
| steps: | |
| - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 | |
| - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 | |
| id: filter | |
| with: | |
| filters: | | |
| related-files: | |
| - 'packages/**/build.ts' | |
| - .github/workflows/e2e-test.yml | |
| - 'ecosystem-ci/*' | |
| download-previous-rolldown-binaries: | |
| needs: detect-changes | |
| runs-on: ubuntu-latest | |
| # Run if: not a PR, OR PR has 'test: e2e' label, OR PR is from deps/upstream-update branch, OR build.ts files changed | |
| if: >- | |
| github.event_name != 'pull_request' || | |
| contains(github.event.pull_request.labels.*.name, 'test: e2e') || | |
| github.head_ref == 'deps/upstream-update' || | |
| needs.detect-changes.outputs.related-files-changed == 'true' | |
| permissions: | |
| contents: read | |
| packages: read | |
| steps: | |
| - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 | |
| - uses: ./.github/actions/download-rolldown-binaries | |
| with: | |
| github-token: ${{ secrets.GITHUB_TOKEN }} | |
| build: | |
| name: Build vite-plus packages (${{ matrix.os }}) | |
| runs-on: ${{ matrix.os }} | |
| permissions: | |
| contents: read | |
| packages: read | |
| needs: | |
| - download-previous-rolldown-binaries | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| - os: ubuntu-latest | |
| target: x86_64-unknown-linux-gnu | |
| - os: windows-latest | |
| target: x86_64-pc-windows-msvc | |
| steps: | |
| - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 | |
| - uses: ./.github/actions/clone | |
| - name: Configure Git for access to vite-task | |
| run: git config --global url."https://x-access-token:${{ secrets.VITE_TASK_TOKEN }}@github.com/".insteadOf "ssh://git@github.com/" | |
| - uses: oxc-project/setup-rust@d286d43bc1f606abbd98096666ff8be68c8d5f57 # v1.0.0 | |
| with: | |
| save-cache: ${{ github.ref_name == 'main' }} | |
| cache-key: e2e-build-${{ matrix.os }} | |
| - uses: oxc-project/setup-node@fdbf0dfd334c4e6d56ceeb77d91c76339c2a0885 # v1.0.4 | |
| - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 | |
| with: | |
| name: rolldown-binaries | |
| path: ./rolldown/packages/rolldown/src | |
| merge-multiple: true | |
| - name: Build with upstream | |
| uses: ./.github/actions/build-upstream | |
| with: | |
| target: ${{ matrix.target }} | |
| - name: Pack packages into tgz | |
| run: | | |
| pnpm bootstrap-cli:ci | |
| mkdir -p tmp/tgz | |
| cd packages/core && pnpm pack --pack-destination ../../tmp/tgz && cd ../.. | |
| cd packages/test && pnpm pack --pack-destination ../../tmp/tgz && cd ../.. | |
| cd packages/cli && pnpm pack --pack-destination ../../tmp/tgz && cd ../.. | |
| cd packages/global && pnpm pack --pack-destination ../../tmp/tgz && cd ../.. | |
| ls -la tmp/tgz | |
| - name: Upload tgz artifacts | |
| uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 | |
| with: | |
| name: vite-plus-packages-${{ matrix.os }} | |
| path: tmp/tgz/*.tgz | |
| retention-days: 1 | |
| e2e-test: | |
| name: ${{ matrix.project.name }} E2E test (${{ matrix.os }}) | |
| env: | |
| # For packing manager install from github package registry | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| permissions: | |
| contents: read | |
| packages: read | |
| needs: | |
| - build | |
| runs-on: ${{ matrix.os }} | |
| timeout-minutes: 10 | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| os: | |
| - ubuntu-latest | |
| - windows-latest | |
| project: | |
| - name: vibe-dashboard | |
| node-version: 24 | |
| command: | | |
| npx playwright install chromium | |
| # FIXME: Failed to load JS plugin: ./plugins/debugger.js | |
| # vite run ready | |
| vite fmt | |
| vite test | |
| vite run build | |
| # FIXME: TypeError: Failed to fetch dynamically imported module | |
| # - name: skeleton | |
| # node-version: 24 | |
| # command: | | |
| # vite run format | |
| # vite run lint:check | |
| # vite run check | |
| # npx playwright install chromium | |
| # vite run test | |
| - name: rollipop | |
| node-version: 22 | |
| command: | | |
| vite run -r build | |
| # FIXME: typescript-eslint(no-redundant-type-constituents): 'rolldownExperimental.DevEngine' is an 'error' type that acts as 'any' and overrides all other types in this union type. | |
| vite run lint || true | |
| # FIXME: src/bundler-pool.ts(8,8): error TS2307: Cannot find module '@rollipop/core' or its corresponding type declarations. | |
| vite run -r typecheck || true | |
| vite run format | |
| vite run @rollipop/common#test | |
| vite run @rollipop/core#test | |
| vite run @rollipop/dev-server#test | |
| - name: frm-stack | |
| node-version: 24 | |
| command: | | |
| vite run lint:check | |
| vite run format:check | |
| vite run typecheck | |
| vite run @yourcompany/api#test | |
| vite run @yourcompany/backend-core#test | |
| - name: vue-mini | |
| node-version: 24 | |
| command: | | |
| vite run format | |
| vite run lint | |
| vite run type | |
| vite run test -- --coverage | |
| # SKIP: vite-plugin-react - vite-task config loading incompatibility | |
| # vite-task needs to load vite.config.js for all workspace packages to build the task graph, | |
| # but the vite-plus process starts with workspace root as cwd. | |
| # The plugin-react-swc playgrounds use SWC plugins (e.g., @swc/plugin-emotion) which | |
| # cannot be resolved when loading the config from workspace root. | |
| # | |
| # Minimal reproduction: | |
| # git clone https://github.com/vitejs/vite-plugin-react /tmp/vite-plugin-react-test | |
| # cd /tmp/vite-plugin-react-test && pnpm install && pnpm run build | |
| # node packages/plugin-react-swc/playground/emotion-plugin/vite.config.js | |
| # # Error: Cannot find module '@swc/plugin-emotion' | |
| # | |
| # This works when running from within the playground directory (pnpm run build) | |
| # because pnpm's symlink structure allows resolution, but fails when loading from workspace root. | |
| # - name: vite-plugin-react | |
| # node-version: 22 | |
| # command: | | |
| # vite run format | |
| # vite run lint -- --fix | |
| # # TODO(fengmk2): run all builds and tests after tsdown version upgrade | |
| # vite run @vitejs/plugin-rsc#build | |
| # vite run @vitejs/plugin-rsc#test | |
| - name: vitepress | |
| node-version: 24 | |
| command: | | |
| npx playwright install chromium | |
| vite run format | |
| vite run build | |
| vite test run -r __tests__/unit | |
| vite run tests-e2e#test | |
| VITE_TEST_BUILD=1 vite run tests-e2e#test | |
| vite run tests-init#test | |
| - name: tanstack-start-helloworld | |
| node-version: 24 | |
| command: | | |
| npx playwright install chromium | |
| vite run test | |
| vite run build | |
| - name: oxlint-plugin-complexity | |
| node-version: 22 | |
| command: | | |
| vite run format | |
| vite run format:check | |
| vite run build | |
| vite run lint | |
| vite run test:run | |
| npx tsc --noEmit | |
| - name: dify | |
| node-version: 24 | |
| directory: web | |
| command: | | |
| vite run type-check:tsgo | |
| vite run build | |
| vite run test navigation-utils.test.ts real-browser-flicker.test.tsx workflow-parallel-limit.test.tsx | |
| exclude: | |
| # frm-stack uses Docker (testcontainers) which doesn't work the same way on Windows | |
| - os: windows-latest | |
| project: | |
| name: frm-stack | |
| # dify only runs on Linux for now | |
| - os: windows-latest | |
| project: | |
| name: dify | |
| steps: | |
| - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 | |
| - uses: ./.github/actions/clone | |
| with: | |
| ecosystem-ci-project: ${{ matrix.project.name }} | |
| - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5 | |
| with: | |
| node-version: ${{ matrix.project.node-version }} | |
| package-manager-cache: false | |
| - name: Download vite-plus packages | |
| uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 | |
| with: | |
| name: vite-plus-packages-${{ matrix.os }} | |
| path: tmp/tgz | |
| - name: Install vite-plus from tgz in ${{ matrix.project.name }} | |
| working-directory: ${{ runner.temp }}/vite-plus-ecosystem-ci/${{ matrix.project.name }}${{ matrix.project.directory && format('/{0}', matrix.project.directory) || '' }} | |
| run: | | |
| # install global CLI first | |
| npm install -g $GITHUB_WORKSPACE/tmp/tgz/vite-plus-cli-0.0.0.tgz | |
| node $GITHUB_WORKSPACE/ecosystem-ci/patch-project.ts ${{ matrix.project.name }} | |
| vite install --no-frozen-lockfile | |
| - name: Run vite-plus commands in ${{ matrix.project.name }} | |
| working-directory: ${{ runner.temp }}/vite-plus-ecosystem-ci/${{ matrix.project.name }}${{ matrix.project.directory && format('/{0}', matrix.project.directory) || '' }} | |
| run: ${{ matrix.project.command }} | |
| notify-failure: | |
| name: Notify on failure | |
| runs-on: ubuntu-latest | |
| needs: e2e-test | |
| if: ${{ failure() && github.event_name == 'schedule' }} | |
| permissions: | |
| contents: read | |
| issues: write | |
| steps: | |
| - name: Create or update GitHub issue on failure | |
| env: | |
| GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| GH_REPO: ${{ github.repository }} | |
| run: | | |
| ISSUE_TITLE="E2E Test Scheduled Run Failed" | |
| ISSUE_LABEL="e2e-failure" | |
| RUN_URL="${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" | |
| # Create label if it doesn't exist | |
| if ! gh label list --json name --jq '.[].name' | grep -q "^${ISSUE_LABEL}$"; then | |
| CREATE_LABEL_OUTPUT=$(gh label create "$ISSUE_LABEL" --color "d73a4a" --description "E2E test scheduled run failure" 2>&1) | |
| if [ $? -eq 0 ]; then | |
| echo "Created label: $ISSUE_LABEL" | |
| elif echo "$CREATE_LABEL_OUTPUT" | grep -qi "already exists"; then | |
| echo "Label '$ISSUE_LABEL' already exists, continuing." | |
| else | |
| echo "Error: Failed to create label '$ISSUE_LABEL':" | |
| echo "$CREATE_LABEL_OUTPUT" >&2 | |
| exit 1 | |
| fi | |
| fi | |
| # Search for existing open issue with the label | |
| EXISTING_ISSUE=$(gh issue list --label "$ISSUE_LABEL" --state open --json number --jq '.[0].number') | |
| if [ -z "$EXISTING_ISSUE" ]; then | |
| # Create new issue if none exists | |
| gh issue create \ | |
| --title "$ISSUE_TITLE" \ | |
| --label "$ISSUE_LABEL" \ | |
| --body "The scheduled E2E test run has failed. | |
| **Failed Run:** $RUN_URL | |
| **Time:** $(date -u '+%Y-%m-%d %H:%M:%S UTC') | |
| Please investigate the failure and fix any issues." | |
| echo "Created new issue" | |
| else | |
| # Add comment to existing issue | |
| gh issue comment "$EXISTING_ISSUE" \ | |
| --body "The scheduled E2E test run has failed again. | |
| **Failed Run:** $RUN_URL | |
| **Time:** $(date -u '+%Y-%m-%d %H:%M:%S UTC')" | |
| echo "Added comment to issue #$EXISTING_ISSUE" | |
| fi |