본문 바로가기
카테고리 없음

CI/CD 파이프라인에서 느려지는 빌드 문제 해결기

by 백수A 2025. 4. 9. 15:07

CI/CD 파이프라인에서 느려지는 빌드 문제 해결기

1. 문제 상황: 느려지는 CI/CD 빌드 속도

CI/CD 파이프라인을 구축한 지 얼마 지나지 않아, 전체 빌드 시간이 점점 길어지기 시작했다. 초기에는 코드 변경 후 약 3~5분 정도면 배포가 완료됐지만, 어느 순간부터 15분 이상 걸리는 일이 잦아졌다.

문제가 심각해진 상황은 다음과 같았다.

  • 개발자들의 커밋마다 느린 빌드로 인해 병목 발생
  • 병렬 빌드 대기열이 쌓이며 배포 지연 발생
  • 긴 빌드 시간으로 인해 QA 반영 속도 저하

파이프라인은 GitHub Actions와 self-hosted runner 기반으로 구성되어 있었고, Docker 이미지를 빌드하고 테스트를 수행한 뒤 Kubernetes 클러스터에 배포하는 방식이었다.

2. 원인 진단: 어디에서 병목이 발생하고 있는가?

2.1 GitHub Actions 로그 분석

가장 먼저 수행한 것은 각 단계별 로그의 시간 측정이었다. GitHub Actions의 Job별 시간과 Step별 소요 시간을 확인한 결과 다음과 같은 결과가 나왔다.

  • 의존성 설치 단계에서 평균 3~5분 소요
  • Docker 이미지 빌드가 평균 7분 이상 소요
  • 유닛 테스트는 1분 이내로 완료됨

2.2 Docker 캐시 미활용

가장 많은 시간을 차지한 Docker 빌드 단계에서는 캐시가 매번 무효화되고 있었다. 베이스 이미지가 종속성과 함께 재빌드되고 있었고, Dockerfile 내부에서도 캐시 활용 순서가 비효율적이었다.

2.3 Self-hosted Runner 병렬성 부족

GitHub Actions의 Self-hosted Runner는 2개만 운영 중이었고, 동시에 3개 이상의 커밋이 push되면 Queue가 쌓이기 시작했다. 또한 빌드 자원이 메모리와 CPU 측면에서 과도하게 사용되고 있었다.

3. 해결 과정: 파이프라인 최적화 전략

3.1 Docker 캐시 전략 개선

먼저 Dockerfile을 최적화하여 캐시를 적극 활용할 수 있도록 수정했다. 종속성 설치 단계를 최대한 상단으로 옮겨 캐시가 유지되도록 구성했다.

FROM node:18 AS builder

WORKDIR /app
COPY package*.json ./
RUN npm ci

COPY . .
RUN npm run build

또한 GitHub Actions에서 cache-from을 활용해 이전 빌드 결과를 재활용하도록 설정했다.

      - name: Build Docker Image with Cache
        run: |
          docker build --cache-from=type=gha \
                       --tag my-app:${{ github.sha }} .

3.2 종속성 캐싱 적용

Node.js의 경우 node_modules 또는 ~/.npm 디렉토리를 캐싱하여 의존성 설치 시간을 단축했다.

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

3.3 병렬 처리와 조건 분기 도입

테스트와 빌드 Job을 분리하여 병렬로 실행되도록 했다. 또한 코드 변경에 따라 실행 단계를 분기하도록 구성했다. 예를 들어 문서만 변경된 경우에는 테스트와 빌드를 생략했다.

if: "!contains(github.event.head_commit.message, '[docs]')"

3.4 Self-hosted Runner 확장 및 모니터링

Runner를 2대에서 4대로 확장하고, EC2 Spot Instance를 활용해 비용은 유지하면서도 성능은 개선했다. 또한 Runner 상태를 CloudWatch와 Grafana로 모니터링하도록 구성했다.

4. 최적화 결과 및 정리

이러한 조치 결과, CI/CD 파이프라인의 평균 빌드 시간은 다음과 같이 단축되었다.

  • 기존 평균 빌드 시간: 16분 → 최적화 후 평균: 5분 20초
  • 의존성 설치 시간: 4분 → 40초
  • Docker 빌드 시간: 7분 → 2분 이하

빌드 속도가 개선되면서 QA 반영 주기도 빨라졌고, 개발자 만족도도 눈에 띄게 상승했다. 최종적으로 정리하면 다음과 같다.

핵심 정리

  • Step별 시간을 기록하고 병목 지점을 먼저 파악
  • Docker 캐시, 의존성 캐시 전략으로 속도 개선
  • Job 병렬화 및 조건 분기로 낭비 최소화
  • Runner 자원을 유동적으로 확장하여 처리량 확보

CI/CD 파이프라인은 자동화의 핵심이지만, 관리하지 않으면 속도가 오히려 생산성의 발목을 잡는다. 정기적인 분석과 개선이 필수적이다.