wan의 개발일기

GitHub Actions으로 CI/CD 입문 본문

Git, Github/Github 심화

GitHub Actions으로 CI/CD 입문

wan_ 2026. 5. 3. 03:02

들어가며

GitHub Actions를 이전에 몇 번 써봤는데 yml 파일 구조를 정확히 이해하지 못하고 복붙해서 쓰는 수준이었다.
핵심 개념과 구조를 제대로 정리해둔다.


GitHub Actions란?

GitHub 저장소에서 특정 이벤트가 발생했을 때 자동으로 워크플로우를 실행하는 CI/CD 플랫폼이다.
별도 서버 없이 GitHub 안에서 빌드, 테스트, 배포를 자동화할 수 있다.


핵심 개념

개념 설명
Workflow 자동화된 프로세스 전체. .github/workflows/*.yml에 정의
Event 워크플로우를 트리거하는 조건 (push, PR, schedule 등)
Job 워크플로우 안의 작업 단위. 각 Job은 독립된 Runner에서 실행
Step Job 안의 개별 실행 단계
Action 재사용 가능한 Step 단위
Runner Job이 실행되는 서버 환경 (GitHub 제공 또는 self-hosted)

기본 구조

# .github/workflows/ci.yml

name: CI

on:                          # 트리거 이벤트
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build:                     # Job 이름
    runs-on: ubuntu-latest   # Runner 환경

    steps:
      - name: 코드 체크아웃
        uses: actions/checkout@v4

      - name: Node.js 설정
        uses: actions/setup-node@v4
        with:
          node-version: '20'

      - name: 의존성 설치
        run: npm ci

      - name: 테스트 실행
        run: npm test

주요 트리거 이벤트

on:
  # push 시 실행
  push:
    branches: [ main, develop ]
    paths:
      - 'src/**'           # 특정 경로 변경 시만 실행

  # PR 시 실행
  pull_request:
    branches: [ main ]
    types: [ opened, synchronize, reopened ]

  # 스케줄 실행 (매일 오전 9시 UTC)
  schedule:
    - cron: '0 9 * * *'

  # 수동 실행
  workflow_dispatch:
    inputs:
      environment:
        description: '배포 환경'
        required: true
        default: 'staging'

실전 예시

Node.js CI

name: Node.js CI

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

jobs:
  test:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [18, 20, 22]   # 여러 버전 병렬 테스트

    steps:
      - uses: actions/checkout@v4

      - name: Node.js ${{ matrix.node-version }} 설정
        uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node-version }}
          cache: 'npm'

      - run: npm ci
      - run: npm run build
      - run: npm test

자동 배포 (main push 시)

name: Deploy

on:
  push:
    branches: [ main ]

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: 빌드
        run: npm ci && npm run build

      - name: S3 배포
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        run: |
          aws s3 sync ./dist s3://my-bucket --delete

환경 변수와 Secrets

민감한 정보는 코드에 직접 넣지 않고 GitHub Secrets에 저장한다.

저장소 → Settings → Secrets and variables → Actions → New repository secret
steps:
  - name: 환경 변수 사용
    env:
      API_KEY: ${{ secrets.API_KEY }}
      NODE_ENV: production
    run: echo "배포 시작"

Job 간 의존성

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - run: npm test

  deploy:
    runs-on: ubuntu-latest
    needs: test          # test Job이 성공해야 실행
    steps:
      - run: npm run deploy

캐시 활용

의존성을 매번 설치하면 시간이 오래 걸린다. cache 옵션으로 속도를 개선할 수 있다.

- name: Node.js 설정
  uses: actions/setup-node@v4
  with:
    node-version: '20'
    cache: 'npm'          # node_modules 캐시

정리

개념 설명
.github/workflows/*.yml 워크플로우 정의 파일 위치
on 트리거 이벤트 설정
jobs 실행할 작업 목록
runs-on Runner 환경 지정
uses 미리 만들어진 Action 사용
run 직접 실행할 명령어
secrets 민감한 정보 저장소
needs Job 간 의존성 설정

'Git, Github > Github 심화' 카테고리의 다른 글

Submodule & Monorepo 개념  (0) 2026.05.04
Git Hooks 활용하기  (0) 2026.05.03
오픈소스 기여하기 (fork, PR)  (0) 2026.05.03
GitHub Pages로 정적 사이트 배포  (0) 2026.05.03
GitHub Issues & Projects로 일감 관리  (0) 2026.05.03