๐Ÿš€ CI/CD ํ™˜๊ฒฝ์—์„œ Playwright ๋ฌธ์ œ ํ•ด๊ฒฐํ•˜๊ธฐ: ์„ค์น˜ ์˜ค๋ฅ˜ ๋ถ„์„ ๋ฐ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ

@leekh8 ยท August 26, 2024 ยท 12 min read

Code N Solve ๐Ÿ“˜: CI/CD ํ™˜๊ฒฝ์—์„œ Playwright ๋ฌธ์ œ ํ•ด๊ฒฐํ•˜๊ธฐ: ์„ค์น˜ ์˜ค๋ฅ˜ ๋ถ„์„ ๋ฐ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ

Gatsby๋ฅผ ์‚ฌ์šฉํ•ด ๋ธ”๋กœ๊ทธ๋ฅผ ๋ฐฐํฌํ•  ๋•Œ, Playwright ์„ค์น˜์™€ ๊ด€๋ จํ•ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋Š”์ง€ ๋‹จ๊ณ„๋ณ„๋กœ ์‚ดํŽด๋ณด์ž.


Playwright๋ž€? ๐ŸŽญ

Playwright2๋Š” Microsoft๊ฐ€ ๊ฐœ๋ฐœํ•œ ์˜คํ”ˆ์†Œ์Šค E2E(End-to-End) ํ…Œ์ŠคํŠธ ์ž๋™ํ™” ๋„๊ตฌ๋‹ค. Chromium, Firefox, WebKit ์„ธ ๊ฐ€์ง€ ๋ธŒ๋ผ์šฐ์ € ์—”์ง„์„ ๋‹จ์ผ API๋กœ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์–ด, ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋™์ž‘์„ ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ๊ณผ ๋™์ผํ•˜๊ฒŒ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋‹ค.

Playwright vs Selenium

๋‘ ๋„๊ตฌ ๋ชจ๋‘ ๋ธŒ๋ผ์šฐ์ € ์ž๋™ํ™” ๋ชฉ์ ์œผ๋กœ ์“ฐ์ด์ง€๋งŒ, ์„ค๊ณ„ ์ฒ ํ•™๊ณผ ์‚ฌ์šฉ ๋ฐฉ์‹์—์„œ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

ํ•ญ๋ชฉ Playwright Selenium
๊ฐœ๋ฐœ์‚ฌ Microsoft ThoughtWorks (์˜คํ”ˆ์†Œ์Šค)
๋ธŒ๋ผ์šฐ์ € ์ง€์› Chromium, Firefox, WebKit Chrome, Firefox, Safari, Edge ๋“ฑ
API ์Šคํƒ€์ผ async/await ๊ธฐ๋ฐ˜, ์ง๊ด€์  ๋ณต์žกํ•œ WebDriver ํ”„๋กœํ† ์ฝœ
์ž๋™ ๋Œ€๊ธฐ ๋‚ด์žฅ (Auto-waiting) ๋ช…์‹œ์  ๋Œ€๊ธฐ ํ•„์š”
๋„คํŠธ์›Œํฌ ๊ฐ€๋กœ์ฑ„๊ธฐ ๊ธฐ๋ณธ ์ง€์› ๋ณ„๋„ ํ”„๋ก์‹œ ํ•„์š”
๋ณ‘๋ ฌ ์‹คํ–‰ ๊ธฐ๋ณธ ์ง€์› ์„ค์ • ๋ณต์žก
์„ค์น˜ npm ํ•˜๋‚˜๋กœ ๋ธŒ๋ผ์šฐ์ € ํฌํ•จ ๋“œ๋ผ์ด๋ฒ„ ๋ณ„๋„ ์„ค์น˜ ํ•„์š”
CI/CD ํ†ตํ•ฉ ๋งค์šฐ ๊ฐ„ํŽธ ์ƒ๋Œ€์ ์œผ๋กœ ๋ณต์žก

ํŠนํžˆ Playwright๋Š” Auto-waiting ๊ธฐ๋Šฅ ๋•๋ถ„์— "์š”์†Œ๊ฐ€ ๋‚˜ํƒ€๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค๋ผ"์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค. Selenium์—์„œ๋Š” WebDriverWait์ด๋‚˜ time.sleep()์„ ์ž์ฃผ ์จ์•ผ ํ–ˆ๋˜ ๋ถ€๋ถ„์ด Playwright์—์„œ๋Š” ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค.

Playwright๊ฐ€ ์ง€์›ํ•˜๋Š” ๊ฒƒ๋“ค

  • ๋ฉ€ํ‹ฐ ๋ธŒ๋ผ์šฐ์ €: Chromium(Chrome/Edge), Firefox, WebKit(Safari)
  • ๋ฉ€ํ‹ฐ ์–ธ์–ด API: JavaScript/TypeScript, Python, Java, .NET
  • ์Šคํฌ๋ฆฐ์ƒท ๋ฐ ๋™์˜์ƒ ๋…นํ™”: ํ…Œ์ŠคํŠธ ์‹คํŒจ ์‹œ ์ž๋™ ์บก์ฒ˜
  • ๋„คํŠธ์›Œํฌ ๋ชจํ‚น: API ์‘๋‹ต์„ ๊ฐ€์งœ๋กœ ๋Œ€์ฒดํ•˜๋Š” ๊ธฐ๋Šฅ
  • ๋ชจ๋ฐ”์ผ ์—๋ฎฌ๋ ˆ์ด์…˜: ์Šค๋งˆํŠธํฐ ํ•ด์ƒ๋„ ๋ฐ User-Agent ์‹œ๋ฎฌ๋ ˆ์ด์…˜
  • ์ปดํฌ๋„ŒํŠธ ํ…Œ์ŠคํŠธ: React, Vue, Svelte ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ

