Files
eleith 66d9f94216
ci/woodpecker/pr/build-dane-verify Pipeline was successful
ci/woodpecker/pr/build-porkbun-ddns Pipeline was successful
ci/woodpecker/push/build-dane-verify Pipeline was successful
ci/woodpecker/push/build-hledger Pipeline was successful
ci/woodpecker/push/build-nvim Pipeline was successful
ci/woodpecker/push/build-playwright Pipeline was successful
ci/woodpecker/push/build-porkbun-ddns Pipeline was successful
Align CI tags, PR checks, and docs
2026-10-24 08:56:01 -07:00

90 lines
3.0 KiB
Markdown

# 🎭 playwright
Microsoft's Playwright image with Node upgraded to 26.
The official `mcr.microsoft.com/playwright` images ship **Node 24** in every variant
(noble, jammy and resolute alike). That is fine for running the Playwright test runner,
but not for serving an app that needs a newer runtime — anything relying on the native
`Temporal` API, for example, throws `Temporal is not defined` on Node 24.
This image keeps the browsers and system libraries from the official image and replaces
Node with 26, so a single container can both serve the app under test and drive the
browser. No browser downloads at pipeline run time.
## 🛠 Usage
### Woodpecker CI
```yaml
steps:
e2e:
image: git.eleith.com/eleith.private/playwright:1.61.1-node26
commands:
- pnpm install --frozen-lockfile
- pnpm build:packages
- cd apps/web && pnpm run test:e2e
```
### Docker
```bash
docker run --rm -v "${PWD}":/app -w /app \
git.eleith.com/eleith.private/playwright:1.61.1-node26 \
pnpm run test:e2e
```
## ✅ Verifying a build
```bash
docker build -t playwright:test .
docker run --rm playwright:test node --version # v26.x
docker run --rm playwright:test ls /ms-playwright # chromium_headless_shell-1228
docker run --rm playwright:test node -e "Temporal.Now.instant()"
```
The last one is the point of the image: it throws `ReferenceError` on the stock Node 24
base. The Dockerfile's closing `RUN node --version && pnpm --version` fails the build if
the runtime was not replaced, so a green build already covers most of this.
## 🏷 Tags
Releases are tagged `playwright/vX.Y.Z`, which publishes the semver tags plus a
descriptive one naming what is inside:
```
1 1.0 1.0.0 1.61.1-node26
```
The descriptive tag comes from the Dockerfile.
See [Releases](../docs/releases.md) for `latest` and publishing.
## ⚠️ Version pairing
Playwright refuses to run when the browsers on disk do not match the version of
`@playwright/test` the project installs — it fails with
`Executable doesn't exist at /ms-playwright/chromium_headless_shell-NNNN`.
The base image tag and the project's `@playwright/test` **must be bumped together**:
| image tag | bundled chromium | pair with |
| --- | --- | --- |
| `v1.61.1-noble` | 1228 | `@playwright/test@1.61.1` |
To move to a new Playwright release, change the `FROM` tag here, tag a release, and bump
the dependency in the consuming project in the same change.
## ⚠️ corepack
`pnpm` is baked in via corepack at build time. Setting `COREPACK_HOME` in a pipeline step
points corepack at an empty directory, and it will re-download pnpm on every run — leave
it unset to use the bundled copy.
A project whose `packageManager` field pins a different pnpm version will also fetch that
version at run time. Rebuild with `--build-arg PNPM_VERSION=…` to bake in a different one.
## 📦 Tech Stack
- **Base:** `mcr.microsoft.com/playwright:v1.61.1-noble` (Ubuntu 24.04)
- **Browsers:** chromium, firefox and webkit at `/ms-playwright`
- **Runtime:** Node 26 (nodesource), corepack, pnpm 11.9.0