Git

GitHub Actions로 CI/CD 자동화하기

코샵 2025. 1. 7. 10:19
반응형

소개

GitHub Actions을 사용하여 CI/CD 파이프라인을 구축하는 방법을 처음부터 차근차근 알아보겠습니다. 실제 프로젝트에서 바로 사용할 수 있는 예제도 함께 살펴보겠습니다.

GitHub Actions란?

GitHub Actions는 빌드, 테스트, 배포 파이프라인을 자동화할 수 있는 CI/CD 플랫폼입니다. git push 등의 이벤트가 발생했을 때 자동으로 정의된 작업을 실행할 수 있습니다.

기본 워크플로우 생성

1. 워크플로우 파일 위치

프로젝트 루트에 다음 경로로 yml 파일을 생성합니다:

your-project/
  ├── .github/
  │   └── workflows/
  │       └── main.yml

2. 기본 워크플로우 구조

name: CI/CD Pipeline

# 워크플로우 실행 조건
on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

# 실행할 작업들
jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Setup Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '18'

      - name: Install dependencies
        run: npm install

      - name: Run tests
        run: npm test

실전 예제: React 프로젝트 배포

1. React 빌드 및 테스트

name: React Deploy

on:
  push:
    branches: [ main ]

jobs:
  build-and-test:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3

      - name: Setup Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '18'
          cache: 'npm'  # npm 캐시 사용

      - name: Install dependencies
        run: npm ci  # clean install

      - name: Run tests
        run: npm test

      - name: Build project
        run: npm run build

      # 빌드 결과물 저장
      - name: Upload build artifacts
        uses: actions/upload-artifact@v3
        with:
          name: build-files
          path: build/

2. AWS S3 배포

name: Deploy to AWS

jobs:
  deploy:
    needs: build-and-test  # 이전 작업 완료 후 실행
    runs-on: ubuntu-latest

    steps:
      # 빌드 결과물 다운로드
      - name: Download build artifacts
        uses: actions/download-artifact@v3
        with:
          name: build-files
          path: build

      # AWS 인증 설정
      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ap-northeast-2

      # S3에 업로드
      - name: Upload to S3
        run: |
          aws s3 sync build/ s3://${{ secrets.AWS_S3_BUCKET }} --delete

환경별 배포 설정 (개발/스테이징/운영)

name: Multi-environment Deploy

on:
  push:
    branches:
      - develop
      - staging
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest

    # 환경별 설정
    environment:
      ${{ github.ref == 'refs/heads/main' && 'production' ||
          github.ref == 'refs/heads/staging' && 'staging' ||
          'development' }}

    steps:
      - uses: actions/checkout@v3

      - name: Set environment variables
        run: |
          if [[ $GITHUB_REF == 'refs/heads/main' ]]; then
            echo "ENV=production" >> $GITHUB_ENV
          elif [[ $GITHUB_REF == 'refs/heads/staging' ]]; then
            echo "ENV=staging" >> $GITHUB_ENV
          else
            echo "ENV=development" >> $GITHUB_ENV
          fi

      - name: Deploy to environment
        run: |
          echo "Deploying to ${{ env.ENV }} environment"
          # 실제 배포 스크립트

캐시 활용하기

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3

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

      # 빌드 캐시
      - name: Cache build output
        uses: actions/cache@v3
        with:
          path: |
            build
            node_modules/.cache
          key: ${{ runner.os }}-build-${{ github.sha }}

보안 설정

1. 시크릿 설정

GitHub 레포지토리의 Settings > Secrets and variables > Actions에서 시크릿을 설정할 수 있습니다.

steps:
  - name: Deploy with secrets
    env:
      API_KEY: ${{ secrets.API_KEY }}
      DATABASE_URL: ${{ secrets.DATABASE_URL }}
    run: |
      echo "Using secrets for deployment"

2. 환경 보호 규칙

jobs:
  deploy:
    environment:
      name: production
      url: https://www.example.com

    # 필요한 승인자 설정
    needs: [build, test]
    if: github.event_name == 'push' && github.ref == 'refs/heads/main'

실행 결과 알림

1. Slack 알림

steps:
  - name: Notify Slack
    uses: 8398a7/action-slack@v3
    with:
      status: ${{ job.status }}
      fields: repo,message,commit,author,action,eventName,ref,workflow,job,took
    env:
      SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
    if: always()  # 성공/실패 모두 알림

작업 매트릭스 활용

여러 버전이나 환경에서 테스트할 때 유용합니다.

jobs:
  test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [14.x, 16.x, 18.x]

    steps:
      - uses: actions/checkout@v3
      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v3
        with:
          node-version: ${{ matrix.node-version }}

마치며

GitHub Actions를 활용하면 개발부터 배포까지의 과정을 자동화할 수 있습니다. 초기 설정에 시간이 들 수 있지만, 한번 설정해두면 개발 생산성을 크게 향상시킬 수 있습니다.