Cache와 Artifact 한 줄 정의
GitHub Actions에서 Cache는 워크플로우 실행 간 의존성 파일을 재사용하기 위한 임시 저장소이고, Artifact는 워크플로우 실행 결과물을 보관하고 공유하기 위한 저장소다.
Cache: 빌드 속도를 위한 의존성 저장
정의
Cache는 actions/cache 액션을 통해 의존성이나 빌드 도구를 키-값 쌍으로 저장하는 메커니즘이다. 같은 키로 저장된 파일은 이후 워크플로우 실행에서 다시 다운로드하지 않고 복원할 수 있다.
원리
Cache는 저장 시 지정한 키(예: npm-${{ hashFiles('package-lock.json') }})와 경로를 기반으로 동작한다. 워크플로우 실행 시 해당 키가 존재하면 캐시를 복원하고, 없으면 의존성을 새로 설치한 뒤 저장한다. 저장 용량은 리포지토리당 10GB까지 가능하며, 7일간 접근이 없으면 자동 삭제된다.
예시
Node.js 프로젝트에서 npm install을 실행할 때마다 수백 개의 패키지를 다운로드하면 시간이 오래 걸린다. Cache를 사용하면 node_modules 디렉토리를 저장해두고, package-lock.json이 변경되지 않았다면 이전 실행에서 저장한 파일을 그대로 사용할 수 있다.
- uses: actions/cache@v4
with:
path: ~/.npm
key: npm-${{ hashFiles('**/package-lock.json') }}
오해
Cache에는 다시 생성할 수 있는 의존성이나 중간 빌드 출력을 저장할 수 있다. 다만 캐시는 정책에 따라 삭제될 수 있으므로 배포 파일, 테스트 리포트처럼 보존하거나 전달해야 하는 최종 결과물의 유일한 저장소로 사용하면 안 된다.
Artifact: 워크플로우 결과물 보관과 공유
정의
Artifact는 actions/upload-artifact와 actions/download-artifact 액션을 통해 워크플로우 실행 중 생성된 파일을 저장하고 다른 작업(job)이나 외부에서 다운로드할 수 있게 하는 저장소다.
원리
Artifact는 각 워크플로우 실행마다 독립적으로 저장되며, GitHub UI에서 직접 다운로드하거나 API로 접근할 수 있다. 기본 보관 기간은 90일이며, 리포지토리 설정에서 변경 가능하다. 같은 워크플로우 내 다른 job 간 파일을 전달하거나, CI/CD 파이프라인의 최종 결과물을 배포 전에 검토하는 용도로 사용된다.
예시
테스트 커버리지 리포트를 생성하는 job과 이를 분석하는 job이 분리되어 있을 때, 첫 번째 job에서 리포트를 Artifact로 업로드하고 두 번째 job에서 다운로드해 사용할 수 있다.
- uses: actions/upload-artifact@v4
with:
name: coverage-report
path: coverage/
다른 job에서는 다음과 같이 다운로드한다.
- uses: actions/download-artifact@v4
with:
name: coverage-report
오해
Artifact를 매 실행마다 생성되는 임시 로그나 디버그 파일을 무제한으로 저장하는 용도로 사용하면 저장 용량이 빠르게 소진된다. Artifact는 의도적으로 보관해야 할 결과물에만 사용해야 한다.
선택 기준
재사용 vs 결과물
Cache는 다음 실행에서 재사용할 파일(의존성, 컴파일된 바이너리, 빌드 도구)에 적합하다. Artifact는 현재 실행의 결과물(빌드된 애플리케이션, 테스트 리포트, 로그 파일)을 보관하거나 공유할 때 사용한다.
생명주기
Cache는 7일간 미사용 시 자동 삭제되며, 같은 키로 새로 저장하면 덮어쓴다. Artifact는 워크플로우 실행마다 고유하게 저장되고 보관 기간이 명확하게 정해져 있다.
접근 방식
Cache는 워크플로우 내에서만 자동 복원되며 외부에서 직접 다운로드할 수 없다. Artifact는 GitHub UI나 API를 통해 누구나(권한이 있다면) 다운로드할 수 있다.
핵심 원리 정리
Cache는 키 기반으로 동작하며 성능 최적화가 목적이다. 같은 의존성을 반복해서 다운로드하지 않도록 하여 워크플로우 실행 시간을 단축한다. Artifact는 워크플로우 실행마다 독립적으로 생성되며, 결과물을 보관하고 공유하는 것이 목적이다.
두 메커니즘 모두 저장 용량 제한이 있으므로, Cache는 빌드 도구와 의존성에만, Artifact는 필요한 결과물에만 사용해야 저장소 용량을 효율적으로 관리할 수 있다.
흔한 오해
Cache를 결과물 저장에 사용
다시 생성 가능한 중간 빌드 출력은 Cache 후보가 될 수 있지만, 중요한 배포 파일이나 검토해야 할 결과물은 Artifact로 보관해야 한다. Cache 적중 실패만으로 결과물이 사라지는 구조를 만들지 않는 것이 핵심이다.
Artifact를 job 간 의존성 전달에만 사용
Artifact는 job 간 파일 전달뿐 아니라 외부 다운로드, 장기 보관, 규정 준수 목적으로도 사용할 수 있다. Cache는 job 간 파일 전달 용도로 설계되지 않았다.
모든 파일을 캐시하면 빠르다
불필요한 파일까지 캐시하면 저장과 복원에 오히려 시간이 더 걸릴 수 있다. 의존성 디렉토리나 컴파일된 라이브러리처럼 재생성 비용이 큰 파일만 선택적으로 캐시해야 한다.
이해 확인 요약
- Cache는 의존성 재사용을 통한 속도 개선, Artifact는 결과물 보관과 공유가 목적이다.
- Cache는 키 기반 자동 복원, Artifact는 워크플로우 실행마다 독립 저장된다.
- Cache는 7일 미사용 시 삭제, Artifact는 설정된 보관 기간(기본 90일) 동안 유지된다.
- Cache는 워크플로우 내부에서만 접근 가능, Artifact는 UI/API로 외부 다운로드 가능하다.
- 재사용할 파일은 Cache, 보관·공유할 결과물은 Artifact를 선택한다.
