
ã«ããã·ã®ã½ããã¦ã§ã¢ã¨ã³ã¸ãã¢isanaã§ãã ã«ããã·ã¬ãã¼ãã®éçºã«æºãã£ã¦ãã¾ãã
ç§ãã¡ã®ãã¼ã ã§ã¯ãWebã¢ããªã±ã¼ã·ã§ã³ã®å質æ ä¿ã®ãããPlaywrightãç¨ãããã©ã¦ã¶ãã¹ããå®è£ ããGitHub Actionsã§å®è¡ãã¦ãã¾ãããããããã®CIããã»ã¹ã«ããã¦ããã¤ãã®èª²é¡ãããã¾ããã
仿¹ãã½ããã¦ã§ã¢éçºã«ããã¦ã¯æ¥ã å¯ããããVoCã«å¯¾å¿ããããæ°æ©è½ã®éçºãè¡ããªãã§ãè² åµã課é¡ã䏿ããã³ããªã³ã°ãã¦ããå¿ è¦ãããã¾ãã
æ¬ç¨¿ã§ã¯ãCIããã»ã¹ã«ããã課é¡ãã³ã¹ããã解決ããããã®æ¹åçã¨ããã®éç¨ã§ééãããããã£ããã¤ã³ããã«ã¤ãã¦ãå ·ä½çãªè¨å®ä¾ã交ããªãããç´¹ä»ãã¾ãã
PlaywrightãGitHub Actionsãå©ç¨ãã¦ããéçºè ã®æ¹ã ã«ã¨ã£ã¦ãå°ãã§ãåèã«ãªãã°å¹¸ãã§ãã
åæã¨ãªãç°å¢
æ¬ç¨¿ã§ç´¹ä»ããäºä¾ã¯ã以ä¸ã®ç°å¢ãåæã¨ãã¦ãã¾ãã
- ãã¹ããã¬ã¼ã ã¯ã¼ã¯: Playwright v1.52.0
- CI/CDãã©ãããã©ã¼ã : GitHub Actions
- ããã±ã¼ã¸ããã¼ã¸ã£ã¼: pnpm
ç´é¢ãã¦ãã課é¡ã¨ãã®å½±é¿
åé ã§ã触ãã¾ããããç§ãã¡ã®ãã¼ã ãæ±ãã¦ããCIã®èª²é¡ã¯ä¸»ã«ä»¥ä¸ã®2ç¹ã§ãã
ã¿ã¤ã ã¢ã¦ãããã¾ã§å®è¡ãã¤ã¥ãã¦ããjobããã£ã
ä½ããã®ä¸å ·åã«ãã£ã¦Playwrightã®ãã¹ãããã³ã°ããã¨ããCIã®jobãfailããã«ã¿ã¤ã ã¢ã¦ããã¦ãã¾ããã
GitHub Actionsã®ããã©ã«ãã¿ã¤ã ã¢ã¦ãã¯360åã¨ãªã£ã¦ãããjobããã³ã°ãã¦ãããã¨ã«æ°ã¥ããªãã¨CIã®å¾ ã¡æéãçºçããã ãã§ãªããGitHub Actionsã®ãªã½ã¼ã¹ãç¡é§ã«æ¶è²»ãã¦ãã¾ããä¸è¦ãªã³ã¹ããæ¯æã£ã¦ãã¾ããã
CIã®å®è¡æéãé·ãï¼ç´15åï¼
ãã¹ããå ¨ã¦æ£å¸¸ã«å®äºããå ´åã§ããå ¨ä½ã®å®è¡ã«15åç¨åº¦ããã£ã¦ãã¾ããã
ããã¯ããã«ãªã¯ã¨ã¹ããåºãã¦ãããã£ã¼ãããã¯ãå¾ãã¾ã§ã®å¾ ã¡æéã¨ãã¦ã¯é·ããéçºä½é¨ãæããä¸å ã¨ãªã£ã¦ãã¾ããã
æ¹åã«ãããéè¦ãããã¤ã³ã
ãããã®èª²é¡ã解決ããã«ãããã以ä¸ã®2ç¹ãç¹ã«éè¦ãã¾ããã
1. CIã«ããããã¹ãå®è¡æéã®ç®æ¨è¨å®
ãã¿ããã«é«éåãç®æãã®ã§ã¯ãªããæç¢ºãªç®æ¨ãæã¤ãã¨ãéè¦ã ã¨èãã¾ããã
ããã§åèã«ããã®ããDevOps Research and Assessment (DORA) ãæå±ããææ¨ã§ãã
DORAã«ããã¨ããèªåãã¹ãã®å¾ ã¡æéã¯10å以å ãæã¾ãããã¨ããã¦ãã¾ãã
The tests should not take more than a few minutes to run, with an upper limit of about 10 minutes according to DORAâs research . åºå ¸: DORA | Capabilities: Continuous Integration
ãã®ã10å以å ãã¨ããå ·ä½çãªåºæºããã£ããã¨ã§ãé度æ¹åã®ã´ã¼ã«ãæç¢ºã«ãªããåãçµã¿ããããªãã¾ããã
2. ã¯ãªãã£ã«ã«ãã¹ã®æ¹å
CIãã¤ãã©ã¤ã³ã¯è¤æ°ã®jobã§æ§æããã¦ããã並åå®è¡ãçµã¿åããã¦æ§ç¯ããã¦ãããã¨ãä¸è¬çã§ãã
å ¨ä½ã®å¾ ã¡æéãç縮ããããã«ã¯ãå ¨ã¦ã®jobãåçã«å°ããã¤é«éåããããããæãæéã®ããã£ã¦ããjobï¼ã¯ãªãã£ã«ã«ãã¹ï¼ãç¹å®ããéä¸çã«æ¹åããæ¹ã广çã§ãã
ä»åã¯ä¸¦åå®è¡ãã¦ãããã©ã¦ã¶ãã¹ãã®ä¸ã§ãæãå®è¡ã«æéãããã£ã¦ããã¯ãªãã£ã«ãã¹ã«å¯¾ãã¦æ¹åãè¡ãã¾ããã
å ·ä½çã«åãçµãã æ¹åç
ä¸è¨ã®èª²é¡ã¨éè¦ãããã¤ã³ããè¸ã¾ãã以ä¸ã®æ¹åçã宿½ãã¾ããã
1. jobã®ã¿ã¤ã ã¢ã¦ãè¨å®
ã¾ãããã¹ãããã³ã°ã¢ããããéã«CIãªã½ã¼ã¹ãç¡é§ã«æ¶è²»ãç¶ããªãããã«ãjobã«é©åãªã¿ã¤ã ã¢ã¦ãå¤ãè¨å®ãã¾ãããGitHub Actionsã§ã¯ãã¯ã¼ã¯ããã¼ãã¡ã¤ã«å
ã§ timeout-minutes ãæå®ãããã¨ã§ãjobã®æå¤§å®è¡æéãå¶å¾¡ã§ãã¾ãã
# .github/workflows/ci.yml
jobs:
playwright-tests:
runs-on: ubuntu-latest
timeout-minutes: 20 # ä¾ãã°20åã§ã¿ã¤ã ã¢ã¦ãããã
steps:
# ... ãã¹ãå®è¡ã¹ããã ...
ããã«ãããä¸ãä¸ãã¹ãããã³ã°ãã¦ããè¨å®ããæéã§èªåçã«jobã忢ããæ©æã«åé¡ãæ¤ç¥ã§ããããã«ãªãã¾ããã
2. ãã£ãã·ã¥ã®æ´»ç¨
ä¸è¬è«ã¨ãã¦ãCI/CDã®æé©åã«ãããã¾ãæ¤è¨ããã¹ããã¤ã³ãã¯ãã£ãã·ã¥ã®å©ç¨ã§ãã
CI/CDããã«ããã¯ã®ææ¡ã¨ãã®å 㸠| ãã¯ã»ã«
a. node_modules ã®ãã£ãã·ã¥
node.jsã®ã»ããã¢ããã«å©ç¨ããå®çªã¢ã¯ã·ã§ã³ã§ããsetup-nodeã¯node_modulesã®cacheãé è½ãã¦ãããã®ã§ãããå©ç¨ãã¾ãã
ä¸è¨ã®ããã«with.cacheã«pnpmãæå®ããã ãã§OKã§ãã
# .github/workflows/ci.yml (ä¸é¨æç²) jobs: playwright-test: runs-on: ubuntu-latest timeout-minutes: 60 steps: - uses: actions/[email protected] - name: Setup pnpm uses: pnpm/[email protected] with: version: 10 - uses: actions/[email protected] with: node-version-file: 'package.json' cache: 'pnpm'
pnpm installã®å®è¡æéã¯ãå
¨ä½ã®å®è¡æéã«å¯¾ãã¦å¾®ã
ãããã®ã§ãããä¸è¿°ã®éãæ¥µãã¦ç°¡åã«å©ç¨ã§ãããããè¨å®ãã¦ããã¦æã¯ãªãã§ãã
b. Playwrightãä¾åãã¦ãããã©ã¦ã¶ã®ãã£ãã·ã¥
Playwrightã¯ãã¹ãå®è¡æã«å¯¾å¿ãããã©ã¦ã¶ï¼Chromium, Firefox, WebKitãªã©ï¼ããã¦ã³ãã¼ãã»ã¤ã³ã¹ãã¼ã«ãã¾ããããããã£ãã·ã¥ãããã¨ã§jobã®å®è¡æéãç縮ã§ãã¾ãã
ããã§ããã£ãã·ã¥ã®è©±ã«å ¥ãåã«ãPlaywrightã®ä¾åé¢ä¿ã«ã¤ãã¦ãããããã¾ãã
Playwrightã«ã¯ãPlaywrightèªèº«ã®å®è¡ã«å¿
è¦ãªä¾åã©ã¤ãã©ãªã¨ãã¹ãã®å®è¡ã«å©ç¨ããä¾åãã©ã¦ã¶ãããã¾ãã
ä¾åã©ã¤ãã©ãªã¯ããã±ã¼ã¸ããã¼ã¸ã£ãå©ç¨ãã¦æå®ã®ãã¹ã«ã¤ã³ã¹ãã¼ã«ããã¾ãã
䏿¹ãä¾åãã©ã¦ã¶ã¯~/.cache/ms-playwrightã«ã¤ã³ã¹ãã¼ã«ããã¾ãã
Managing browser binaries | Playwright
ãã®ãã£ã¬ã¯ããªããã£ãã·ã¥ãããã¨ã§ãä¾åãã©ã¦ã¶ãã¤ã³ã¹ãã¼ã«ããstepãã¹ããããããã¨ãã§ãã¾ãã
ä¾åãã©ã¦ã¶ããã£ãã·ã¥ãã¤ã¤ãä¾åã©ã¤ãã©ãªãã¤ã³ã¹ãã¼ã«ããã¢ããã¼ãã¨ãã¦ãæ¬ç¨¿ã§ã¯ä»¥ä¸2ã¤ã®ã³ãã³ããçµã¿åããã¢ããã¼ãããç´¹ä»ãã¾ãã
playwright install --with-depsï¼Playwrightã®ä¾åã©ã¤ãã©ãªã¨ä¾åãã©ã¦ã¶ãã¤ã³ã¹ãã¼ã«ããplaywright install install-depsï¼ Playwrightã®ä¾åã©ã¤ãã©ãªã®ã¿ã¤ã³ã¹ãã¼ã«ãã
ãã®ã¢ããã¼ãã§ã¯ä¸è¨ã®ããã«ãä¾åãã©ã¦ã¶ããã£ãã·ã¥ãããããã¨ãã¯ä¾åã©ã¤ãã©ãªã®ã¿ãã¤ã³ã¹ãã¼ã«ããä¾åãã©ã¦ã¶ãcacheãããããªãã£ãã¨ãã¯ä¾åã©ã¤ãã©ãªã¨ä¾åãã©ã¦ã¶ã®ä¸¡æ¹ãã¤ã³ã¹ãã¼ã«ããããã«ãªã£ã¦ãã¾ãã
jobs: playwright-test: runs-on: ubuntu-latest timeout-minutes: 20 steps: # ....node, pnpm, node_modulesã®setup.... - name: Get installed Playwright version # playwrightã®ãã¼ã¸ã§ã³ãæ§ãã id: playwright-version run: echo "version=$(pnpm exec playwright --version | grep -oE '[0-9]+\\.[0-9]+\\.[0-9]+')" >> $GITHUB_OUTPUT - name: Cache Playwright Browsers # Playwrightã®ãã¼ã¸ã§ã³ãkeyã«ä¾åãã©ã¦ã¶ãcache uses: actions/[email protected] id: playwright-cache with: path: ~/.cache/ms-playwright key: '${{ runner.os }}-playwright-${{ steps.playwright-version.outputs.version }}' restore-keys: ${{ runner.os }}-playwright- - name: Install Playwright Browsers # cacheããªãæã¯ä¾åãã©ã¦ã¶ã¨ä¾åã©ã¤ãã©ãªã両æ¹ã¤ã³ã¹ãã¼ã« if: steps.playwright-cache.outputs.cache-hit != 'true' run: pnpm exec playwright install --with-deps - name: Install Playwright system dependencies # cacheãããæã¯ä¾åã©ã¤ãã©ãªã®ã¿ã¤ã³ã¹ãã¼ã« if: steps.playwright-cache.outputs.cache-hit == 'true' run: pnpm exec playwright install-deps # ....ãã¹ãå®è¡....
4. ã¯ãªãã£ã«ã«ãã¹ã«ã®ã¿large runnerãå©ç¨
ä»åæ¹åãè¡ã£ãããã¸ã§ã¯ãã§ã¯ãDesktop ChromeãMobile Chrome (Android)ãMobile Safari (iOS) ã®3ã¤ã®ãã©ã¦ã¶ç°å¢ã«å¯¾ãããã¹ãã並åå®è¡ãã¦ãã¾ããã
ãã®ä¸ã§ãç¹ã«Mobile Safari ã§ã®ãã¹ããæãæéãããã£ã¦ãããå ¨ä½ã®ã¯ãªãã£ã«ã«ãã¹ã¨ãªã£ã¦ãã¾ããã
ãã£ãã·ã¥ãæ´»ç¨ããã ãã§ã¯Mobile Safariã§ã®ãã¹ãã«ããã¦ãç®æ¨ã®10åãåããã¨ãåºæ¥ãªãã£ããããæ´ãªãæ¹åãå¿ è¦ã§ããã
ããã§ãReactã®ã¬ã³ããªã³ã°ãæé©åãããã¨ã§ãã©ã¦ã¶ãã¹ããé«éåããã¢ããã¼ããæ¤è¨ãã¾ããã
ããããä»åã®å¯¾å¿ã®ã¹ã³ã¼ãå ã§ã¬ã³ããªã³ã°ã®ããã©ã¼ãã³ã¹æ¹åã宿½ããã®ã¯é£æåº¦ãé«ãã¨å¤æã諦ãããã¨ã«ãã¾ããã
ããã§ãMobile Safariã®ãã¹ãã®ã¿ãæ¨æºã®ã©ã³ãã¼ããã髿§è½ãª GitHub-hosted large runner (Ubuntu 8-core) ãå©ç¨ãããã¨ã«ãã¾ããã
About larger runners - GitHub Docs
# .github/workflows/ci.yml (ä¸é¨æç²) jobs: test-mobile-safari: runs-on: ubuntu-8-core # mobile safariã®ãã¹ãã®ã¿large runnerãæå® timeout-minutes: 20 steps: # ... WebKitç¨ã®ãã¹ãå®è¡ã¹ããã ... test-chrome: runs-on: ubuntu-latest # Chromeã¯æ¨æºã©ã³ãã¼ timeout-minutes: 20 steps: # ... Chromeç¨ã®ãã¹ãå®è¡ã¹ããã ...
ä»ã®ãã©ã¦ã¶ãã¹ãã¯æ¨æºã©ã³ãã¼ã®ã¾ã¾ã¨ããã¯ãªãã£ã«ã«ãã¹ã¨ãªã£ã¦ããé¨åã«éå®ãã¦é«æ§è½ãªãªã½ã¼ã¹ãå²ãå½ã¦ããã¨ã§ãã³ã¹ããæãã¤ã¤å ¨ä½ã®å®è¡æéç縮ãå³ãã¾ããã
å°ãGitHub-hosted large runnerãå©ç¨ããéã¯ãä¸è¨ã®ãããªjobã®è¨å®ã«å ãã¦ãæå±ããorganizationã¸ã®ç»é²ãå¿ è¦ã«ãªãã¾ãã
Managing larger runners - GitHub Docs
ããã£ããã¤ã³ãã¨ãã®è§£æ±ºç
large runnerãèµ·åãããjobãã¹ã¿ã¼ãããªã
large runnerãorganizationã«è¿½å ããä¸è¨ã®ããã«è¨å®ããã«ããããããã該å½ã®job (test-mobile-safari) ããã¥ã¼ã«å
¥ã£ãã¾ã¾å®è¡ãããªãç¶æ
ã«é¥ãã¾ããã
Requested labels: ubuntu-8-core Job defined at: xxxxxxxx Waiting for a runner to pick up this job...
åå ã調æ»ããã¨ãããorganizationã«ç»é²ããGitHub-hosted runnerã®è¨å®é ç®Maximum Job Concurrencyã®å¤ãã1ãã«è¨å®ããã¦ããããã§ããã
ããã¯ãorganizationã«ç»é²ããrunnerãåæã«å®è¡ã§ããjobæ°ã®è¨å®ã§ãã
ãããã©ã³ãã®jobã§ç»é²ããrunnerãå®è¡ãã¦ããã¨ããå¥ã®ãã©ã³ãã§åãrunnerãæå®ããjobã¯å ¨ã¦å¾ æ©ç¶æ ã«ãªã£ã¦ãã¾ããã
Maximum Job Concurrencyã®å¤ããæå¤§å¤ã§ãã1000ã«å¤æ´ãããã¨ã§ãã®åé¡ã解決ãããã¨ãã§ãã¾ããã
ãã®è¨å®é ç®ã«ã¤ãã¦ã¯ãGitHubã®ä»¥ä¸ã®ããã¥ã¡ã³ãã§è§£èª¬ããã¦ãã¾ãã
Managing larger runners - Configuring autoscaling for larger runners (å ¬å¼ããã¥ã¡ã³ã)
ããlarge runnerã®å©ç¨ã§åæ§ã®åé¡ã«ç´é¢ããå ´åã¯ããã®è¨å®ã確èªãã¦ã¿ã¦ãã ããã
ã¾ã¨ã
æ¬ç¨¿ã§ã¯ãPlaywrightã¨GitHub Actionsãç¨ãããã©ã¦ã¶ãã¹ãã®CIã«ããã¦ããµã¯ãã¨ã§ããæ¹ä¿®ã§å¾ ã¡æéã10åã«åããããã«ããäºä¾ããç´¹ä»ãã¾ããã
- jobã®ã¿ã¤ã ã¢ã¦ãè¨å®ããããã¨ã§jobã®ã¿ã¤ã ã¢ã¦ãã«ããç¡é§ãªãªã½ã¼ã¹æ¶è²»ãæãããã¨ãåºæ¥ã
node_modulesã¨Playwrightãã©ã¦ã¶ã®ãã£ãã·ã¥ãå©ç¨ããlarge runnerãã¯ãªãã£ã«ã«ãã¹ã«æå ¥ãããããã¨ã§ãã©ã¦ã¶ãã¹ãã®å¾ ã¡æéãç´15åãã7~9å以å ã«ç縮ã§ãã
Playwrightã«ãããã©ã¦ã¶ãã¹ããæ ¹æ¬çã«æ©ãããããã®ä½æ¥æéã確ä¿ããã®ã¯é£ããã§ãããã¿ã¤ã ã¢ã¦ãããã£ãã·ã¥ãã¹ã±ã¼ã«ã¢ãããã¯ãªãã£ã«ã«ãã¹ã«å¯¾ãã¦ãã¾ãæ´»ç¨ãããã¨ã§ã³ã¹ãè¯ãæ¹åãããã¨ãã§ãã¾ãã
ã¡ãã£ã¨ããæ¹åã§ãéçºä½é¨ãè¯ããããã¨ãã§ããã®ã§ããããã£ãç©ã¿éããç¶ç¶ãã¦ããããã§ãã
PlaywrightãGitHub Actionsãå©ç¨ãã¦CIã®èª²é¡ã«ç´é¢ãã¦ããæ¹ã«ã¨ã£ã¦ãæ¬ç¨¿ãå°ãã§ããå½¹ã«ç«ã¦ãã°å¹¸ãã§ãã
æå¾ã«å®£ä¼ã§ãð£
ã«ããã·ã§ã¯ã½ããã¦ã§ã¢ã¨ã³ã¸ãã¢ãåéãã¦ãã¾ãã
ãããã¯ãéçºã®åããçç£æ§ã®æ¹åãè² åµã®è¿æ¸ã«ã妥åãªãåãçµã¿ããæ¹ãæ¯éä¸ç·ã«åãã¾ãããï¼