๐Ÿš€ Gatsby CI/CD ํ™˜๊ฒฝ์—์„œ Playwright ์˜ค๋ฅ˜ ํ•ด๊ฒฐ: browserType.launch, Chromium ๋ฒ„์ „ ์ถฉ๋Œ ๋ฌธ์ œ ํ•ด๊ฒฐ

@leekh8 ยท September 13, 2024 ยท 5 min read

Code N Solve ๐Ÿ“˜: Playwright์™€ Gatsby CI/CD ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•œ browserType.launch ์˜ค๋ฅ˜ ๋ฐ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ์ •๋ฆฌ

์ด์ „์— ํ•ด๊ฒฐํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋˜ Playwright1 ๊ด€๋ จ ๋ฌธ์ œ๊ฐ€ ๋‹ค์‹œ ๋ฐœ์ƒํ–ˆ๋‹ค.

Gatsby build ๊ณผ์ •์—์„œ ์ง€์†์ ์œผ๋กœ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

๋ฌธ์ œ: Playwright Chromium ๋ธŒ๋ผ์šฐ์ € ๋ฒ„์ „ ์ฐธ์กฐ ์˜ค๋ฅ˜2

  • Gatsby ๋ธ”๋กœ๊ทธ์˜ ๋ฐฐํฌ๋ฅผ ์œ„ํ•œ GitHub Actions์—์„œ Playwright ์„ค์น˜ ์‹œ, ์˜ค๋ž˜๋œ Chromium ๋ธŒ๋ผ์šฐ์ € ๋ฒ„์ „(์˜ˆ: chromium-1129)์„ ๊ณ„์† ์ฐธ์กฐํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.
  • ์บ์‹œ๋ฅผ ๋น„์›Œ๋„ ํ•ด๊ฒฐ๋˜์ง€ ์•Š๊ฑฐ๋‚˜, ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ € ๋ฒ„์ „(chromium-1134)์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ–ˆ๋‹ค.
  • browserType.launch: Executable doesn't exist at /home/runner/.cache/ms-playwright/chromium-1129/chrome-linux/chrome

๋ฌธ์ œ ๋ถ„์„

  • ์ด์ „์— ์บ์‹œ๋œ Playwright ๋ธŒ๋ผ์šฐ์ € ๊ฒฝ๋กœ๊ฐ€ GitHub Actions์—์„œ ์ฐธ์กฐ๋˜๋ฉด์„œ, ์ตœ์‹  ๋ฒ„์ „ ์„ค์น˜ ํ›„์—๋„ ์ž˜๋ชป๋œ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•จ.
  • Playwright ๊ฒฝ๋กœ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์ง€์ •ํ•˜์ง€ ์•Š์•„ Gatsby ๋นŒ๋“œ์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•จ.

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

  • Playwright ์บ์‹œ ๊ฐ•์ œ ์‚ญ์ œ

    • ์บ์‹œ๋œ Playwright ๋ธŒ๋ผ์šฐ์ € ํŒŒ์ผ๋“ค์„ ๊ฐ•์ œ๋กœ ์‚ญ์ œํ•œ ํ›„, ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ๋‹ค์‹œ ์„ค์น˜ํ•˜์˜€๋‹ค.
    • - name: Remove Playwright Cache
        run: |
          rm -rf ~/.cache/ms-playwright
          rm -rf ~/work/<your-repo-name>/<your-repo-name>/.cache/ms-playwright
    • ์†Œ์šฉ์€ ์—†์—ˆ๋‹ค.
  • Chromium ๊ฒฝ๋กœ ๋ช…ํ™•ํžˆ ์ง€์ •

    • Playwright ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์„ค์น˜ํ•œ ํ›„, ์ตœ์‹  Chromium ๊ฒฝ๋กœ๋ฅผ ํ™•์ธํ•˜์—ฌ ๋ช…ํ™•ํ•˜๊ฒŒ ์„ค์ •ํ•œ๋‹ค.
    • ์ด๋ฅผ ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ์ €์žฅํ•˜์—ฌ GitHub Actions์™€ Gatsby ๋นŒ๋“œ ์‹œ ๋ช…์‹œ์ ์œผ๋กœ ํ•ด๋‹น ๊ฒฝ๋กœ๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒํ•œ๋‹ค.
    • - name: Install Playwright and Set Browser Path
        run: |
          npx playwright install --with-deps chromium
          CHROMIUM_DIR=$(ls -d $HOME/.cache/ms-playwright/chromium-*/ | sort -V | tail -n 1)
          echo "CHROMIUM_DIR=$CHROMIUM_DIR" >> $GITHUB_ENV
          ls -al $CHROMIUM_DIR
    • ์†Œ์šฉ์€ ์—†์—ˆ๋‹ค.
  • ๋นŒ๋“œ ์‹œ Playwright ๊ฒฝ๋กœ ํ™•์ธ

    • ๋นŒ๋“œ ๋„์ค‘ Playwright ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์น˜๋˜์—ˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์ •ํ™•ํ•œ ๊ฒฝ๋กœ๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋กœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋””๋ฒ„๊น…์— ํ™œ์šฉํ–ˆ๋‹ค.
    • - name: Verify Playwright Installation and Path
        run: |
          npx playwright --version
          echo "Using Chromium from: $CHROMIUM_DIR"
          ls -al $CHROMIUM_DIR
  • ๋นŒ๋“œ ์ „ gatsby ์บ์‹œ ์‚ญ์ œ

    • ๋นŒ๋“œ ์‹คํ–‰ ์ „์— package.json์— ์„ค์ •ํ•ด๋‘” cache clean ๋ช…๋ น์–ด๋ฅผ ๋ฏธ๋ฆฌ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œ ์‹œ ์ด์ „ cache๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋นŒ๋“œํ•˜์—ฌ ์˜ฌ๋ฐ”๋ฅธ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ฐพ๋„๋ก ํ•˜์˜€๋‹ค.
    • - name: Build with Gatsby
        env:
          PREFIX_PATHS: "true"
          CHROMIUM_DIR: ${{ env.CHROMIUM_DIR }}
        run: |
          yarn clean
          yarn build