CI/CD ํ™˜๊ฒฝ์—์„œ Playwright๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

1. E2E ํ…Œ์ŠคํŠธ ์ž๋™ํ™”

์ฝ”๋“œ๋ฅผ pushํ•  ๋•Œ๋งˆ๋‹ค "์‹ค์ œ ๋ธŒ๋ผ์šฐ์ €์—์„œ ํŽ˜์ด์ง€๊ฐ€ ์ œ๋Œ€๋กœ ์—ด๋ฆฌ๋Š”๊ฐ€"๋ฅผ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค. ๋‹จ์œ„ ํ…Œ์ŠคํŠธ(Unit Test)๊ฐ€ ํ•จ์ˆ˜ ํ•˜๋‚˜ํ•˜๋‚˜๋ฅผ ๊ฒ€์ฆํ•œ๋‹ค๋ฉด, E2E ํ…Œ์ŠคํŠธ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒฝํ—˜ํ•˜๋Š” ์ „์ฒด ํ๋ฆ„์„ ๊ฒ€์ฆํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋กœ๊ทธ์ธ โ†’ ๋ฐ์ดํ„ฐ ์กฐํšŒ โ†’ ๋กœ๊ทธ์•„์›ƒ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ Playwright๋กœ ์ž‘์„ฑํ•˜๋ฉด, CI ํŒŒ์ดํ”„๋ผ์ธ์ด ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค ์ด ํ๋ฆ„ ์ „์ฒด๋ฅผ ์ž๋™์œผ๋กœ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋‹ค.

2. Mermaid ๋‹ค์ด์–ด๊ทธ๋žจ ๋ Œ๋”๋ง (Gatsby/์ •์  ์‚ฌ์ดํŠธ)

Gatsby๋‚˜ Next.js ๊ธฐ๋ฐ˜ ๋ธ”๋กœ๊ทธ์—์„œ Mermaid ๋‹ค์ด์–ด๊ทธ๋žจ์„ PNG๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ Playwright๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. Mermaid๋Š” JavaScript๋กœ ๋ Œ๋”๋ง๋˜๋ฏ€๋กœ, ์„œ๋ฒ„์‚ฌ์ด๋“œ์—์„œ ์ด๋ฏธ์ง€๋กœ ๋ณ€ํ™˜ํ•˜๋ ค๋ฉด ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํ•„์š”ํ•˜๋‹ค. Playwright๊ฐ€ headless ๋ธŒ๋ผ์šฐ์ €๋กœ Mermaid๋ฅผ ๋ Œ๋”๋งํ•˜๊ณ  ์Šคํฌ๋ฆฐ์ƒท์„ ์ฐ์–ด PNG๋กœ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

3. ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ(Visual Regression Testing)

UI ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์˜๋„ํ•˜์ง€ ์•Š์€ ๋ ˆ์ด์•„์›ƒ ๊นจ์ง์„ ์œ ๋ฐœํ•˜๋Š”์ง€ ์Šคํฌ๋ฆฐ์ƒท์„ ๋น„๊ตํ•ด ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋‹ค.

CI/CD ์ „์ฒด ํ๋ฆ„

Yes
No
Yes
No
๊ฐœ๋ฐœ์ž ์ฝ”๋“œ push
GitHub Actions ํŠธ๋ฆฌ๊ฑฐ
์˜์กด์„ฑ ์„ค์น˜

npm ci
Playwright ๋ธŒ๋ผ์šฐ์ € ์„ค์น˜

npx playwright install
์บ์‹œ ์กด์žฌ?
์บ์‹œ์—์„œ ๋ธŒ๋ผ์šฐ์ € ๋กœ๋“œ
๋ธŒ๋ผ์šฐ์ € ๋‹ค์šด๋กœ๋“œ
E2E ํ…Œ์ŠคํŠธ ์‹คํ–‰
ํ…Œ์ŠคํŠธ ํ†ต๊ณผ?
๋นŒ๋“œ ๋ฐ ๋ฐฐํฌ
์‹คํŒจ ์•Œ๋ฆผ

์Šคํฌ๋ฆฐ์ƒท ์ฒจ๋ถ€


๋ฐœ์ƒ ๊ฐ€๋Šฅํ•œ ์˜ค๋ฅ˜ ์œ ํ˜• ์ „์ฒด ์ •๋ฆฌ

์˜ค๋ฅ˜ 1: browserType.launch: Executable doesn't exist (๊ธฐ๋ณธ ๊ฒฝ๋กœ ๋ฌธ์ œ)

๊ฐ€์žฅ ํ”ํ•˜๊ฒŒ ๋งˆ์ฃผ์น˜๋Š” ์˜ค๋ฅ˜๋‹ค.1

Error: Failed to launch chromium because executable doesn't exist

browserType.launch: Executable doesn't exist at /home/runner/.cache/ms-playwright/chromium-1124/chrome-linux/chrome

