본문 바로가기
C.W.K.
Stream
Lesson 10 of 14 · published

동적 매트릭스

~12 min · matrix, dynamic, fromJSON

Level 0견습생
0 XP0/101 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

실행 시점에 매트릭스 계산하기

가끔은 매트릭스를 코드에 직접 박아 넣을 수가 없어. 풀 리퀘스트에서 뭐가 바뀌었는지, 모노레포에 어떤 패키지가 있는지, 어떤 테스트에 태그가 달렸는지, 설정 파일이 어떤 플랫폼을 선언하는지에 따라 달라지니까. 동적 매트릭스를 쓰면 준비 작업에서 매트릭스를 계산한 뒤 후속 매트릭스 작업에 넘겨줄 수 있어.

패턴

  1. 준비 작업이 저장소를 점검해 (바뀐 파일이나 패키지 목록 등).
  2. JSON 배열을 작업 출력값으로 내보낸다.
  3. 후속 매트릭스 작업에서 strategy.matrix.<key>: ${{ fromJSON(needs.setup.outputs.<key>) }}처럼 설정한다.
  4. 각 매트릭스 셀이 실제 작업을 실행한다.

실제 예시

  • 모노레포 — 이 풀 리퀘스트에서 코드가 바뀐 패키지만 테스트한다.
  • 크로스 플랫폼 빌더 — 저장소에서 platforms.json을 읽어서 항목마다 매트릭스 셀을 실행한다.
  • 태그 기반 — 테스트 프레임워크에 표시된 테스트 그룹 목록을 가져와 매트릭스 셀로 늘린다.

Code

모노레포 — 변경된 패키지만 테스트·yaml
jobs:
  detect:
    runs-on: ubuntu-latest
    outputs:
      packages: ${{ steps.changed.outputs.packages }}
    steps:
      - uses: actions/checkout@v4
        with: { fetch-depth: 0 }
      - id: changed
        run: |
          # Find unique top-level package directories changed in this PR
          base=${{ github.event.pull_request.base.sha || 'HEAD~1' }}
          pkgs=$(git diff --name-only "$base" | awk -F/ '/^packages\//{print $2}' | sort -u)
          json=$(echo "$pkgs" | jq -R . | jq -sc .)
          echo "packages=$json" >> $GITHUB_OUTPUT

  test:
    needs: detect
    if: needs.detect.outputs.packages != '[]'
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        package: ${{ fromJSON(needs.detect.outputs.packages) }}
    steps:
      - uses: actions/checkout@v4
      - run: cd packages/${{ matrix.package }} && npm ci && npm test

External links

Exercise

모노레포가 있다면 '변경된 패키지'를 탐지하는 작업을 만들어 매트릭스에 넘겨봐. 패키지 하나만 수정하는 풀 리퀘스트를 열어서 해당 셀만 도는지 확인해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.