Yarn 캐싱으로 GitHub Actions에서 CI/CD 최적화 하기

MNIII
5 min readNov 5, 2023

--

개발 팀이 CI/CD 파이프라인을 구축 하면서 고민해야 하는 것중 하나는 빌드 시간을 최소화하는 것이다. 빌드 시간 지연은 생산성을 떨어뜨리고 개발 팀의 시간을 낭비하게 한다. GitHub Actions에서 Yarn 캐싱을 사용하여 CI/CD 과정을 최적화 해보자.

GitHub Actions와 Yarn 캐싱

GitHub Actions는 개발자가 소프트웨어 개발 워크플로우를 자동화할 수 있게 해주는 도구 이다. 코드의 통합, 테스트 실행, 배포와 같은 작업들이 포함된다. Yarn은 JavaScript 패키지 매니저로 프로젝트의 종속성 관리를 쉽게 해 준다. Yarn을 사용하면 의존성을 캐시 하여 더 빠르게 설치할 수 있다. 이 기능을 GitHub Actions 워크플로우와 통합해서 매번 의존성을 처음부터 다시 다운로드하는 시간을 줄일 수 있다.

Node.js 설정과 Yarn 캐싱

CI/CD 파이프라인에서 node_modules를 캐싱하기 위해 아래와 같은 GitHub Actions 워크플로우 설정을 사용할 수 있다.

// ...

- name: Setup Node 18.16.x
uses: actions/setup-node@v2
with:
node-version: '18.16.x'
cache: 'yarn'

- name: Set Yarn Version
id: set-version
run: |
yarn set version 3.6.4
echo "YARN_VERSION=$(yarn -v)" >> $GITHUB_OUTPUT

- name: Get cache dir path
id: yarn-cache-dir-path
run: echo "CACHE_DIR=$(yarn config get cacheFolder)" >> $GITHUB_OUTPUT

- name: Yarn cache
uses: actions/cache@v2
id: yarn-cache
with:
path: ${{ steps.yarn-cache-dir-path.outputs.CACHE_DIR }}
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}-${{ steps.set-version.outputs.YARN_VERSION }}
restore-keys: |
${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}-

- name: Install dependencies
run: |
CACHE_HIT="${{ steps.yarn-cache.outputs.cache-hit }}"
NODE_MODULES_EXISTS=$(test -d "node_modules" && echo "true" || echo "false")
if [[ "$CACHE_HIT" != 'true' || "$NODE_MODULES_EXISTS" == 'false' ]]; then
yarn install
fi

// ...

위 설정은 GitHub Actions가 Node.js를 설치하고 Yarn 버전을 Berry 로 설정한 후 캐시 경로를 가져와서 해당 경로를 캐시 하여 필요할 때만 의존성을 설치 하도록 한다.

Yarn Plug n Play (PnP) 사용하기

Yarn의 Plug n Play 기능을 사용하는 경우 node_modules 대신 PnP 방식을 활용하여 의존성을 관리하게 된다. PnP는 의존성 파일을 시스템에 설치하지 않고 프로젝트 설정에서 직접 참조하여 사용하는 방식으로 파일 시스템의 부하를 줄이고 의존성 충돌 문제를 방지할 수 있다. PnP를 사용할 때의 GitHub Actions 설정은 다음과 같이 할 수 있다.

// ...

- name: Setup Node
uses: actions/setup-node@v2
with:
node-version: '18.16.x'

- name: Set Yarn Version
id: set-version
run: |
yarn set version 3.6.4
echo "YARN_VERSION=$(yarn -v)" >> $GITHUB_OUTPUT

- name: Yarn Cache - PnP
uses: actions/cache@v2
with:
path: |
.yarn/cache
.pnp.*
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}-${{ steps.set-version.outputs.YARN_VERSION }}
restore-keys: |
${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}-

- name: Install dependencies
run: yarn install

// ...

이 설정은 .yarn/cache 디렉토리와 .pnp.* 파일을 캐시 하므로, Yarn은 자동으로 PnP를 사용하여 의존성을 관리하게 된다.

GitHub Actions와 Yarn의 결합은 이러한 관리 과정을 간소화하고 가속화하는 데 중요한 역할을 한다. Yarn 캐싱 기능은 CI/CD 파이프라인의 속도를 높이는데 기여할 뿐만 아니라 개발자가 더 중요한 문제 해결에 집중할 수 있도록 돕는다.

이러한 최적화 방법을 통해서 프로젝트에 캐싱을 적용하고 개발 및 배포 과정에서 발생할 수 있는 작은 지연들을 줄여나갈 수 있으면 좋겠다.

--

--