Error: browserType.launch: Executable doesn't exist at /home/runner/.cache/ms-playwright/chromium-1124/chrome-linux/chrome

์›์ธ

  • npm ci๋กœ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•  ๋•Œ Playwright ํŒจํ‚ค์ง€ ์ž์ฒด๋Š” ์„ค์น˜๋˜์ง€๋งŒ, ๋ธŒ๋ผ์šฐ์ € ๋ฐ”์ด๋„ˆ๋ฆฌ๋Š” ๋ณ„๋„๋กœ ์„ค์น˜ํ•ด์•ผ ํ•œ๋‹ค.
  • npx playwright install์„ ์‹คํ–‰ํ•˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜, ์‹คํ–‰ํ–ˆ๋”๋ผ๋„ ์„ค์น˜ ๊ฒฝ๋กœ๊ฐ€ ๋‹ฌ๋ผ ์‹คํ–‰ ์‹œ์ ์— ์ฐพ์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐœ์ƒํ•œ๋‹ค.
  • ๊ถŒํ•œ ๋ฌธ์ œ: ๊ธฐ๋ณธ ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ์“ฐ๊ธฐ ๊ถŒํ•œ์ด ์—†๋Š” ๊ฒฝ์šฐ.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์„ค์น˜ ๊ฒฝ๋กœ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•œ๋‹ค.

- name: Set Playwright Browsers Path
  run: echo "PLAYWRIGHT_BROWSERS_PATH=$HOME/.cache/ms-playwright" >> $GITHUB_ENV

- name: Check Playwright Browsers Path
  run: echo "Playwright Browsers Path ---> ${{ env.PLAYWRIGHT_BROWSERS_PATH }}"

- name: Install Playwright Browsers
  run: npx playwright install --with-deps chromium

--with-deps ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ € ์‹คํ–‰์— ํ•„์š”ํ•œ ์‹œ์Šคํ…œ ์˜์กด์„ฑ(libglib, libgtk ๋“ฑ)๋„ ํ•จ๊ป˜ ์„ค์น˜๋œ๋‹ค.


์˜ค๋ฅ˜ 2: ๋ฒ„์ „ ๋ถˆ์ผ์น˜ ์˜ค๋ฅ˜ (playwright vs playwright-core)

Error: browserType.launch:
โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
โ•‘ Looks like Playwright Test or Playwright was just updated to 1.40.0. โ•‘
โ•‘ Please update docker image or install new browsers:                   โ•‘
โ•‘                                                                       โ•‘
โ•‘   npx playwright install                                              โ•‘
โ•‘                                                                       โ•‘
โ•‘ <3 Playwright Team                                                    โ•‘
โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

์›์ธ

playwright์™€ playwright-core๋Š” ๋ณ„๊ฐœ์˜ npm ํŒจํ‚ค์ง€๋‹ค. ์–ด๋–ค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ playwright-core๋ฅผ ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ๊ทธ ๋ฒ„์ „์ด ์ง์ ‘ ์„ค์น˜ํ•œ playwright ๋ฒ„์ „๊ณผ ๋‹ค๋ฅผ ๊ฒฝ์šฐ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•œ๋‹ค.

  • playwright: ๋ธŒ๋ผ์šฐ์ € ๋ฐ”์ด๋„ˆ๋ฆฌ ํฌํ•จ + ํ…Œ์ŠคํŠธ ๋Ÿฌ๋„ˆ ํฌํ•จ
  • playwright-core: ๋ธŒ๋ผ์šฐ์ € ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฏธํฌํ•จ (๋ณ„๋„ ์„ค์น˜ ํ•„์š”)
node_modules/
  playwright/          # ๋ฒ„์ „ 1.40.0
  playwright-core/     # ๋ฒ„์ „ 1.38.0  โ† ๋ฒ„์ „ ๋ถˆ์ผ์น˜!

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

package.json์—์„œ ๋ฒ„์ „์„ ํ†ต์ผํ•œ๋‹ค.

{
  "dependencies": {
    "playwright": "1.40.0",
    "playwright-core": "1.40.0"
  }
}

๋˜๋Š” npm ls playwright-core๋กœ ์–ด๋–ค ํŒจํ‚ค์ง€๊ฐ€ ์˜์กดํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•œ ๋’ค ํ•ด๋‹น ํŒจํ‚ค์ง€๋„ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.

npm ls playwright-core
# ์ถœ๋ ฅ ์˜ˆ์‹œ:
# my-project@1.0.0
# โ””โ”€โ”€ @playwright/test@1.38.0
#     โ””โ”€โ”€ playwright-core@1.38.0

์˜ค๋ฅ˜ 3: ์˜์กด์„ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ˆ„๋ฝ ์˜ค๋ฅ˜

Error: Failed to launch chromium because executable doesn't exist at ...
โ•”โ• Tip: Run playwright install --with-deps to install missing browsers and dependencies. โ•—
โ•‘ Missing libraries:                                                                     โ•‘
โ•‘   libgtk-3.so.0: not found                                                            โ•‘
โ•‘   libnss3.so: not found                                                                โ•‘
โ•‘   libnspr4.so: not found                                                               โ•‘
โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

์›์ธ

