한양과학기술고등학교

에듀테크 프로젝트 대시보드

CI/CD 파이프라인

CI/CD 파이프라인

개발자가 코드를 푸시하면, 사람이 손대지 않아도 서버가 자동으로 빌드 → 테스트 → 배포까지 끝낸다. CI(지속적 통합, Continuous Integration)는 여러 사람이 커밋한 코드를 자주 합치고 자동 테스트로 즉시 검증하는 것이고, CD는 그 검증된 결과물을 지속적 전달(Continuous Delivery, 배포 직전까지 자동화하고 배포는 버튼 한 번) 하거나 지속적 배포(Continuous Deployment, 그 버튼조차 없이 자동 배포)하는 것을 뜻한다. 아래에서 파이프라인이 단계별로 진행되는 과정과, 중간에 테스트가 실패하면 무슨 일이 벌어지는지 직접 실행해 보자.

인터랙티브 데모

파이프라인 로그

제어판

상태대기 중
경과 단계0 / 7

CI vs Delivery vs Deployment

Continuous Integration

여러 개발자의 브랜치를 자주(하루에도 여러 번) 합치고, 합칠 때마다 자동으로 빌드·테스트를 돌려 "내 코드는 되는데 합치니까 깨진다"를 조기에 잡는다. 여기까지가 CI.

Continuous Delivery

CI를 통과한 결과물을 언제든 배포 가능한 상태로 스테이징까지 자동으로 올려둔다. 다만 프로덕션으로 내보내는 마지막 버튼은 사람이 누른다 (승인 게이트).

Continuous Deployment

승인 게이트마저 없앤다. 테스트를 통과하면 사람 개입 없이 곧바로 프로덕션까지 나간다. 대신 카나리·블루-그린 같은 안전장치가 필수가 된다.

파이프라인 설정 예시 (YAML)

# .github/workflows/ci-cd.yml — 커밋이 push 될 때마다 실행
on: [push]
jobs:
  build-and-test:
    runs-on: ubuntu-latest
    steps:
      - run: lint .                 # 코드 스타일 검사
      - run: build                  # 컴파일 / 번들링
      - run: test --unit           # 단위 테스트
      - run: test --integration    # 통합 테스트
  deploy-staging:
    needs: build-and-test        # 앞 단계가 성공해야만 실행
    run: deploy --env=staging
  deploy-production:
    needs: deploy-staging
    environment:
      name: production
      required-reviewers: ["release-manager"]  # 수동 승인 게이트
    run: deploy --env=production

현실에서는

  • 실패는 빠를수록 싸다: 린트에서 잡을 실수를 통합 테스트까지 끌고 가면 디버깅 비용이 커진다. 그래서 파이프라인은 보통 빠르고 저렴한 검사(린트)를 앞에, 느리고 비싼 검사(통합 테스트, 배포)를 뒤에 배치해 앞 단계에서 최대한 빨리 실패시킨다(fail fast).
  • 한 단계 실패 = 이후 단계 전부 중단: 테스트가 깨진 커밋이 프로덕션까지 가면 안 되므로, 실패한 단계 뒤의 모든 단계는 실행되지 않고 건너뛴다(skipped). 데모에서 실패 단계를 바꿔가며 확인해 보자.
  • 파이프라인도 코드다: GitHub Actions·GitLab CI·Jenkinsfile처럼 파이프라인 정의를 YAML/코드로 저장소에 함께 커밋한다(Pipeline as Code). 인프라 변경도 리뷰·버전 관리 대상이 된다.
  • 배포 전략과는 층이 다르다: CI/CD는 "코드가 검증을 거쳐 나가는 자동화 과정"이고, 카나리·블루-그린은 그 마지막 배포 단계를 "어떻게 안전하게" 내보낼지에 대한 전략이다. Continuous Deployment는 특히 이런 안전장치와 짝을 이뤄야 한다.
  • 시크릿 관리: 파이프라인은 배포용 API 키·서버 비밀번호를 다루므로, 코드에 하드코딩하지 않고 CI 시스템의 암호화된 시크릿 저장소(예: GitHub Secrets)에 넣어 단계별 실행 환경에만 주입한다.