Chạy Playwright trên CI/CD & Docker (GitHub Actions, image chính thức)
automationplaywright
Playwright có sẵn Docker image mcr.microsoft.com/playwright cài đủ browsers + system deps, và config mặc định đã có nhánh CI (forbidOnly, retries, workers). Trên CI cần playwright install --with-deps (hoặc chạy trong image), cache thư mục browsers ~/.cache/ms-playwright, và upload HTML report làm artifact.
Khái niệm & Bản chất
- Config mẫu đã có nhánh CI:
forbidOnly: !!process.env.CI(chặntest.onlysót lên CI),retries: process.env.CI ? 2 : 0,workers: process.env.CI ? 1 : undefined— CI chạy conservatively hơn local. npx playwright install --with-deps: cài browsers + OS dependencies (apt) —--with-depschỉ chạy được trên Ubuntu/Debian và cần quyền root/sudo.- Browsers nằm ở
~/.cache/ms-playwright: cache thư mục này giữa các CI run để khỏi tải lại ~400MB mỗi lần. - Docker image chính thức:
mcr.microsoft.com/playwright:<version>-<distro>(vdv1.49.0-noble) — mỗi release Playwright có image tag tương ứng, browsers + deps cài sẵn → CI không cần bước install. - Reporter phù hợp CI:
html(mở sau),junit(nhúng vào test result viewer của CI),blob(merge khi sharding),github(annotate lỗi lên PR diff).
Cách hoạt động & API chính
process.env.CI: GitHub Actions/GitLab/Jenkins tự setCI=true— config Playwright và code test tự rẽ nhánh theo nó.- Sharding:
npx playwright test --shard=1/4chia suite thành 4 phần — kết hợp matrix job chạy song song, gộp report bằngnpx playwright merge-reports --reporter html ./blob-reports. - Trace/video trên CI:
trace: 'on-first-retry',video: 'retain-on-failure'— chỉ ghi khi retry/fail để tiết kiệm artifact. - Upload artifact:
actions/upload-artifactvớiif: always()— report phải up kể cả test fail. - Container job: GitHub Actions hỗ trợ
container: image:— chạy toàn bộ job trong image Playwright, bỏ hẳn bước install.
Ví dụ & Cú pháp thực tế
- GitHub Actions đầy đủ:
``
yaml # .github/workflows/playwright.yml name: Playwright Tests on: [push, pull_request] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: { node-version: 22, cache: 'npm' } - run: npm ci - name: Cache browsers uses: actions/cache@v4 with: path: ~/.cache/ms-playwright key: pw-${{ runner.os }}-${{ hashFiles('package-lock.json') }} - name: Install browsers + OS deps run: npx playwright install --with-deps - run: npx playwright test - uses: actions/upload-artifact@v4 if: always() with: name: playwright-report path: playwright-report/ retention-days: 14`` - Chạy trong container image chính thức — bỏ bước install:
``
yaml jobs: test: runs-on: ubuntu-latest container: image: mcr.microsoft.com/playwright:v1.49.0-noble steps: - uses: actions/checkout@v4 - run: npm ci - run: npx playwright test`` - Sharding với matrix + merge report:
``
yaml strategy: matrix: shard: [1, 2, 3, 4] steps: - run: npx playwright test --shard=${{ matrix.shard }}/4 --reporter=blob # job merge riêng: npx playwright merge-reports --reporter html ./all-blobs`` - Docker local / self-hosted:
``
bash docker run --rm --ipc=host \ -v $(pwd):/work -w /work \ mcr.microsoft.com/playwright:v1.49.0-noble \ npx playwright test # --ipc=host: tránh Chromium crash vì /dev/shm quá nhỏ trong container``
Best practices & Khi nào dùng
- Ghim tag image = version
@playwright/test: lệch version → lỗi 'Executable doesn't exist' ngay khi launch — đồng bộ tagv1.49.0với package.json. npm cithaynpm installtrên CI: cài đúng lockfile — version Playwright khác nhau giữa local/CI là nguồn flake khó đuổi.- Bật retry + trace trên CI:
retries: 2,trace: 'on-first-retry'— test flake có cơ hội pass lại VÀ lưu trace để điều tra. - Shard khi suite nặng: vài trăm test →
--shard+ matrix runner cắt thời gian CI từ 40p xuống 10p; nhớ job merge-report phía sau. - Secrets qua env, không vào config:
baseURLstaging, tài khoản test —env: { BASE_URL: ${{ secrets.STAGING_URL }} }— repo không chứa credential.
Gotchas, So sánh & Lưu ý
- Cache key phải chứa lockfile: cache browsers theo
hashFiles('package-lock.json')— nâng version Playwright mà cache cũ → thiếu browser mới → fail. - Tag distro:
-noble= Ubuntu 24.04,-jammy= 22.04 — đừng dùnglatest; tag không distro (vdv1.49.0) mặc định distro base mới nhất nhưng vẫn nên ghi rõ. --with-depscần apt + root: trong image chính thức deps đã có → chỉ cầnplaywright installhoặc bỏ hẳn; trên runner thuần phải có sudo (GitHub ubuntu-latest có sẵn).- Headless là bắt buộc trên CI:
headed: true,slowMokhông có ý nghĩa trên runner không màn hình — debug bằng trace/video/screenshot. --ipc=hosthoặc--shm-size: Chromium trong docker hay crashTarget closedvì/dev/shm64MB mặc định — phải tăng shm hoặc dùng ipc=host.- Workers & user trên runner: config mẫu set
workers: 1trên CI cho ổn định — runner mạnh có thể tăngworkers: 2~4; và nhớ browsers cài vào~/.cache/ms-playwrightcủa ĐÚNG user chạy job (self-hosted runner cài bằng user khác là không thấy).