Chromium์„ ์‹คํ–‰ํ•˜๋ ค๋ฉด ์‹œ์Šคํ…œ์— ์—ฌ๋Ÿฌ ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. GitHub Actions์˜ ubuntu-latest ์ด๋ฏธ์ง€๋Š” ์ตœ์†Œ ์„ค์น˜ ์ƒํƒœ๋กœ ์‹œ์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์ด ๋น ์ ธ ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

์ฃผ์š” ํ•„์š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ:

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์šฉ๋„
libgtk-3.so.0 GTK UI ํˆดํ‚ท (Chromium UI ๋ Œ๋”๋ง)
libnss3.so Network Security Services (TLS/SSL)
libnspr4.so Netscape Portable Runtime
libasound2.so ALSA ์˜ค๋””์˜ค (headless์—์„œ๋„ ํ•„์š”)
libgbm.so.1 GPU Buffer Management

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

- name: Install Playwright with system deps
  run: npx playwright install --with-deps

--with-deps๊ฐ€ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ํ•ด๊ฒฐ์ฑ…์ด๋‹ค. ํ•„์š”ํ•œ ๋ชจ๋“  ์‹œ์Šคํ…œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ž๋™์œผ๋กœ apt-get์œผ๋กœ ์„ค์น˜ํ•ด์ค€๋‹ค.

ํŠน์ • ๋ธŒ๋ผ์šฐ์ €๋งŒ ํ•„์š”ํ•˜๋‹ค๋ฉด:

- name: Install Chromium only
  run: npx playwright install --with-deps chromium

์˜ค๋ฅ˜ 4: ์บ์‹œ ๋ฌธ์ œ๋กœ ์ธํ•œ ์˜ค๋ฅ˜

Error: browserType.launch: Browser closed unexpectedly!
TROUBLESHOOTING: https://playwright.dev/docs/troubleshooting

  at BrowserType.launch (node_modules/playwright-core/lib/server/browserType.js:90:13)

๋˜๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์‹คํ–‰์€ ๋˜์ง€๋งŒ ์ฆ‰์‹œ ํฌ๋ž˜์‹œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ.

์›์ธ

  • Playwright ๋ฒ„์ „์ด ์—…๋ฐ์ดํŠธ๋˜์—ˆ๋Š”๋ฐ, ์ด์ „ ๋ฒ„์ „์˜ ๋ธŒ๋ผ์šฐ์ € ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ์บ์‹œ์— ๋‚จ์•„ ์žˆ๋Š” ๊ฒฝ์šฐ
  • ๋‹ค์šด๋กœ๋“œ ๋„์ค‘ ๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜๋กœ ์บ์‹œ ํŒŒ์ผ์ด ์†์ƒ๋œ ๊ฒฝ์šฐ

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

์บ์‹œ ํ‚ค์— Playwright ๋ฒ„์ „์„ ํฌํ•จ์‹œ์ผœ ๋ฒ„์ „์ด ๋ฐ”๋€Œ๋ฉด ์ž๋™์œผ๋กœ ์ƒˆ๋กœ ๋ฐ›๋„๋ก ํ•œ๋‹ค.

- name: Cache Playwright browsers
  uses: actions/cache@v4
  id: playwright-cache
  with:
    path: ~/.cache/ms-playwright
    key: ${{ runner.os }}-playwright-${{ hashFiles('**/package-lock.json') }}
    restore-keys: |
      ${{ runner.os }}-playwright-

- name: Install Playwright Browsers
  if: steps.playwright-cache.outputs.cache-hit != 'true'
  run: npx playwright install --with-deps

hashFiles('**/package-lock.json')์„ ํ‚ค๋กœ ์‚ฌ์šฉํ•˜๋ฉด, package-lock.json์ด ๋ณ€๊ฒฝ๋  ๋•Œ(์ฆ‰ Playwright ๋ฒ„์ „์ด ๋ฐ”๋€” ๋•Œ)๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์บ์‹œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.


GitHub Actions ์บ์‹œ ์ „๋žต

๋งค๋ฒˆ Playwright ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ƒˆ๋กœ ๋‹ค์šด๋กœ๋“œํ•˜๋ฉด CI ์‹คํ–‰ ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง„๋‹ค. actions/cache๋ฅผ ์‚ฌ์šฉํ•ด ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์บ์‹ฑํ•˜๋ฉด ์ด๋ฅผ ํฌ๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

์บ์‹ฑ ์›๋ฆฌ

์บ์‹œ HIT
์บ์‹œ MISS
CI ์‹คํ–‰ ์‹œ์ž‘
์บ์‹œ ํ‚ค ํ™•์ธ
์บ์‹œ์—์„œ ๋ธŒ๋ผ์šฐ์ € ๋ณต์›

์•ฝ 30์ดˆ
๋ธŒ๋ผ์šฐ์ € ๋‹ค์šด๋กœ๋“œ

์•ฝ 3-5๋ถ„
์บ์‹œ ์ €์žฅ
ํ…Œ์ŠคํŠธ ์‹คํ–‰

์บ์‹œ ํšจ๊ณผ

์ƒํ™ฉ ์†Œ์š” ์‹œ๊ฐ„
์บ์‹œ ์—†์Œ (์ตœ์ดˆ ์‹คํ–‰) 3~5๋ถ„ (๋ธŒ๋ผ์šฐ์ € ๋‹ค์šด๋กœ๋“œ)
์บ์‹œ HIT 20~40์ดˆ (๋ณต์›๋งŒ)

