본문 바로가기
코딩취미/프로그램 지식

GitHub Actions 고급 워크플로우 구성법

by 브링블링 2025. 4. 13.
반응형

GitHub Actions 고급 워크플로우 구성법

(병렬 실행, 조건 분기, 매트릭스 전략, 캐시 활용까지 한 번에 정리!)

GitHub Actions를 사용하다 보면 단순한 push 트리거 외에 "테스트를 병렬로 돌리고 싶다", "운영과 개발을 분리하고 싶다",
"의존성 캐시를 저장해서 속도를 줄이고 싶다"는 생각이 들게 됩니다. 이번 글에서는 실무에서 자주 쓰이는 GitHub Actions의 고급 기능들을 정리해드릴게요.


🧩 1. 매트릭스 전략 (matrix) – 병렬 실행

📘 개념

여러 환경(OS, Python/Node 버전 등)에서 동시에 테스트를 실행하고 싶을 때 사용

✅ 예제

jobs:
  test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        python-version: [3.8, 3.9, 3.10]

    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-python@v4
        with:
          python-version: ${{ matrix.python-version }}

      - name: 테스트 실행
        run: pytest

위 코드는 Python 3.8, 3.9, 3.10 환경에서 동시에 테스트를 실행합니다.

✨ 확장 예시 (OS + 버전 조합)

strategy:
  matrix:
    os: [ubuntu-latest, windows-latest]
    node: [14, 16]

🧪 2. 조건 분기 (if:)

📘 개념

워크플로우나 step을 특정 조건일 때만 실행

✅ 예제

- name: 배포
  if: github.ref == 'refs/heads/main'
  run: echo "프로덕션 배포 실행"

🎯 조건 종류 예시

조건 설명
success() 이전 step이 성공했을 때
failure() 실패했을 때
always() 무조건 실행
github.ref == 'refs/heads/dev' 브랜치 조건
github.actor == 'username' 커밋 작성자 조건

⚡ 3. 캐시 저장/복원 (dependencies, 빌드 등)

📘 개념

빌드 시 걸리는 시간을 줄이기 위해 종속성을 캐시로 저장

✅ 예제 (npm 캐시)

- name: 캐시 npm
  uses: actions/cache@v3
  with:
    path: ~/.npm
    key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
    restore-keys: |
      ${{ runner.os }}-node-

변경된 의존성이 없으면 캐시에서 바로 복원해서 속도 개선 가능!

✅ 예제 (pip 캐시)

- name: 캐시 pip
  uses: actions/cache@v3
  with:
    path: ~/.cache/pip
    key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
반응형

🧠 4. Job 간 의존성 설정 (needs:)

📘 개념

A 작업이 끝나야 B 작업이 실행되도록 만들기

✅ 예제

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - run: echo "빌드 완료"

  deploy:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - run: echo "배포 시작"

deploy는 build가 완료돼야 실행됩니다.


🔀 5. 여러 워크플로우 파일로 분리 (.yml 나누기)

  • .github/workflows/ci.yml → 테스트/빌드
  • .github/workflows/deploy.yml → 배포
  • .github/workflows/schedule.yml → 정기 실행

기능별로 워크플로우를 나눠서 관리하면 협업 시 훨씬 명확해져요!


🔒 6. Secrets와 환경 변수 분리 사용

env:
  ENV: production
  API_URL: https://api.example.com

run: echo "현재 환경은 $ENV"

 

보안 관련 값은 GitHub Secrets에 등록하고 아래처럼 사용:

run: echo "TOKEN은 ${{ secrets.MY_SECRET }}"

🛡️ 7. 실패 자동 알림 연동 (Slack/Webhook)

워크플로우 끝에 아래와 같이 Slack 메시지 발송 추가:

- name: Slack 알림
  if: failure()
  run: |
    curl -X POST -H 'Content-type: application/json' \
    --data '{"text":"❌ 빌드 실패! 확인 요망!"}' ${{ secrets.SLACK_WEBHOOK_URL }}

🧩 전체 예제 조합

on:
  push:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        python: [3.8, 3.9]
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-python@v4
        with:
          python-version: ${{ matrix.python }}
      - run: pip install -r requirements.txt
      - run: pytest

  deploy:
    needs: test
    if: github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest
    steps:
      - run: echo "프로덕션 배포 완료!"
반응형