Wiki

← Tất cả bài wiki

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ặn test.only só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-deps chỉ 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> (vd v1.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ự set CI=true — config Playwright và code test tự rẽ nhánh theo nó.
  • Sharding: npx playwright test --shard=1/4 chia suite thành 4 phần — kết hợp matrix job chạy song song, gộp report bằng npx 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-artifact với if: 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ộ tag v1.49.0 với package.json.
  • npm ci thay npm install trê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: baseURL staging, 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ùng latest; tag không distro (vd v1.49.0) mặc định distro base mới nhất nhưng vẫn nên ghi rõ.
  • --with-deps cần apt + root: trong image chính thức deps đã có → chỉ cần playwright install hoặ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, slowMo không có ý nghĩa trên runner không màn hình — debug bằng trace/video/screenshot.
  • --ipc=host hoặc --shm-size: Chromium trong docker hay crash Target closed vì /dev/shm 64MB mặc định — phải tăng shm hoặc dùng ipc=host.
  • Workers & user trên runner: config mẫu set workers: 1 trên CI cho ổn định — runner mạnh có thể tăng workers: 2~4; và nhớ browsers cài vào ~/.cache/ms-playwright của ĐÚNG user chạy job (self-hosted runner cài bằng user khác là không thấy).