์˜ฌ๋ฐ”๋ฅธ GitHub Actions Workflow ์ „์ฒด ์˜ˆ์ œ

name: CI - E2E Test with Playwright

on:
  push:
    branches: [main, develop]
  pull_request:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-latest
    timeout-minutes: 30

    steps:
      # 1. ์ฝ”๋“œ ์ฒดํฌ์•„์›ƒ
      - name: Checkout repository
        uses: actions/checkout@v4

      # 2. Node.js ์„ค์ •
      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'
          cache: 'npm'

      # 3. ์˜์กด์„ฑ ์„ค์น˜
      - name: Install dependencies
        run: npm ci

      # 4. Playwright ๋ธŒ๋ผ์šฐ์ € ์บ์‹œ ํ™•์ธ
      - name: Cache Playwright browsers
        uses: actions/cache@v4
        id: playwright-cache
        with:
          path: ~/.cache/ms-playwright
          key: ${{ runner.os }}-playwright-${{ hashFiles('**/package-lock.json') }}
          restore-keys: |
            ${{ runner.os }}-playwright-

      # 5. Playwright ์„ค์น˜ ๊ฒฝ๋กœ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •
      - name: Set Playwright browsers path
        run: echo "PLAYWRIGHT_BROWSERS_PATH=$HOME/.cache/ms-playwright" >> $GITHUB_ENV

      # 6. ์บ์‹œ MISS์ผ ๋•Œ๋งŒ ๋ธŒ๋ผ์šฐ์ € ์„ค์น˜
      - name: Install Playwright Browsers
        if: steps.playwright-cache.outputs.cache-hit != 'true'
        run: npx playwright install --with-deps chromium

      # 7. ์„ค์น˜ ๊ฒฝ๋กœ ๊ฒ€์ฆ
      - name: Verify Playwright installation
        run: |
          echo "Playwright version: $(npx playwright --version)"
          echo "Browsers path: $PLAYWRIGHT_BROWSERS_PATH"
          ls -la $PLAYWRIGHT_BROWSERS_PATH || echo "Path not found"

      # 8. E2E ํ…Œ์ŠคํŠธ ์‹คํ–‰
      - name: Run Playwright tests
        run: npx playwright test
        env:
          CI: true

      # 9. ํ…Œ์ŠคํŠธ ์‹คํŒจ ์‹œ ๋ฆฌํฌํŠธ ์—…๋กœ๋“œ (์„ ํƒ์‚ฌํ•ญ)
      - name: Upload Playwright report
        uses: actions/upload-artifact@v4
        if: always()
        with:
          name: playwright-report
          path: playwright-report/
          retention-days: 7

์ฃผ์š” ํฌ์ธํŠธ ์„ค๋ช…

npm ci ์‚ฌ์šฉ ์ด์œ 45

npm install๊ณผ ๋‹ฌ๋ฆฌ npm ci๋Š”:

  • package-lock.json์— ๊ณ ์ •๋œ ๋ฒ„์ „๋งŒ ์„ค์น˜ (๋ฒ„์ „ ๋“œ๋ฆฌํ”„ํŠธ ๋ฐฉ์ง€)
  • node_modules๋ฅผ ๋จผ์ € ์‚ญ์ œ ํ›„ ์žฌ์„ค์น˜ (ํด๋ฆฐ ํ™˜๊ฒฝ ๋ณด์žฅ)
  • package-lock.json์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š์Œ

CI ํ™˜๊ฒฝ์—์„œ๋Š” ํ•ญ์ƒ npm ci๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

if: steps.playwright-cache.outputs.cache-hit != 'true'

์บ์‹œ๊ฐ€ ์ด๋ฏธ ์žˆ์œผ๋ฉด ๋ธŒ๋ผ์šฐ์ € ์„ค์น˜ ๋‹จ๊ณ„๋ฅผ ๊ฑด๋„ˆ๋›ด๋‹ค. ๋‹จ, --with-deps๋Š” ์‹œ์Šคํ…œ ์˜์กด์„ฑ๋„ ์„ค์น˜ํ•˜๋ฏ€๋กœ, ์บ์‹œ๊ฐ€ ์žˆ๋”๋ผ๋„ ์‹œ์Šคํ…œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์—†์„ ์ˆ˜ ์žˆ๋‹ค. ์•ˆ์ „ํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด:

- name: Install system dependencies (even if browser cache hit)
  run: npx playwright install-deps chromium
  
- name: Install Playwright Browsers (if no cache)
  if: steps.playwright-cache.outputs.cache-hit != 'true'
  run: npx playwright install chromium

Docker ํ™˜๊ฒฝ์—์„œ Playwright ์‹คํ–‰

๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์ด๋‚˜ Docker ๊ธฐ๋ฐ˜ CI์—์„œ Playwright๋ฅผ ์‹คํ–‰ํ•  ๋•Œ๋Š” ๋ณ„๋„ ์„ค์ •์ด ํ•„์š”ํ•˜๋‹ค.

Dockerfile ์ž‘์„ฑ

# Playwright ๊ณต์‹ ์ด๋ฏธ์ง€ ์‚ฌ์šฉ (๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ฏธ๋ฆฌ ์„ค์น˜๋˜์–ด ์žˆ์Œ)
FROM mcr.microsoft.com/playwright:v1.40.0-jammy

