Featured image of post 캐싱을 사용하여 GitHub Actions CI/CD 워크플로 가속화Featured image of post 캐싱을 사용하여 GitHub Actions CI/CD 워크플로 가속화

캐싱을 사용하여 GitHub Actions CI/CD 워크플로 가속화

npm 모듈, pip 패키지 및 Cargo 빌드 대상을 캐싱하여 GitHub Actions 빌드 단계를 최적화하세요.

CI/CD 워크플로 시간 최적화는 개발자 생산성에 직접적인 영향을 미치고 컴퓨팅 비용을 절감합니다. 이 문서에서는 GitHub Actions에 종속성 캐싱을 통합하여 컴파일 및 패키지 설정 시간을 단축하는 방법을 보여줍니다.

우리는 최적의 캐시 적중을 보장하기 위한 모범 사례와 함께 Node.js, Python 및 Rust용 YAML 워크플로 템플릿을 제공합니다.


1. CI/CD에 캐시 종속성이 있는 이유는 무엇입니까?

CI 에이전트가 캐싱 없이 시작되면 깨끗한 컨테이너를 가동하고 패키지 레지스트리에서 모든 종속성을 가져옵니다. 이로 인해 몇 가지 단점이 발생합니다.

  1. 비효율적인 개발 루프: 개발자는 코드를 테스트하기 전에 표준 라이브러리가 설치될 때까지 기다리는 귀중한 시간을 낭비합니다.
  2. 네트워크 위험: npm, PyPI 또는 crates.io가 약간의 가동 중지 시간을 겪는 경우 외부 네트워크 문제로 인해 빌드가 실패합니다.
  3. 실행 비용: 프라이빗 리포지토리에서 GitHub는 모든 활성 시간(분)에 대해 요금을 청구합니다. 빌드 속도가 빨라지면 운영 비용이 직접 절감됩니다.

캐싱을 사용하면 파이프라인이 실행 전반에 걸쳐 다운로드한 리소스를 재사용할 수 있으므로 후속 실행이 최대 80% 더 빠르게 실행됩니다.


2. 주요 언어용 YAML 템플릿

2026년에는 GitHub의 기본 언어 설정 작업에 내장된 캐싱 지원이 포함되어 구성이 간단해집니다.

1) Node.js (npm / pnpm / 원사)

actions/setup-node에서 cache 속성을 구성합니다.

name: Node.js CI

on: [push, pull_request]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Code
        uses: actions/checkout@v4

      - name: Setup Node
        uses: actions/setup-node@v4
        with:
          node-version: '20'
          cache: 'npm' # Supports npm, yarn, or pnpm

      - name: Install Packages
        run: npm ci

      - name: Run Tests
        run: npm test

2) 파이썬(pip/시)

Python 환경의 경우 actions/setup-pythoncache 키를 사용하여 캐싱을 활성화합니다.

name: Python Test Runner

on: [push]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: '3.11'
          cache: 'pip' # Supports pip, poetry, or pipenv
      - name: Install Dependencies
        run: pip install -r requirements.txt
      - name: Run Linter
        run: flake8 .

3) 러스트(화물)

Rust 컴파일은 매우 느립니다. Cargo 종속성과 중간 빌드 아티팩트(/target 디렉터리)를 캐시하려면 커뮤니티 표준 swatinem/rust-cache을 사용하세요.

name: Rust CI

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Setup Rust compiler
        uses: actions/setup-rust@v1
      - name: Configure Cargo Cache
        uses: swatinem/rust-cache@v2
      - name: Execute Tests
        run: cargo test

3. 사용자 정의 캐싱 및 문제 해결

기본 작업으로 처리되지 않는 폴더의 경우 actions/cache을 사용하여 수동으로 정의합니다.

- name: Cache Custom Files
  uses: actions/cache@v4
  with:
    path: ~/.my-custom-cache
    key: ${{ runner.os }}-custom-${{ hashFiles('**/lockfile.json') }}
    restore-keys: |
      ${{ runner.os }}-custom-
  • key: 캐시의 고유 식별자입니다. hashFiles 함수는 잠금 파일(package-lock.json, Cargo.lock 등)의 해시를 생성합니다. 잠금 파일이 변경되면 이전 캐시가 무효화되고 새로운 캐시가 구축됩니다.
  • restore-keys: 정확한 캐시 적중이 발견되지 않은 경우 대체할 접두사 키의 정렬된 목록입니다.

캐시 누락 방지

  1. 잠금 파일 커밋: Git에서 잠금 파일이 추적되는지 확인합니다. 그렇지 않으면 해시가 변동되어 캐시 누락이 자주 발생합니다.
  2. 트랙 캐시 크기: GitHub는 캐시 저장 공간을 저장소당 10GB로 제한합니다. 이 제한을 초과하면 GitHub는 오래된 캐시를 자동으로 제거합니다. 캐시 경로에서 불필요한 빌드 아티팩트를 제외하세요.

4. 요약

작업 캐싱을 구성하는 것은 소프트웨어 파이프라인을 최적화하는 가장 쉬운 방법 중 하나입니다. 이러한 변경 사항을 구현하면 매주 팀 전체의 대기 시간을 절약할 수 있습니다. 지금 YAML 워크플로를 확인하고 캐싱을 통합하세요.