CI 파이프라인 해설

하이솝·2026년 5월 27일

소프트웨어공학

목록 보기
19/27

CI (Continuous Integration)

역할

코드 품질 검사

  • 스타일 규칙 위반
  • 보안 취약점
  • 각 함수/모듈
  • 모듈끼리의 연동

4가지 검사

1) 린트

  • ESLint를 통한 코딩 스타일 검사

2) 보안

  • npm audit를 통한 보안 취약점 검사

3) 단위 테스트

  • Jest를 통한 각 함수 검증

4) 통합 테스트

  • Jest + jsdom을 통한 모듈 연동 검증
    jsdom: Node.js안에서 가상의 브라우저 DOM을 흉내내는 라이브러리

4개의 검사는 서로 의존하지 않으며, 병렬로 실행됨
하나라도 실패하면 merge 불가능

Part 1.

워크플로우 이름

# CI - PR이 열릴 때, 그리고 main에 push될 때 자동으로 실행
name: CI
  • #: 주석으로 YAML이 무시하지만, 사람이 읽을 때 도움
  • name: CI-workflow의 이름을 CI로 지정
  • GitHub의 Actions 탭에 name이 그대로 표시됨

두 가지 트리거

on: 
  pull_request:
    branches: [main]
  push:
    branches: [main]
  • main에 대해 push, PR 이벤트 발생 시 실행됨
    PR: merge 전 검사
    push: merge 후 검사 → main과 기능이 섞일 수 있기 때문

  • CD는 push만 트리거

Part 2.

Job 1. lint + checkout

jobs:
  lint:
    name: 1) 린트 검사 (ESLint)
    runs-on: ubuntu-latest
  steps:
    - uses: actions/checkout@v4
  • lint: 이 job의 고유 ID
  • name: UI에 보이는 이름 (한글도 가능)
  • runs-on: ubuntu-latest: 최신 우분투 가상머신 사용
  • actions/checkout@v4: 저장소 코드를 가상머신으로 다운로드

Node 설치 + 의존성 설치

- uses: actions/setup-node@v4
  with:
    node-version: "20"
    cache: "npm"
- run: npm ci

Lint 실행

- run: npm run lint
  • 위반 사항 발견 시 0이 아닌 종료 코드 → step 실패 → job 실패
  • 미사용 변수, 들여쓰기, 따옴표 스타일, 세미콜론 누락, == 대신 === 권장

Part 3.

Job 2. security 정의 + 준비

security:
  name: 2) 보안 검사 (npm audit)
  runs-on: ubuntu-latest
  steps:
    - uses: actions/checkout@v4
    - uses: actions/setup-node@v4
    with:
      node-version: "20"
      cache: "npm"
    - run: npm ci
  • 의존성 패키지의 보안 취약성을 검사하는 작업

  • 각 job은 완전히 새로운 가상 머신에서 실행하기 때문에
    모든 준비를 처음부터 다시 해야 함
    job 1.에서 설치한 것들을 다시 설치하는 이유

보안 검사 실행

- run: npm run audit
  • 내부적으로 npm audit --audit-level=high 같은 명령을 호출

  • 심각도가 높은 취약점이 발견되면 0이 아닌 종료 코드 → job 실패

  • npm run audit != npm audit
    두 명령어는 서로 다른 명령임

Part 4.

Job 3. unit-test 정의 + 준비

unit-test:
  name: 3) 단위 테스트 (Jest)
  runs-on: ubuntu-latest
  steps:
  - uses: actions/checkout@v4
  - uses: actions/setup-node@v4
    with:
      node-version: "20"
      cache: "npm"
  - run: npm ci

단위 테스트 실행

- run: npm run test:unit

검증 대상

  • 순수 함수의 입출력
    add(2, 3) == 5 인지 확인

  • 유틸리티 함수의 동작
    formatDate('2026-04-30')의 결과 검증

  • 예외 처리
    divide(1, 0)이 에러를 던지는지 확인

  • 경계값(edge case)
    빈 배열, null, undefined 입력 시 동작

DB, 네트워크, 파일 시스템은 사용하지 않음
빠르고 환경에 관계없이 같은 결과가 나옴

Part 5.

Job 4. integration-test 정의

integration-test:
  name: 4) 통합 테스트 (Jest + jsdom)
  runs-on: ubuntu-latest
  steps:
    - uses: actions/checkout@v4
    - uses: actions/setup-node@v4
      with:
        node-version: "20"
        cache: "npm"
    - run: npm ci

통합 테스트 실행

- run: npm run test:integration
  • jsdomdocument나 윈도우 브라우저 객체를 가짜로 만들어줌
    Node.js는 서버용이라 document나 윈도우 같은 브라우저 객체가 없음
    실제 브라우저를 띄우지 않고도 dom 조작 코드를 실행할 수 있게 해줌

  • E2E 테스트(Playwright)보다 훨씬 빠르고, 단위 테스트보다 현실적
    E2E 테스는 Docker 컨테이너를 실제로 띄워야 하기 때문에 무겁고 느림
    보통 CI에서는 가볍고 빠른 검사를 진행함

단위 테스트 vs 통합 테스트 차이

4개 Job의 공통 패턴

# 모든 job의 공통 패턴
steps:
  - uses: actions/checkout@v4
  - uses: actions/setup-node@v4
    with:
      node-version: "20"
      cache: "npm"
  - run: npm ci
  - run: npm run XXX

핵심 키워드

자주 만나는 오류

0개의 댓글