WORKDIR /app

# ์˜์กด์„ฑ ์„ค์น˜
COPY package*.json ./
RUN npm ci

# ์†Œ์Šค ์ฝ”๋“œ ๋ณต์‚ฌ
COPY . .

# ํ…Œ์ŠคํŠธ ์‹คํ–‰
CMD ["npx", "playwright", "test"]

Playwright ๊ณต์‹ Docker ์ด๋ฏธ์ง€(mcr.microsoft.com/playwright)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €์™€ ๋ชจ๋“  ์‹œ์Šคํ…œ ์˜์กด์„ฑ์ด ๋ฏธ๋ฆฌ ์„ค์น˜๋˜์–ด ์žˆ์–ด ๋ณ„๋„ ์„ค์น˜ ๊ณผ์ •์ด ํ•„์š” ์—†๋‹ค.

docker-compose๋กœ ๋กœ์ปฌ ํ…Œ์ŠคํŠธ

# docker-compose.yml
version: '3.8'

services:
  playwright-test:
    image: mcr.microsoft.com/playwright:v1.40.0-jammy
    volumes:
      - .:/app
      - /app/node_modules
    working_dir: /app
    command: npx playwright test
    environment:
      - CI=true

์‹คํ–‰:

docker-compose run --rm playwright-test

์ปค์Šคํ…€ Node.js ์ด๋ฏธ์ง€์—์„œ ์„ค์น˜

๊ณต์‹ ์ด๋ฏธ์ง€ ๋Œ€์‹  ์ผ๋ฐ˜ Node.js ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ:

FROM node:20-slim

# Playwright๊ฐ€ ํ•„์š”ํ•œ ์‹œ์Šคํ…œ ํŒจํ‚ค์ง€ ์„ค์น˜
RUN apt-get update && apt-get install -y \
    libglib2.0-0 \
    libnss3 \
    libnspr4 \
    libatk1.0-0 \
    libatk-bridge2.0-0 \
    libcups2 \
    libdrm2 \
    libdbus-1-3 \
    libxcb1 \
    libxkbcommon0 \
    libx11-6 \
    libxcomposite1 \
    libxdamage1 \
    libxext6 \
    libxfixes3 \
    libxrandr2 \
    libgbm1 \
    libpango-1.0-0 \
    libcairo2 \
    libasound2 \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /app
COPY package*.json ./
RUN npm ci
RUN npx playwright install chromium

COPY . .
CMD ["npx", "playwright", "test"]

๋””๋ฒ„๊น… ํŒ

PWDEBUG ํ™˜๊ฒฝ ๋ณ€์ˆ˜

PWDEBUG=1 npx playwright test

PWDEBUG=1์„ ์„ค์ •ํ•˜๋ฉด Playwright Inspector๊ฐ€ ์—ด๋ฆฐ๋‹ค.

  • ํ…Œ์ŠคํŠธ ์‹คํ–‰์„ ๋‹จ๊ณ„๋ณ„๋กœ ์ผ์‹œ ์ •์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ฐ ์•ก์…˜ ์ „์— ๋ฉˆ์ถฐ์„œ ๋ธŒ๋ผ์šฐ์ € ์ƒํƒœ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์…€๋ ‰ํ„ฐ๋ฅผ ์ง์ ‘ ์‹œํ—˜ํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.
# ํŠน์ • ํ…Œ์ŠคํŠธ๋งŒ ๋””๋ฒ„๊น…
PWDEBUG=1 npx playwright test --grep "๋กœ๊ทธ์ธ ํ…Œ์ŠคํŠธ"

--headed ์˜ต์…˜

CI๊ฐ€ ์•„๋‹Œ ๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ํ™•์ธํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

# headless ๋Œ€์‹  ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ € ์ฐฝ์„ ๋„์›Œ์„œ ์‹คํ–‰
npx playwright test --headed

# ์ฒœ์ฒœํžˆ ์‹คํ–‰ (๊ฐ ์•ก์…˜ ์‚ฌ์ด์— 500ms ๋Œ€๊ธฐ)
npx playwright test --headed --slow-mo=500

์Šคํฌ๋ฆฐ์ƒท ๋ฐ ๋น„๋””์˜ค ๋…นํ™”

playwright.config.ts์—์„œ ์‹คํŒจ ์‹œ ์ž๋™์œผ๋กœ ์ฆ๊ฑฐ๋ฅผ ๋‚จ๊ธธ ์ˆ˜ ์žˆ๋‹ค:

import { defineConfig } from '@playwright/test';

export default defineConfig({
  use: {
    // ํ…Œ์ŠคํŠธ ์‹คํŒจ ์‹œ ์Šคํฌ๋ฆฐ์ƒท ์บก์ฒ˜
    screenshot: 'only-on-failure',
    // ํ…Œ์ŠคํŠธ ์‹คํŒจ ์‹œ ๋น„๋””์˜ค ๋…นํ™”
    video: 'retain-on-failure',
    // ํ…Œ์ŠคํŠธ ์‹คํŒจ ์‹œ trace ์ €์žฅ (์žฌํ˜„ ๊ฐ€๋Šฅ)
    trace: 'on-first-retry',
  },
  retries: process.env.CI ? 2 : 0,
});

