microsoft/playwright GitHub Actions scorecardPublic GitHub Actions data, last 30 days. Updated .
Data sourced from public GitHub. GitSpider is not affiliated with or endorsed by this repository's owners. Request removal.
Biggest wins first, each with the exact config fix.
tests 2Fails or times out on nearly all recent runs, burning minutes to produce only red, and an always-red workflow usually gets ignored. Fix it, or disable the trigger until it's ready.
tests 2Set `cache: 'gradle'` on your `actions/setup-java` step, or add an `actions/cache@v4` step keyed on your build file.
- uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '21'
cache: 'gradle'tests 1Set `cache: 'pnpm'` on your `actions/setup-node` step, or add an `actions/cache@v4` step keyed on your lockfile.
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'tests 2Add a `concurrency:` block keyed on branch to cancel superseded runs when devs push twice quickly.
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: trueinfraSet `cache: 'pip'` on your `actions/setup-python` step, or add an `actions/cache@v4` step keyed on your requirements/lock file.
- uses: actions/setup-python@v5
with:
python-version: '3.12'
cache: 'pip'tests BiDiSet `cache: 'npm'` on your `actions/setup-node` step, or add an `actions/cache@v4` step keyed on your lockfile.
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'npm'Publish Test ResultsSet `cache: 'npm'` on your `actions/setup-node` step, or add an `actions/cache@v4` step keyed on your lockfile.
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'npm'infraAdd a `concurrency:` block keyed on branch to cancel superseded runs when devs push twice quickly.
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: truePublish Test ResultsAdd a `concurrency:` block keyed on branch to cancel superseded runs when devs push twice quickly.
concurrency:
group: ${{ github.workflow }}
# no cancel-in-progress on deploys: queued deploys would be droppedextensionSet `cache: 'npm'` on your `actions/setup-node` step, or add an `actions/cache@v4` step keyed on your lockfile.
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'npm'Update test results DBSet `cache: 'npm'` on your `actions/setup-node` step, or add an `actions/cache@v4` step keyed on your lockfile.
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'npm'Issue triage (Linux)Set `cache: 'npm'` on your `actions/setup-node` step, or add an `actions/cache@v4` step keyed on your lockfile.
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'npm'Issue triage (macOS)Set `cache: 'npm'` on your `actions/setup-node` step, or add an `actions/cache@v4` step keyed on your lockfile.
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'npm'infraNo job sets `timeout-minutes`, so a hung step can run to GitHub's 6-hour default. Add `timeout-minutes` to each job.
jobs:
build:
runs-on: ubuntu-latest
timeout-minutes: 15infraRuns on every push/PR with no `paths:` filter, so docs-only changes still trigger full CI. Add a `paths:` filter if that's common.
on:
pull_request:
paths:
- 'src/**'
- 'package.json'tests 1macOS bills ~10x and Windows ~2x a Linux minute. The cost estimate above assumes Linux, so your real spend is higher. Move any job that doesn't need them to `ubuntu-latest`.
jobs:
build:
runs-on: ubuntu-latest # ~10x cheaper than macos-latesttests 2macOS bills ~10x and Windows ~2x a Linux minute. The cost estimate above assumes Linux, so your real spend is higher. Move any job that doesn't need them to `ubuntu-latest`.
jobs:
build:
runs-on: ubuntu-latest # ~10x cheaper than macos-latesttests 2Uses a larger hosted runner, which bills even on public repos (only standard runners are free). Keep big runners for jobs that measurably need the cores.
jobs:
lint:
runs-on: ubuntu-latest # standard runner — free on public reposPublish Test ResultsNo job sets `timeout-minutes`, so a hung step can run to GitHub's 6-hour default. Add `timeout-minutes` to each job.
jobs:
build:
runs-on: ubuntu-latest
timeout-minutes: 15tests BiDiNo job sets `timeout-minutes`, so a hung step can run to GitHub's 6-hour default. Add `timeout-minutes` to each job.
jobs:
build:
runs-on: ubuntu-latest
timeout-minutes: 15tests BiDiThe schedule fires at minute :00, GitHub's peak window, where scheduled runs get delayed or skipped. Shift to any other minute for the same cadence with less contention.
on:
schedule:
- cron: '50 0 * * *' # was '0 0 * * *' — any non-:00 minute avoids the herdtests BiDiSystem packages install from the network on every run with no cache. Cache them (cache-apt-pkgs-action) or check whether the runner image already has the tool.
- uses: awalsh128/cache-apt-pkgs-action@latest
with:
packages: <your packages>
version: 1.0tests BiDiTests run under an auto-retry wrapper, so each retry re-bills the same minutes and masks the flaky tests it papers over. Track, fix or quarantine the flakes, then drop the wrapper.
MCPNo job sets `timeout-minutes`, so a hung step can run to GitHub's 6-hour default. Add `timeout-minutes` to each job.
jobs:
build:
runs-on: ubuntu-latest
timeout-minutes: 15MCPmacOS bills ~10x and Windows ~2x a Linux minute. The cost estimate above assumes Linux, so your real spend is higher. Move any job that doesn't need them to `ubuntu-latest`.
jobs:
build:
runs-on: ubuntu-latest # ~10x cheaper than macos-latestextensionNo job sets `timeout-minutes`, so a hung step can run to GitHub's 6-hour default. Add `timeout-minutes` to each job.
jobs:
build:
runs-on: ubuntu-latest
timeout-minutes: 15extensionmacOS bills ~10x and Windows ~2x a Linux minute. The cost estimate above assumes Linux, so your real spend is higher. Move any job that doesn't need them to `ubuntu-latest`.
jobs:
build:
runs-on: ubuntu-latest # ~10x cheaper than macos-latestUpdate test results DBThe schedule fires at minute :00, GitHub's peak window, where scheduled runs get delayed or skipped. Shift to any other minute for the same cadence with less contention.
on:
schedule:
- cron: '6 */3 * * *' # was '0 */3 * * *' — any non-:00 minute avoids the herdIssue triage (Linux)`upload-artifact` has no `retention-days`, so artifacts keep up to 90 days (storage cost). Set e.g. `retention-days: 7`.
- uses: actions/upload-artifact@v4
with:
name: build
path: dist/
retention-days: 7Issue triage (macOS)`upload-artifact` has no `retention-days`, so artifacts keep up to 90 days (storage cost). Set e.g. `retention-days: 7`.
- uses: actions/upload-artifact@v4
with:
name: build
path: dist/
retention-days: 7Issue triage (macOS)macOS bills ~10x and Windows ~2x a Linux minute. The cost estimate above assumes Linux, so your real spend is higher. Move any job that doesn't need them to `ubuntu-latest`.
jobs:
build:
runs-on: ubuntu-latest # ~10x cheaper than macos-latestIssue triage (Windows)Set `cache: 'npm'` on your `actions/setup-node` step, or add an `actions/cache@v4` step keyed on your lockfile.
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'npm'Issue triage (Windows)`upload-artifact` has no `retention-days`, so artifacts keep up to 90 days (storage cost). Set e.g. `retention-days: 7`.
- uses: actions/upload-artifact@v4
with:
name: build
path: dist/
retention-days: 7Issue triage (Windows)macOS bills ~10x and Windows ~2x a Linux minute. The cost estimate above assumes Linux, so your real spend is higher. Move any job that doesn't need them to `ubuntu-latest`.
jobs:
build:
runs-on: ubuntu-latest # ~10x cheaper than macos-latest# Missing dependency cache (gradle) (applies to: tests 2)
- uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '21'
cache: 'gradle'
# Missing dependency cache (pnpm) (applies to: tests 1)
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
# No concurrency control (applies to: tests 2, infra)
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
# Missing dependency cache (pip) (applies to: infra)
- uses: actions/setup-python@v5
with:
python-version: '3.12'
cache: 'pip'
# Missing dependency cache (npm) (applies to: tests BiDi, Publish Test Results, extension, Update test results DB, Issue triage (Linux), Issue triage (macOS), Issue triage (Windows))
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'npm'
# No concurrency control (applies to: Publish Test Results)
concurrency:
group: ${{ github.workflow }}
# no cancel-in-progress on deploys: queued deploys would be dropped
# No job timeout (applies to: infra, Publish Test Results, tests BiDi, MCP, extension)
jobs:
build:
runs-on: ubuntu-latest
timeout-minutes: 15
# No path filters on triggers (applies to: infra)
on:
pull_request:
paths:
- 'src/**'
- 'package.json'
# Premium runners (macOS / Windows) (applies to: tests 1, tests 2, MCP, extension, Issue triage (macOS), Issue triage (Windows))
jobs:
build:
runs-on: ubuntu-latest # ~10x cheaper than macos-latest
# Larger hosted runner (applies to: tests 2)
jobs:
lint:
runs-on: ubuntu-latest # standard runner — free on public repos
# Scheduled at the top of the hour (applies to: tests BiDi)
on:
schedule:
- cron: '50 0 * * *' # was '0 0 * * *' — any non-:00 minute avoids the herd
# System packages reinstalled every run (applies to: tests BiDi)
- uses: awalsh128/cache-apt-pkgs-action@latest
with:
packages: <your packages>
version: 1.0
# Scheduled at the top of the hour (applies to: Update test results DB)
on:
schedule:
- cron: '6 */3 * * *' # was '0 */3 * * *' — any non-:00 minute avoids the herd
# Artifacts at default retention (applies to: Issue triage (Linux), Issue triage (macOS), Issue triage (Windows))
- uses: actions/upload-artifact@v4
with:
name: build
path: dist/
retention-days: 7Each snippet is representative. Merge into the named workflow files rather than pasting wholesale.
This scorecard is a one-time snapshot. Install the free GitHub App to track this repo continuously: new regressions caught as they land, trends over time, on your public and private repos. Team adds the offending commit on the PR + Slack alerts.
Install & monitor this repo →💬 On Team, every PR gets an automatic comment when its CI run fails or runs slow, right where your team already looks. See plans →
Not ready to install? Get this report by email. No spam, unsubscribe anytime.