🔍 검색 키워드: GitHub Actions npm ci 실패, npm ci can only install packages when your package.json and package-lock.json are in sync, npm ci package-lock.json 없음, EBADENGINE GitHub Actions, setup-node cache 설정, npm ci vs npm install CI
요약: GitHub Actions에서 npm ci가 실패하는 가장 흔한 원인은 package.json과 package-lock.json이 서로 맞지 않거나, lock 파일이 저장소에 없거나, Node 버전이 engines 조건과 맞지 않는 경우입니다. 로컬에서 npm install로 lock 파일을 갱신해 함께 커밋하고, workflow의 Node 버전을 package.json과 맞추면 해결됩니다.
npm ci는 npm install과 무엇이 다른가요?
npm ci는 CI처럼 재현 가능한 설치가 필요한 환경을 위한 명령입니다. package-lock.json을 기준으로 의존성을 정확히 설치하고, lock과 package.json이 맞지 않으면 아예 실패합니다. npm install은 이런 불일치를 조용히 고치면서 lock 파일을 수정하는 점이 다릅니다. 그래서 로컬에서는 멀쩡한데 CI에서만 실패하는 일이 생깁니다.
직접 재현한 결과
아래 출력은 로컬에서 직접 실행한 결과이며 GitHub Actions 러너에서 실행한 것은 아닙니다. 같은 npm 명령이므로 에러 메시지는 동일하게 나타납니다. 레지스트리에서 패키지를 내려받지 않도록 로컬 경로 의존성(file:)으로 재현했습니다.
- 환경: macOS 27.0.1, Node.js v20.20.2, npm 10.8.2
1) package.json과 lock 파일이 맞지 않는 경우
lock을 만든 뒤 package.json에 의존성을 추가하고 lock은 갱신하지 않은 상태입니다.
$ npm ci
npm error code EUSAGE
npm error
npm error `npm ci` can only install packages when your package.json and
npm error package-lock.json or npm-shrinkwrap.json are in sync. Please update your
npm error lock file with `npm install` before continuing.
npm error
npm error Missing: dep2@2.0.0 from lock file마지막 줄의 Missing 항목이 어떤 패키지가 lock에 없는지 알려 줍니다.
2) lock 파일이 저장소에 없는 경우
$ npm ci
npm error code EUSAGE
npm error
npm error The `npm ci` command can only install with an existing package-lock.json or
npm error npm-shrinkwrap.json with lockfileVersion >= 1. Run an install with npm@5 or
npm error later to generate a package-lock.json file, then try again..gitignore에 package-lock.json이 들어 있거나 커밋을 빠뜨린 경우입니다.
3) Node 버전이 engines 조건과 맞지 않는 경우
package.json에 engines.node가 >=22로 지정돼 있는데 Node 20으로 실행한 경우입니다. 엄격 모드(--engine-strict)를 켰을 때의 결과입니다.
$ npm ci --engine-strict
npm error code EBADENGINE
npm error engine Unsupported engine
npm error engine Not compatible with your version of node/npm: demo@1.0.0
npm error notsup Required: {"node":">=22"}직접 확인한 결과, engine-strict 없이 실행하면 같은 상황에서 npm warn EBADENGINE 경고만 출력되고 설치는 종료 코드 0으로 계속됩니다. 이 경우 실패는 이후 단계(빌드·테스트)에서 나타나므로 원인을 놓치기 쉽습니다.
어떻게 해결하나요?
lock 파일을 갱신해서 커밋하기
npm install
git add package.json package-lock.json
git commit -m "chore: sync package-lock.json"갱신 후 npm ci를 다시 실행하면 정상 설치됩니다. 직접 확인한 결과, 같은 프로젝트에서 npm install로 lock을 갱신한 뒤 npm ci가 dep, dep2를 모두 설치했습니다.
workflow의 Node 버전을 맞추기
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- run: npm ci
- run: npm testnode-version은 package.json의 engines나 .nvmrc와 같은 값을 쓰는 것이 안전합니다. 위 workflow는 일반적으로 쓰는 형태의 예시이며 이 글에서 실제 러너로 실행해 확인하지는 않았습니다.
setup-node의 cache 옵션과 lock 파일은 어떤 관계인가요?
actions/setup-node의 cache: npm 옵션은 lock 파일(package-lock.json 등)의 해시를 캐시 키로 사용합니다. 그래서 lock 파일이 없거나 하위 폴더에 있는 모노레포에서는 cache-dependency-path로 위치를 지정해야 합니다. 이 동작은 setup-node 공식 문서 기준 설명이며, 직접 재현하지는 않았습니다.
- uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
cache-dependency-path: apps/web/package-lock.json주의할 점
- npm ci는 node_modules를 먼저 삭제하고 설치합니다. 직접 확인한 결과, node_modules에 넣어 둔 임의의 파일이 npm ci 실행 후 사라졌습니다.
- CI에서 npm install로 바꿔서 에러를 넘기면 lock이 조용히 바뀌어 빌드 재현성이 깨집니다. 원인을 고치는 쪽이 낫습니다.
- 로컬과 CI의 npm 메이저 버전이 다르면 lock 파일 형식(lockfileVersion)이 달라질 수 있습니다. 팀에서 Node와 npm 버전을 통일하세요.
정리표
| 증상(에러 메시지) | 원인 | 해결 |
|---|---|---|
| EUSAGE ... are in sync / Missing: ... from lock file | package.json과 lock 불일치 | npm install 후 lock 커밋 |
| EUSAGE ... existing package-lock.json | lock 파일 없음 | lock 생성·커밋, .gitignore 확인 |
| EBADENGINE Unsupported engine | Node 버전이 engines와 불일치 | setup-node의 node-version 수정 |
자주 묻는 질문(FAQ)
로컬에서는 되는데 GitHub Actions에서만 npm ci가 실패하는 이유는 무엇인가요?
로컬에서는 npm install이 lock 불일치를 조용히 고치지만, CI의 npm ci는 불일치를 오류로 처리하기 때문입니다. lock 파일을 갱신해서 커밋하면 해결됩니다.
CI에서 npm install을 써도 되나요?
동작은 하지만 권장하지 않습니다. 설치 결과가 lock과 달라질 수 있어 재현성이 떨어집니다. 일반적으로 CI에서는 npm ci를 쓰고, 실패하면 원인을 고치는 방식을 권합니다.
package-lock.json은 커밋해야 하나요?
애플리케이션 프로젝트라면 커밋하는 것이 일반적입니다. npm ci가 lock 파일을 필요로 하기 때문입니다. npm 공식 문서도 npm ci는 기존 lock 파일이 있어야 동작한다고 설명합니다.
EBADENGINE이 경고로만 나오고 설치가 되는데 문제가 있나요?
설치는 되지만 요구 Node 버전과 다른 환경에서 빌드·테스트가 예기치 않게 실패할 수 있습니다. workflow의 node-version을 engines 조건에 맞추는 것이 안전합니다.
참고 문서: npm Docs - npm ci · actions/setup-node
최종 업데이트: 2026-10-07 · 작성: 내멋스레 사는 이야기