์ตœ์ข… CI/CD ์›Œํฌํ”Œ๋กœ

  • CI ํŒŒ์ดํ”„๋ผ์ธ

    • ์ตœ์‹  Playwright ๋ธŒ๋ผ์šฐ์ €๋ฅผ $HOME/.cache/ms-playwright ๊ฒฝ๋กœ์— ์„ค์น˜ํ•˜๊ณ , ์ด ๋ฒ„์ „์˜ ๊ฒฝ๋กœ๋ฅผ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์„ค์ •ํ•˜์—ฌ ๋นŒ๋“œ ๊ณผ์ •์—์„œ ํ™œ์šฉํ•˜์˜€๋‹ค.
    • ๋˜, pull request์™€ push ์ƒํ™ฉ์„ ๋‚˜๋ˆ„์–ด ๊ด€๋ฆฌํ•˜์˜€๋‹ค.
    • name: CI
      
      on:
        pull_request:
          branches:
            - main
        push:
          branches:
            - main
      
      jobs:
        check_on_pull_request:
          if: github.event_name == 'pull_request'
          runs-on: ubuntu-latest
          steps:
            - uses: actions/checkout@v4
            - uses: actions/setup-node@v4
              with:
                node-version: "20"
      
            - name: Remove Playwright Cache
              run: |
                rm -rf ~/.cache/ms-playwright
      
            - name: Install Playwright and Chromium Browser
              run: |
                npx playwright install --with-deps chromium
                CHROMIUM_DIR=$(ls -d $HOME/.cache/ms-playwright/chromium-*/ | sort -V | tail -n 1)
                echo "CHROMIUM_DIR=$CHROMIUM_DIR" >> $GITHUB_ENV
                ls -al $CHROMIUM_DIR
      
            - name: Install node packages
              run: yarn
      
            - name: Check lint
              run: yarn check:lint
      
            - name: Check prettier
              run: yarn check:prettier
      
        build_on_push:
          if: github.event_name == 'push'
          runs-on: ubuntu-latest
          steps:
            - uses: actions/checkout@v4
            - uses: actions/setup-node@v4
              with:
                node-version: "20"
      
            - name: Remove Playwright Cache
              run: |
                rm -rf ~/.cache/ms-playwright
      
            - name: Install Playwright and Chromium Browser
              run: |
                npx playwright install --with-deps chromium
                CHROMIUM_DIR=$(ls -d $HOME/.cache/ms-playwright/chromium-*/ | sort -V | tail -n 1)
                echo "CHROMIUM_DIR=$CHROMIUM_DIR" >> $GITHUB_ENV
                ls -al $CHROMIUM_DIR
      
            - name: Install node packages
              run: yarn
      
            - name: Build
              run: yarn build
      
            - name: Verify Playwright Installation
              run: npx playwright --version
  • CD ํŒŒ์ดํ”„๋ผ์ธ

    • CI๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜๋ฉด ์ž๋™์œผ๋กœ ์ง„ํ–‰๋˜๋ฉด์„œ build ์ „์— ์บ์‹œ ์‚ญ์ œ ํ›„ build๋ฅผ ์ง„ํ–‰ํ•˜์—ฌ ์ด์ „์— ์‚ฌ์šฉํ•˜๋˜ ๊ฒฝ๋กœ๊ฐ€ ์•„๋‹Œ ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ playwright๊ฐ€ ์„ค์น˜๋œ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜์˜€๋‹ค.
    • name: CD
      
      on:
        workflow_run:
          workflows: ["CI"]
          types:
            - completed
      
      permissions:
        contents: read
        pages: write
        id-token: write
      
      jobs:
        build:
          runs-on: ubuntu-latest
          steps:
            - name: Checkout Repository
              uses: actions/checkout@v4
      
            - name: Remove Playwright Cache
              run: |
                rm -rf ~/.cache/ms-playwright
      
            - name: Setup Node.js
              uses: actions/setup-node@v4
              with:
                node-version: "20"
      
            - name: Install Project Dependencies and Playwright Browsers
              run: |
                yarn install
                npx playwright install --with-deps chromium
                CHROMIUM_DIR=$(ls -d $HOME/.cache/ms-playwright/chromium-* | sort -V | tail -n 1)
                echo "CHROMIUM_DIR=$CHROMIUM_DIR" >> $GITHUB_ENV
                ls -al $CHROMIUM_DIR
      
            - name: Build with Gatsby
              env:
                PREFIX_PATHS: "true"
                CHROMIUM_DIR: ${{ env.CHROMIUM_DIR }}
              run: |
                yarn clean
                yarn build
      
            - name: Upload artifact
              uses: actions/upload-pages-artifact@v3
              with:
                path: ./public
      
        deploy:
          environment:
            name: github-pages
            url: ${{ steps.deployment.outputs.page_url }}
          runs-on: ubuntu-latest
          needs: build
          steps:
            - name: Deploy to GitHub Pages
              id: deployment
              uses: actions/deploy-pages@v4

