← 전체 글로 돌아가기

CI/CD

GitHub Actions 실패 로그를 읽을 때 덜 헤매는 방법

GitHub Actions 로그는 한눈에 들어오지 않는다. 실패 원인을 빠르게 찾는 방법을 알아보자.

GitHub Actions 워크플로우가 실패했다는 알림을 받고 로그를 열면, 무수한 텍스트 중에서 원인을 찾기가 어렵다. 로그를 효율적으로 읽는 습관을 들이면 훨씬 빨리 대응할 수 있다.

1단계: 실패한 job과 step 찾기

GitHub Actions 페이지에서 실패한 workflow를 클릭하면:

❌ job-name / step-name (failed)
✓ other-job (succeeded)

빨간 X 표시가 있는 step으로 바로 이동한다. 여기가 실패 지점이다.

2단계: Step의 마지막 로그부터 읽기

step을 펼치면 위부터 차례대로 나오는데, 마지막 10줄만 먼저 본다.

2024-01-15 10:30:45 Error: Cannot find module 'lodash'
2024-01-15 10:30:45 at Function.Module._resolveFilename
2024-01-15 10:30:45     at Object.<anonymous> (/app/index.js:5:7)
...
exit code 1

거기서 원인이 명확하면 빠르게 수정할 수 있다.

3단계: 설치(setup) 단계 확인

실패가 "Cannot find module" 같은 설정 에러면, 이전 단계를 본다.

✓ Checkout code
✓ Set up Node.js (18.0.0)
✓ Install dependencies
  npm install
  npm notice found 0 vulnerabilities
❌ Run tests
  Error: Cannot find module 'lodash'

설치 단계가 완료 표시가 나왔는데도 모듈이 없다면, 로그에서 "found 0 vulnerabilities" 같은 문구가 실제로 설치를 완료했는지 확인한다.

4단계: 환경 변수나 secret 확인

"undefined" 에러가 나면 환경 변수나 secret이 없을 수 있다.

error: Cannot read property 'email' of undefined
  at createUser (api.js:42:5)

workflow 파일에서 확인한다:

- name: Deploy
  env:
    DATABASE_URL: ${{ secrets.DATABASE_URL }}
    API_KEY: ${{ secrets.API_KEY }}
  run: npm run deploy

GitHub 저장소 Settings > Secrets and variables > Actions에서 실제로 설정돼 있는지 본다.

5단계: 시간 초과 문제

The operation timed out after 3600 seconds

Job이 너무 오래 걸리는 경우다.

jobs:
  slow-job:
    runs-on: ubuntu-latest
    timeout-minutes: 60  # 기본값은 360분(6시간)
    steps:
      - run: npm run test

6단계: 더 자세한 정보 얻기

UI에서 충분한 정보를 못 얻었다면, workflow 파일에서 디버그 로깅을 켜본다.

- name: Run tests
  run: npm run test
  env:
    DEBUG: '*'  # 많은 라이브러리가 이걸 인식

또는 더 직접적으로:

- name: Debug
  if: failure()  # 실패했을 때만 실행
  run: |
    echo "Job status: ${{ job.status }}"
    echo "Current directory: $(pwd)"
    echo "Node version: $(node --version)"
    npm ls  # 설치된 패키지 확인

7단계: 로컬에서 재현하기

CI에서만 실패하면 환경 차이를 의심한다.

# 로컬에서 workflow와 같은 환경 만들기
docker run --rm -it ubuntu:latest bash
# 또는
nvm install 18.0.0
nvm use 18.0.0

# workflow의 모든 step을 순서대로 실행
git checkout main
npm ci
npm run lint
npm run test
npm run build

8단계: 실패 로그를 커밋 메시지에 남기기

다음에 같은 문제를 만날 때 참고할 수 있도록:

fix: add missing DATABASE_URL to GitHub secrets

Previously, deploy job failed with:
  Error: Cannot read property 'email' of undefined
  at createUser (api.js:42:5)

Root cause: DATABASE_URL secret was not configured.
Fix: Added DATABASE_URL to repository secrets.

Related CI run: https://github.com/user/repo/actions/runs/12345678

자주 나오는 에러와 원인

에러원인해결방법
Cannot find module의존성 설치 실패npm ci 대신 npm install 쓰기, 패키지 락 파일 확인
undefined환경 변수/secret 없음GitHub Settings에서 secret 추가
Connection refused서비스 미실행docker-compose 또는 서비스 시작 단계 추가
Permission denied파일 권한 문제chmod +x script.sh
Timeout너무 오래 걸림timeout-minutes 증가 또는 병렬 처리

# 최근 실패한 workflow 링크 빠르게 보기
gh run list --limit 5 --status failure

# 특정 workflow의 로그 다운로드
gh run view <run-id> --log

GitHub Actions 로그는 처음엔 복잡해 보이지만, 마지막 에러부터 위로 거슬러 올라가며 읽으면 빠르게 원인을 찾을 수 있다.