Fresh Install Tests #32
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: Fresh Install Tests | |
| # Periodically tests BlockNote with the latest versions of its dependencies | |
| # (within declared ranges), without a lockfile. This catches breakage when a | |
| # new release of a dep like @tiptap/* or prosemirror-* ships and conflicts | |
| # with BlockNote's declared ranges — the kind of failure a user would hit when | |
| # running `npm install @blocknote/react` in a fresh project. | |
| # | |
| # DevDependencies (vitest, vite, typescript, etc.) are still bounded by their | |
| # declared ranges in package.json; only prod/peer deps get freshly resolved. | |
| on: | |
| schedule: | |
| - cron: "0 2 * * *" # Daily at 02:00 UTC | |
| workflow_dispatch: # Allow manual runs | |
| env: | |
| FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true | |
| pnpm_config_store_dir: ./node_modules/.pnpm-store | |
| jobs: | |
| fresh-install-unit-tests: | |
| name: Unit Tests (Fresh Dep Resolution) | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 30 | |
| steps: | |
| - id: checkout | |
| uses: actions/checkout@v6 | |
| - id: install_pnpm | |
| name: Install pnpm | |
| uses: pnpm/action-setup@v5 | |
| - id: setup_node | |
| uses: actions/setup-node@v6 | |
| with: | |
| node-version-file: ".nvmrc" | |
| # Intentionally no pnpm cache — we want a genuinely fresh install | |
| - id: remove_lockfile | |
| name: Remove lockfile to force fresh dep resolution | |
| # Removing pnpm-lock.yaml causes pnpm to resolve all dependencies to | |
| # the latest versions that satisfy the ranges declared in package.json | |
| # (including pnpm-workspace.yaml overrides). This is equivalent to what | |
| # a new user experiences when installing BlockNote in a blank project. | |
| run: rm pnpm-lock.yaml | |
| - id: install_dependencies | |
| name: Install dependencies | |
| run: pnpm install --no-frozen-lockfile | |
| - id: build_packages | |
| name: Build packages | |
| run: pnpm run build | |
| env: | |
| NX_SKIP_NX_CACHE: "true" | |
| - id: run_unit_tests | |
| name: Run unit tests | |
| run: pnpm run test | |
| env: | |
| NX_SKIP_NX_CACHE: "true" | |
| - name: Notify Slack on workflow failure | |
| if: ${{ failure() }} | |
| env: | |
| SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} | |
| REPOSITORY: ${{ github.repository }} | |
| WORKFLOW: ${{ github.workflow }} | |
| RUN_ID: ${{ github.run_id }} | |
| RUN_NUMBER: ${{ github.run_number }} | |
| RUN_ATTEMPT: ${{ github.run_attempt }} | |
| BRANCH: ${{ github.ref_name }} | |
| run: | | |
| if [ -z "$SLACK_WEBHOOK_URL" ]; then | |
| echo "SLACK_WEBHOOK_URL is not configured; skipping Slack notification." | |
| exit 0 | |
| fi | |
| failed_step="Unknown step" | |
| if [ "${{ steps.checkout.outcome }}" = "failure" ]; then | |
| failed_step="Checkout repository" | |
| elif [ "${{ steps.install_pnpm.outcome }}" = "failure" ]; then | |
| failed_step="Install pnpm" | |
| elif [ "${{ steps.setup_node.outcome }}" = "failure" ]; then | |
| failed_step="Setup Node.js" | |
| elif [ "${{ steps.remove_lockfile.outcome }}" = "failure" ]; then | |
| failed_step="Remove lockfile to force fresh dep resolution" | |
| elif [ "${{ steps.install_dependencies.outcome }}" = "failure" ]; then | |
| failed_step="Install dependencies" | |
| elif [ "${{ steps.build_packages.outcome }}" = "failure" ]; then | |
| failed_step="Build packages" | |
| elif [ "${{ steps.run_unit_tests.outcome }}" = "failure" ]; then | |
| failed_step="Run unit tests" | |
| fi | |
| run_url="https://github.com/${REPOSITORY}/actions/runs/${RUN_ID}" | |
| message=$(printf '%s\n%s\n%s\n%s' \ | |
| ":warning: Fresh Install Tests failed in *${REPOSITORY}* on branch *${BRANCH}*." \ | |
| "*Workflow:* ${WORKFLOW}" \ | |
| "*Run:* <${run_url}|#${RUN_NUMBER} (attempt ${RUN_ATTEMPT})>" \ | |
| "*Failed step:* ${failed_step}") | |
| payload=$(jq --compact-output --null-input --arg text "$message" '{text: $text}') | |
| curl -sS -X POST \ | |
| --fail \ | |
| --retry 4 \ | |
| --retry-all-errors \ | |
| --retry-max-time 60 \ | |
| --connect-timeout 10 \ | |
| --max-time 30 \ | |
| -H "Content-type: application/json" \ | |
| --data "$payload" \ | |
| "$SLACK_WEBHOOK_URL" |