GitHub Actions로 CI/CD 파이프라인 이해하기

DevOps2026-09-12TryQuickToolBox

방금 커밋을 푸시했는데 이제 수동으로 테스트를 실행하고, 앱을 빌드하고, 파일을 서버에 업로드하고 있나요? 작동은 하지만 느리고 오류가 발생하기 쉬우며 확장성이 없습니다. 바로 이때 CI/CD 파이프라인이 필요합니다.

이 가이드에서는 CI/CD 개념을 분석하고 GitHub Actions로 실제 파이프라인을 구축하는 방법을 보여드립니다. 끝까지 읽으면 모든 프로젝트에 대해 테스트, 빌드, 배포를 자동화하는 방법을 이해하게 될 것입니다.

CI/CD란 무엇인가?

CI(지속적 통합)는 코드 변경 사항을 자동으로 테스트하고 공유 브랜치에 병합하는 관행입니다. 모든 푸시가 빌드와 테스트 실행을 트리거하여 통합 문제를 조기에 발견합니다.

CD(지속적 전달/배포)는 CI를 확장하여 애플리케이션을 자동으로 준비하고(선택적으로 배포) 프로덕션에 배포합니다. 지속적 전달은 코드가 항상 배포 준비가 되어 있음을 의미하고, 지속적 배포는 자동으로 배포됨을 의미합니다.

CI/CD는 함께 파이프라인을 형성합니다. 즉, 코드를 커밋에서 프로덕션까지 가져가는 일련의 자동화된 단계입니다.

CI/CD에 GitHub Actions를 사용하는 이유

GitHub Actions는 GitHub에 내장된 CI/CD 플랫폼입니다. 공개 저장소에서는 무료이며 비공개 저장소에도 넉넉한 사용 시간을 제공합니다. 주요 이점:

GitHub Actions의 핵심 개념

첫 워크플로를 작성하기 전에 다음 용어를 이해하세요:

용어 설명
워크플로 .github/workflows/ 아래 YAML 파일에 정의된 자동화된 프로세스입니다.
이벤트 워크플로를 시작하는 트리거입니다(예: push, pull_request).
잡 동일한 러너에서 실행되는 단계 집합입니다. 잡은 기본적으로 병렬로 실행됩니다.
단계 잡 내의 단일 작업입니다. 명령을 실행하거나 액션을 사용할 수 있습니다.
액션 단계에 포함할 수 있는 재사용 가능한 코드 단위입니다(예: actions/checkout).
러너 잡을 실행하는 가상 머신입니다(Ubuntu, Windows, macOS).

첫 CI 파이프라인 구축하기

Node.js 프로젝트를 위한 기본 CI 워크플로를 만들어 보겠습니다. 메인 브랜치에 대한 모든 푸시와 풀 리퀘스트에서 테스트를 실행합니다.

.github/workflows/ci.yml을 생성하세요:

name: CI

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

jobs:
  test:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [18.x, 20.x]

    steps:
    - uses: actions/checkout@v4
    - name: Use Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v4
      with:
        node-version: ${{ matrix.node-version }}
    - run: npm ci
    - run: npm test

이 워크플로는:

  1. main에 대한 푸시와 PR에서 트리거됩니다.
  2. 최신 Ubuntu 러너에서 test라는 잡을 실행합니다.
  3. 매트릭스를 사용하여 Node.js 18과 20에 대해 테스트합니다.
  4. 코드를 체크아웃하고, Node를 설정하고, 의존성을 설치하고, 테스트를 실행합니다.

이 파일을 푸시하고 Actions 탭을 확인하세요. 두 개의 병렬 잡(Node 버전당 하나)이 표시됩니다. 테스트가 실패하면 워크플로가 실패하고 GitHub에서 알림을 보냅니다.

지속적 배포 추가하기

CI도 훌륭하지만 CD에서 자동화가 빛을 발합니다. 메인 브랜치에서 테스트가 통과한 후 서버에 배포하도록 워크플로를 확장해 보겠습니다.

test에 의존하고 main에 대한 푸시에서만 실행되는 deploy 잡을 추가합니다.

  deploy:
    needs: test
    if: github.ref == 'refs/heads/main' && github.event_name == 'push'
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v4
    - name: Deploy to server
      uses: appleboy/ssh-action@v1.0.0
      with:
        host: ${{ secrets.SSH_HOST }}
        username: ${{ secrets.SSH_USER }}
        key: ${{ secrets.SSH_KEY }}
        script: |
          cd /var/www/myapp
          git pull origin main
          npm ci --production
          pm2 restart myapp

핵심 사항:

이 패턴은 SSH, Docker 레지스트리, 클라우드 플랫폼(AWS, Vercel, Netlify), Kubernetes 등 다양한 배포 대상에 적용됩니다.

GitHub Actions를 사용한 CI/CD 모범 사례

실패한 워크플로 디버깅

워크플로가 실패하면 GitHub는 각 단계에 대한 로그를 보여줍니다. 일반적인 문제는 다음과 같습니다:

저장소 시크릿 ACTIONS_STEP_DEBUG를 true로 설정하여 디버그 로깅을 활성화할 수도 있습니다.

FAQ

CI와 CD의 차이점은 무엇인가요?

CI는 코드 변경의 테스트와 통합을 자동화합니다. CD는 해당 변경 사항을 환경에 전달하거나 배포하는 것을 자동화합니다. CI는 코드 품질을 보장하고, CD는 변경 사항이 사용자에게 빠르고 안정적으로 도달하도록 보장합니다.

GitHub Actions는 무료인가요?

GitHub Actions는 공개 저장소에서 무료입니다. 비공개 저장소의 경우 매월 무료 사용 시간(예: 무료 계정의 경우 2,000분)이 제공되며 추가 사용량에 대해 비용을 지불합니다. 자체 호스팅 러너도 옵션입니다.

GitHub 프로젝트가 아닌 경우에도 GitHub Actions를 사용할 수 있나요?

네, GitHub Actions는 모든 명령줄 도구를 실행할 수 있습니다. 코드가 GitHub에 있거나 액션을 사용하여 가져오는 한 다른 곳에 호스팅된 프로젝트를 빌드하고 배포하는 데 사용할 수 있습니다.

CI/CD를 간소화할 준비가 되셨나요? GitHub Actions로 테스트를 자동화하는 것부터 시작하세요. 배포 로그를 빠르게 분석하려면 각 배포 후 오류와 성능 문제를 발견할 수 있는 Nginx Log Analyzer를 사용해 보세요.