์ถ”๊ฐ€

  • Gatsby ํŽ˜์ด์ง€ ์„ค์ • ๋ฐ 404 ์˜ค๋ฅ˜ ํ•ด๊ฒฐ
    • Node.js 20 ๋ฒ„์ „ ์„ค์น˜ ํ›„ actions/configure-pages@v5์„ ์ถ”๊ฐ€ํ•˜์—ฌ Gatsby ํŽ˜์ด์ง€๋ฅผ ์„ค์ •ํ•˜์—ฌ ๋นŒ๋“œ๋œ ๋ธ”๋กœ๊ทธ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋ฐฐํฌ๋˜๋„๋ก ํ•œ๋‹ค.
    • - name: Setup Pages
        id: pages
        uses: actions/configure-pages@v5
        with:
          static_site_generator: gatsby

Github Pages์˜ ๋™์ž‘ ๋ฐฉ์‹:

  • Github Pages๋Š” ์ •์  ์›น์‚ฌ์ดํŠธ ํ˜ธ์ŠคํŒ… ์„œ๋น„์Šค๋กœ, HTML, CSS, JavaScript์™€ ๊ฐ™์€ ์ •์  ํŒŒ์ผ์„ ์ œ๊ณตํ•œ๋‹ค.
  • ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • URL์— ์ ‘์†ํ•˜๋ฉด, Github Pages๋Š” ํ•ด๋‹น URL์— ๋งž๋Š” HTML ํŒŒ์ผ์„ ์ฐพ์•„์„œ ์ œ๊ณตํ•œ๋‹ค.
  • ๋งŒ์•ฝ ํ•ด๋‹น URL์— ๋งž๋Š” HTML ํŒŒ์ผ์ด ์—†์œผ๋ฉด, 404 ์˜ค๋ฅ˜ ํŽ˜์ด์ง€๋ฅผ ํ‘œ์‹œํ•œ๋‹ค.

