From 130cff5136d9c4f0c14e371d683234f22ec8f378 Mon Sep 17 00:00:00 2001 From: Artiom Lunev Date: Thu, 5 Nov 2026 14:07:32 +0000 Subject: [PATCH 1/2] chore: use supported Node runtimes for development and CI --- .github/CONTRIBUTING.md | 6 +++++ .github/workflows/claude.yml | 9 +++++--- .github/workflows/cloud_evals.yml | 2 +- .github/workflows/docker.yml | 14 ++++++------ .github/workflows/install-script.yml | 14 ++++++------ .github/workflows/lint.yml | 22 +++++++++++------- .github/workflows/package.yaml | 12 +++++----- .github/workflows/publish.yml | 6 ++--- .github/workflows/stale-bot.yml | 2 +- .github/workflows/test.yaml | 34 ++++++++++++++-------------- .node-version | 1 + 11 files changed, 69 insertions(+), 53 deletions(-) create mode 100644 .node-version diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 2268db9321f..20239db460a 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -5,3 +5,9 @@ We love contributions! Please read through these links to get started: - 🔢 [Contribution Guidelines](https://docs.browser-use.com/development/contribution-guide) - 👾 [Local Development Setup Guide](https://docs.browser-use.com/development/local-setup) - 🏷️ [Issues Tagged: `#help-wanted`](https://github.com/browser-use/browser-use/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22help%20wanted%22) + +For development, select Node 26 from `.node-version` before running Pyright +or the pre-commit hooks (`nvm install "$(cat .node-version)" && nvm use "$(cat .node-version)"` if you use nvm). On Linux, +Node.js 26 also requires `libatomic` (`sudo apt install libatomic1` on Debian/Ubuntu). +The Python package does not require a system Node.js installation; optional +external MCP servers have their own runtime requirements. diff --git a/.github/workflows/claude.yml b/.github/workflows/claude.yml index 9506d99b0c3..13fe9131db8 100644 --- a/.github/workflows/claude.yml +++ b/.github/workflows/claude.yml @@ -28,8 +28,11 @@ jobs: env: IS_SANDBOX: '1' steps: - - uses: actions/checkout@v4 - - uses: astral-sh/setup-uv@v6 + - uses: actions/checkout@v5 + - uses: actions/setup-node@v5 + with: + node-version-file: '.node-version' + - uses: astral-sh/setup-uv@v7 with: enable-cache: true activate-environment: true @@ -55,7 +58,7 @@ jobs: # - run: playwright install chrome --with-deps - name: Cache chromium binaries - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: | ~/.cache/ms-playwright diff --git a/.github/workflows/cloud_evals.yml b/.github/workflows/cloud_evals.yml index 33d5f75c3f7..bcf710e5a57 100644 --- a/.github/workflows/cloud_evals.yml +++ b/.github/workflows/cloud_evals.yml @@ -20,7 +20,7 @@ jobs: trigger_cloud_eval_image_build: runs-on: ubuntu-latest steps: - - uses: actions/github-script@v7 + - uses: actions/github-script@v8 with: github-token: ${{ secrets.TRIGGER_CLOUD_BUILD_GH_KEY }} script: | diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 455c219dafa..34c61895f8e 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -27,22 +27,22 @@ jobs: id-token: write steps: - name: Check out the repo - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Set up QEMU - uses: docker/setup-qemu-action@v3 + uses: docker/setup-qemu-action@v4 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 + uses: docker/setup-buildx-action@v4 - name: Log in to Docker Hub - uses: docker/login-action@v3 + uses: docker/login-action@v4 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Login to GitHub Container Registry - uses: docker/login-action@v3 + uses: docker/login-action@v4 with: registry: ghcr.io username: ${{ github.repository_owner }} @@ -50,7 +50,7 @@ jobs: - name: Compute Docker tags based on tag/branch id: meta - uses: docker/metadata-action@v5 + uses: docker/metadata-action@v6 with: images: | browseruse/browseruse @@ -64,7 +64,7 @@ jobs: - name: Build and push Docker image id: push - uses: docker/build-push-action@v6 + uses: docker/build-push-action@v7 with: platforms: linux/amd64,linux/arm64 context: . diff --git a/.github/workflows/install-script.yml b/.github/workflows/install-script.yml index ccc3316fa5c..cd6359fb3df 100644 --- a/.github/workflows/install-script.yml +++ b/.github/workflows/install-script.yml @@ -38,10 +38,10 @@ jobs: mode: [--remote-only, --local-only, --full] runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Setup Python - uses: actions/setup-python@v5 + uses: actions/setup-python@v6 with: python-version: '3.11' @@ -113,7 +113,7 @@ jobs: mode: [--remote-only, --local-only, --full] runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Run install.sh ${{ matrix.mode }} run: bash browser_use/skill_cli/install.sh ${{ matrix.mode }} @@ -185,10 +185,10 @@ jobs: # Fix Unicode output on Windows (checkmarks, etc.) PYTHONIOENCODING: utf-8 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Setup Python (Windows requires manual setup) - uses: actions/setup-python@v5 + uses: actions/setup-python@v6 with: python-version: '3.11' @@ -230,7 +230,7 @@ jobs: name: uv pip install (Linux) runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Install uv run: curl -LsSf https://astral.sh/uv/install.sh | sh @@ -278,7 +278,7 @@ jobs: name: uvx browser-use[cli] (Linux) runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Install uv run: curl -LsSf https://astral.sh/uv/install.sh | sh diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 05a1a85794d..509b47a6818 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -21,18 +21,21 @@ jobs: name: syntax-errors runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: astral-sh/setup-uv@v5 + - uses: actions/checkout@v5 + - uses: astral-sh/setup-uv@v7 with: enable-cache: true - run: uv run ruff check --no-fix --select PLE lint-style: - name: code-style + name: code-style (Node 26) runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: astral-sh/setup-uv@v5 + - uses: actions/checkout@v5 + - uses: actions/setup-node@v5 + with: + node-version-file: '.node-version' + - uses: astral-sh/setup-uv@v7 with: enable-cache: true - run: uv python install 3.11 @@ -40,11 +43,14 @@ jobs: - run: uv run --no-sync pre-commit run --all-files --show-diff-on-failure lint-typecheck: - name: type-checker + name: type-checker (Node 26) runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: astral-sh/setup-uv@v6 + - uses: actions/checkout@v5 + - uses: actions/setup-node@v5 + with: + node-version-file: '.node-version' + - uses: astral-sh/setup-uv@v7 with: enable-cache: true - run: uv sync --dev --all-extras # install extras for examples to avoid pyright missing imports errors- diff --git a/.github/workflows/package.yaml b/.github/workflows/package.yaml index 981d783f908..23f6c91f714 100644 --- a/.github/workflows/package.yaml +++ b/.github/workflows/package.yaml @@ -20,10 +20,10 @@ jobs: name: pip-build runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: astral-sh/setup-uv@v5 + - uses: actions/checkout@v5 + - uses: astral-sh/setup-uv@v7 - run: uv build --python 3.12 - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v6 with: name: dist-artifact path: | @@ -42,9 +42,9 @@ jobs: ANONYMIZED_TELEMETRY: 'false' steps: - - uses: actions/checkout@v4 - - uses: astral-sh/setup-uv@v5 - - uses: actions/download-artifact@v4 + - uses: actions/checkout@v5 + - uses: astral-sh/setup-uv@v7 + - uses: actions/download-artifact@v7 with: name: dist-artifact diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index cbb746a5bab..e22ebdfce2e 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -29,7 +29,7 @@ jobs: if: github.event_name == 'workflow_dispatch' runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Create pre-release tag run: | git fetch --tags @@ -74,8 +74,8 @@ jobs: IN_DOCKER: 'True' ANONYMIZED_TELEMETRY: 'false' steps: - - uses: actions/checkout@v4 - - uses: astral-sh/setup-uv@v6 + - uses: actions/checkout@v5 + - uses: astral-sh/setup-uv@v7 with: enable-cache: true activate-environment: true diff --git a/.github/workflows/stale-bot.yml b/.github/workflows/stale-bot.yml index 779080e0eee..0e24ad0e081 100644 --- a/.github/workflows/stale-bot.yml +++ b/.github/workflows/stale-bot.yml @@ -12,7 +12,7 @@ jobs: stale: runs-on: ubuntu-latest steps: - - uses: actions/stale@v9 + - uses: actions/stale@v10 with: # General settings repo-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index fb4187235b6..ae3a71e5ecc 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -28,8 +28,8 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 5 steps: - - uses: actions/checkout@v4 - - uses: astral-sh/setup-uv@v6 + - uses: actions/checkout@v5 + - uses: astral-sh/setup-uv@v7 - name: Get week number for cache key id: week @@ -37,7 +37,7 @@ jobs: - name: Cache chromium binaries id: cache-chromium - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: | ~/.cache/ms-playwright @@ -56,7 +56,7 @@ jobs: TEST_FILENAMES: ${{ steps.lsgrep.outputs.TEST_FILENAMES }} # ["test_browser", "test_tools", "test_browser_session", "test_tab_management", ...] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: # Force fresh checkout to avoid any caching issues fetch-depth: 1 @@ -113,14 +113,14 @@ jobs: exit 1 fi - - uses: actions/checkout@v4 - - uses: astral-sh/setup-uv@v6 + - uses: actions/checkout@v5 + - uses: astral-sh/setup-uv@v7 with: enable-cache: true activate-environment: true - name: Cache uv packages and venv - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: | ~/.cache/uv @@ -137,7 +137,7 @@ jobs: - name: Cache chromium binaries id: cache-chromium - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: | ~/.cache/ms-playwright @@ -150,7 +150,7 @@ jobs: run: uvx playwright install chromium --with-deps --no-shell - name: Cache browser-use extensions - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: | ~/.config/browseruse/extensions @@ -174,7 +174,7 @@ jobs: - name: Run test with retry if: steps.check-file.outputs.exists == 'true' - uses: nick-fields/retry@v3 + uses: nick-fields/retry@v4 with: timeout_minutes: 4 max_attempts: 1 @@ -197,14 +197,14 @@ jobs: GROQ_API_KEY: ${{ secrets.GROQ_API_KEY }} BROWSER_USE_API_KEY: ${{ secrets.BROWSER_USE_API_KEY }} steps: - - uses: actions/checkout@v4 - - uses: astral-sh/setup-uv@v6 + - uses: actions/checkout@v5 + - uses: astral-sh/setup-uv@v7 with: enable-cache: true activate-environment: true - name: Cache uv packages and venv - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: | ~/.cache/uv @@ -221,7 +221,7 @@ jobs: - name: Cache chromium binaries id: cache-chromium - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: | ~/.cache/ms-playwright @@ -234,7 +234,7 @@ jobs: run: uvx playwright install chromium --with-deps --no-shell - name: Cache browser-use extensions - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: | ~/.config/browseruse/extensions @@ -244,7 +244,7 @@ jobs: - name: Run agent tasks evaluation and capture score id: eval - uses: nick-fields/retry@v3 + uses: nick-fields/retry@v4 with: timeout_minutes: 4 max_attempts: 1 @@ -271,7 +271,7 @@ jobs: - name: Comment PR with agent evaluation results if: github.event_name == 'pull_request' - uses: actions/github-script@v7 + uses: actions/github-script@v8 continue-on-error: true with: script: | diff --git a/.node-version b/.node-version new file mode 100644 index 00000000000..6f4247a6255 --- /dev/null +++ b/.node-version @@ -0,0 +1 @@ +26 From 2e5f5f9196268337a488699d7dd1949e3f9344e0 Mon Sep 17 00:00:00 2001 From: Artiom Lunev Date: Thu, 5 Nov 2026 15:14:00 +0000 Subject: [PATCH 2/2] fix: handle transient CI dependency download failures --- .github/workflows/test.yaml | 2 +- browser_use/skill_cli/install.sh | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index ae3a71e5ecc..69ec560f02a 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -26,7 +26,7 @@ on: jobs: setup-chromium: runs-on: ubuntu-latest - timeout-minutes: 5 + timeout-minutes: 15 # Cold apt/browser downloads can exceed five minutes. steps: - uses: actions/checkout@v5 - uses: astral-sh/setup-uv@v7 diff --git a/browser_use/skill_cli/install.sh b/browser_use/skill_cli/install.sh index 23847d7a248..06fccf33357 100755 --- a/browser_use/skill_cli/install.sh +++ b/browser_use/skill_cli/install.sh @@ -544,9 +544,9 @@ install_cloudflared() { linux) mkdir -p "$HOME/.local/bin" if [ "$arch" = "aarch64" ] || [ "$arch" = "arm64" ]; then - curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-arm64 -o "$HOME/.local/bin/cloudflared" + curl -fL --retry 3 --retry-delay 1 --connect-timeout 15 https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-arm64 -o "$HOME/.local/bin/cloudflared" else - curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 -o "$HOME/.local/bin/cloudflared" + curl -fL --retry 3 --retry-delay 1 --connect-timeout 15 https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 -o "$HOME/.local/bin/cloudflared" fi chmod +x "$HOME/.local/bin/cloudflared" ;;