--reporter ์˜ต์…˜์œผ๋กœ ์ƒ์„ธ ๋กœ๊ทธ ํ™•์ธ

# HTML ๋ฆฌํฌํŠธ ์ƒ์„ฑ (๋ธŒ๋ผ์šฐ์ €์—์„œ ์—ด ์ˆ˜ ์žˆ๋Š” UI)
npx playwright test --reporter=html

# ๋ฆฌํฌํŠธ ์—ด๊ธฐ
npx playwright show-report

์ž์ฃผ ํ•˜๋Š” ์‹ค์ˆ˜ ์ •๋ฆฌ

1. install ์—†์ด ํ…Œ์ŠคํŠธ ์‹คํ–‰

# ์ž˜๋ชป๋œ ์˜ˆ
- run: npm ci
- run: npx playwright test  # ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์—†์–ด์„œ ์‹คํŒจ!

# ์˜ฌ๋ฐ”๋ฅธ ์˜ˆ
- run: npm ci
- run: npx playwright install --with-deps chromium
- run: npx playwright test

2. sudo์™€ ํ•จ๊ป˜ ์„ค์น˜ ํ›„ ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž๋กœ ์‹คํ–‰

# ์ž˜๋ชป๋œ ์˜ˆ โ€” root๋กœ ์„ค์น˜ํ•˜๋ฉด /root/.cache์— ์ €์žฅ๋จ
sudo npx playwright install

# ์ดํ›„ ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž๋กœ ์‹คํ–‰ํ•˜๋ฉด /home/runner/.cache์—์„œ ์ฐพ์œผ๋ฏ€๋กœ ์‹คํŒจ
npx playwright test

ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ๊ฒฝ๋กœ๋ฅผ ๋ช…์‹œํ•˜๊ฑฐ๋‚˜, sudo ์—†์ด ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์ด ๋งž๋‹ค.

3. CI์™€ CD ํŒŒ์ดํ”„๋ผ์ธ ๋ถ„๋ฆฌ ์‹œ ์บ์‹œ ๋ฏธ๊ณต์œ 

GitHub Actions์—์„œ CI job๊ณผ CD job์ด ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์œผ๋ฉด ์บ์‹œ๊ฐ€ ๊ณต์œ ๋˜์ง€ ์•Š๋Š”๋‹ค. ๊ฐ job์—์„œ ๋…๋ฆฝ์ ์œผ๋กœ Playwright๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•œ๋‹ค.

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - run: npx playwright install --with-deps chromium
      - run: npx playwright test

  deploy:
    needs: test
    runs-on: ubuntu-latest
    steps:
      # deploy job๋„ Playwright๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด ์—ฌ๊ธฐ์„œ๋„ ์„ค์น˜
      - run: npx playwright install --with-deps chromium

4. playwright.config.ts ์—†์ด ์‹คํ–‰

Playwright๋Š” ๊ธฐ๋ณธ ์„ค์ • ํŒŒ์ผ ์—†์ด๋„ ์‹คํ–‰๋˜์ง€๋งŒ, ์ž˜๋ชป๋œ ๊ธฐ๋ณธ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— playwright.config.ts๋ฅผ ํ•ญ์ƒ ๋ช…์‹œ์ ์œผ๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

import { defineConfig, devices } from '@playwright/test';

export default defineConfig({
  testDir: './tests',
  fullyParallel: true,
  forbidOnly: !!process.env.CI,  // CI์—์„œ test.only ์‚ฌ์šฉ ๊ธˆ์ง€
  retries: process.env.CI ? 2 : 0,
  workers: process.env.CI ? 1 : undefined,
  reporter: 'html',
  use: {
    baseURL: 'http://localhost:3000',
    trace: 'on-first-retry',
  },
  projects: [
    {
      name: 'chromium',
      use: { ...devices['Desktop Chrome'] },
    },
  ],
  webServer: {
    command: 'npm run start',
    url: 'http://localhost:3000',
    reuseExistingServer: !process.env.CI,
  },
});

5. ๋กœ์ปฌ .env๋ฅผ CI์—์„œ ์„ค์ • ์•ˆ ํ•จ

ํ…Œ์ŠคํŠธ์—์„œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ฝ๋Š” ๊ฒฝ์šฐ, CI์—์„œ๋„ ํ•ด๋‹น ๊ฐ’์„ GitHub Secrets๋กœ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.

- name: Run Playwright tests
  run: npx playwright test
  env:
    BASE_URL: ${{ secrets.TEST_BASE_URL }}
    API_KEY: ${{ secrets.TEST_API_KEY }}

์ตœ์ข… ๋ฌธ์ œ ๋ถ„์„ ๋ฐ ํ•ด๊ฒฐ ์š”์•ฝ

๋ฌธ์ œ ๋ฐœ์ƒ ๋ฐฐ๊ฒฝ

  • ๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ๋Š” ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋Š” Gatsby ๋ธ”๋กœ๊ทธ๊ฐ€ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ Playwright ๋ธŒ๋ผ์šฐ์ € ์„ค์น˜ ์˜ค๋ฅ˜๋กœ ์ธํ•œ ๋นŒ๋“œ ์‹คํŒจ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.
  • ํŠนํžˆ, Playwright ์„ค์น˜ ํ›„, ๋ธŒ๋ผ์šฐ์ € ์‹คํ–‰ํ•  ๋•Œ ๊ฒฝ๋กœ๊ฐ€ ์ œ๋Œ€๋กœ ์„ค์ •๋˜์ง€ ์•Š์•„ ๋ฐœ์ƒํ•˜์˜€๋‹ค.1