Gatsby์˜ ํŠน์ง•:

  • Gatsby๋Š” React ๊ธฐ๋ฐ˜์˜ ์ •์  ์›น์‚ฌ์ดํŠธ ์ƒ์„ฑ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ๋นŒ๋“œ ๊ณผ์ •์—์„œ ๋ชจ๋“  ํŽ˜์ด์ง€๋ฅผ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•˜์—ฌ ์ •์  HTML ํŒŒ์ผ๋กœ ์ €์žฅํ•œ๋‹ค.
  • ํ•˜์ง€๋งŒ Gatsby๋Š” ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋ผ์šฐํŒ…์„ ์‚ฌ์šฉํ•˜์—ฌ ํŽ˜์ด์ง€ ์ „ํ™˜์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.3
  • ์ฆ‰, ์‚ฌ์šฉ์ž๊ฐ€ ์›น์‚ฌ์ดํŠธ ๋‚ด์—์„œ ๋งํฌ๋ฅผ ํด๋ฆญํ•˜๋ฉด, ์‹ค์ œ๋กœ ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€๋ฅผ ์š”์ฒญํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ JavaScript๋ฅผ ํ†ตํ•ด ํŽ˜์ด์ง€ ๋‚ด์šฉ์„ ๋ณ€๊ฒฝํ•œ๋‹ค.

๋ฌธ์ œ ๋ฐœ์ƒ ์›์ธ:

  • actions/configure-pages@v54 ์•ก์…˜์ด ์—†์œผ๋ฉด, Github Pages๋Š” Gatsby์˜ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋ผ์šฐํŒ…์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ๋‹ค.5
  • ์‚ฌ์šฉ์ž๊ฐ€ Gatsby ๋ธ”๋กœ๊ทธ ๋‚ด์—์„œ ๋งํฌ๋ฅผ ํด๋ฆญํ•˜์—ฌ ํŽ˜์ด์ง€๋ฅผ ์ „ํ™˜ํ•˜๋ฉด, ์‹ค์ œ๋กœ ์ƒˆ๋กœ์šด URL์— ์ ‘์†ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ Github Pages๋Š” ํ•ด๋‹น URL์— ๋งž๋Š” HTML ํŒŒ์ผ์„ ์ฐพ์ง€ ๋ชปํ•ด 404 ์˜ค๋ฅ˜ ํŽ˜์ด์ง€๋ฅผ ํ‘œ์‹œํ–ˆ๋˜ ๊ฒƒ์ด๋‹ค.

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

  • actions/configure-pages@v5 ์•ก์…˜ ์‚ฌ์šฉ์„ ํ†ตํ•ด, Gatsby ๋ธ”๋กœ๊ทธ์˜ ํŠน์ง•์„ Github Pages์— ์•Œ๋ ค์ค€๋‹ค.
  • ์ด ์•ก์…˜์€ Gatsby ๋ธ”๋กœ๊ทธ์˜ ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฅผ ๋ถ„์„ํ•˜์—ฌ, ๊ฐ ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ Github Pages์— ์ œ๊ณตํ•œ๋‹ค.
  • ๋”ฐ๋ผ์„œ ์‚ฌ์šฉ์ž๊ฐ€ Gatsby ๋ธ”๋กœ๊ทธ ๋‚ด์—์„œ ๋งํฌ๋ฅผ ํด๋ฆญํ•˜์—ฌ ํŽ˜์ด์ง€๋ฅผ ์ „ํ™˜ํ•˜๋”๋ผ๋„, Github Pages๋Š” ํ•ด๋‹น URL์— ๋งž๋Š” HTML ํŒŒ์ผ์„ ์ฐพ์•„์„œ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

๊ฒฐ๋ก 

  • Playwright ๊ฒฝ๋กœ ๋ฌธ์ œ
    • ์ตœ์‹  playwright ๋ฒ„์ „์„ ํ™•์ธํ•˜๊ณ , ํ•ด๋‹น ๋ฒ„์ „์˜ ์ตœ์‹  playwright๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก, ์ด์ „ ์บ์‹œ๋ฅผ ์‚ญ์ œํ•จ์œผ๋กœ์จ ์›ํ•˜๋Š” ๋Œ€๋กœ ์ตœ์‹  playwright๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ง€์ •ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
  • Gatsby ํŽ˜์ด์ง€ ์„ค์ • ๋ฐ 404 ์˜ค๋ฅ˜ ํ•ด๊ฒฐ
    • actions/configure-pages@v5 ์•ก์…˜์„ ์ถ”๊ฐ€ํ•˜์—ฌ Gatsby ํŽ˜์ด์ง€๋ฅผ ์„ค์ •ํ•˜๊ณ  404 ํŽ˜์ด์ง€ ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
@leekh8
Hello :)