Error: Failed to launch chromium because executable doesn't exist

browserType.launch: Executable doesn't exist at /home/runner/.cache/ms-playwright/chromium-1124/chrome-linux/chrome

์›์ธ ๋ถ„์„

  • ๊ถŒํ•œ ๋ฌธ์ œ: Playwright ๋ธŒ๋ผ์šฐ์ € ์„ค์น˜ ์ค‘ ๊ถŒํ•œ์ด ๊ฑฐ๋ถ€๋จ. sudo npx playwright install์„ ์‹œ๋„ํ–ˆ์œผ๋‚˜ ์—ฌ์ „ํžˆ ๋ฌธ์ œ ๋ฐœ์ƒ.
  • ์„ค์น˜ ๊ฒฝ๋กœ ๋ฌธ์ œ: Playwright์˜ ๊ธฐ๋ณธ ์„ค์น˜ ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ๊ถŒํ•œ ๋ฌธ์ œ๋กœ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์„ค์น˜๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜, ์„ค์น˜๋œ ์œ„์น˜์—์„œ ์‹คํ–‰๋˜์ง€ ์•Š์Œ.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  • ์„ค์น˜ ๊ฒฝ๋กœ ์ˆ˜์ •: Playwright ๋ธŒ๋ผ์šฐ์ €์˜ ์„ค์น˜ ๊ฒฝ๋กœ๋ฅผ $HOME/.cache/ms-playwright๋กœ ๋ณ€๊ฒฝํ•˜๊ณ , ์ด ๊ฒฝ๋กœ๋ฅผ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์„ค์ •.
  • ์บ์‹œ ๋ฌดํšจํ™”: ์†์ƒ๋˜์—ˆ๊ฑฐ๋‚˜ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์บ์‹œ๋ฅผ ๋ฌดํšจํ™”ํ•˜๊ณ , ์ƒˆ ์บ์‹œ ์ƒ์„ฑ.
  • ์„ค์น˜ ๊ฒฝ๋กœ ๊ฒ€์ฆ: ์„ค์น˜ ํ›„ ํ•ด๋‹น ๊ฒฝ๋กœ์— ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ œ๋Œ€๋กœ ์„ค์น˜๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์ ˆ์ฐจ ์ถ”๊ฐ€.
- name: Set Playwright Browsers Path
  run: echo "PLAYWRIGHT_BROWSERS_PATH=$HOME/.cache/ms-playwright" >> $GITHUB_ENV

- name: Check Playwright Browsers Path
  run: echo "Playwright Browsers Path ---> ${{ env.PLAYWRIGHT_BROWSERS_PATH }}"

- name: Install Playwright Browsers
  run: npx playwright install --with-deps chromium

๊ฒฐ๋ก 

Playwright๋Š” ๊ฐ•๋ ฅํ•œ E2E ํ…Œ์ŠคํŠธ ๋„๊ตฌ์ด์ง€๋งŒ, CI/CD ํ™˜๊ฒฝ์—์„œ ์ฒ˜์Œ ์„ค์ •ํ•  ๋•Œ ๋ธŒ๋ผ์šฐ์ € ์„ค์น˜ ๊ฒฝ๋กœ ๋ฌธ์ œ๋กœ ์–ด๋ ค์›€์„ ๊ฒช๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

ํ•ต์‹ฌ ์ฒดํฌ๋ฆฌ์ŠคํŠธ:

  1. npm ci๋กœ ์˜์กด์„ฑ ์„ค์น˜ ํ›„ ๋ฐ˜๋“œ์‹œ npx playwright install --with-deps๋กœ ๋ธŒ๋ผ์šฐ์ € ์„ค์น˜
  2. PLAYWRIGHT_BROWSERS_PATH ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์„ค์น˜ ๊ฒฝ๋กœ ๋ช…์‹œ
  3. actions/cache๋กœ ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑํ•˜์—ฌ CI ์†๋„ ๊ฐœ์„ 
  4. playwright vs playwright-core ๋ฒ„์ „ ํ†ต์ผ ํ™•์ธ
  5. ์‹คํŒจ ์‹œ ์Šคํฌ๋ฆฐ์ƒท/trace ์ €์žฅ์œผ๋กœ ๋””๋ฒ„๊น… ํŽธ์˜์„ฑ ํ™•๋ณด
  6. Docker ํ™˜๊ฒฝ์—์„œ๋Š” Playwright ๊ณต์‹ ์ด๋ฏธ์ง€ ํ™œ์šฉ

์ด๋Ÿฌํ•œ ์„ค์ •์„ ๊ฐ–์ถ”๋ฉด ๋กœ์ปฌ ํ™˜๊ฒฝ๊ณผ CI/CD ํ™˜๊ฒฝ ๋ชจ๋‘์—์„œ ์•ˆ์ •์ ์ธ ํ…Œ์ŠคํŠธ ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

@leekh8
๋ณด์•ˆ, ์›น ๊ฐœ๋ฐœ, Python์„ ๋‹ค๋ฃจ๋Š” ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