본문 바로가기
C.W.K.
Stream
Lesson 08 of 13 · published

워크플로 디버깅

~10 min · debug, logs, runner-debug

Level 0견습생
0 XP0/101 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

디버그 툴킷

  1. 디버그 로깅으로 재실행 — 실패한 실행의 UI 버튼을 누르거나, 저장소 비밀값으로 ACTIONS_RUNNER_DEBUG=trueACTIONS_STEP_DEBUG=true를 설정해. 로그가 5-10배 길어지지만 모든 API 호출을 볼 수 있어.
  2. 단계 디버그 액션mxschmitt/action-tmate가 작업 중간에 러너에 SSH 세션을 열어줘. 유용하지만 위험해. 세션을 보는 누구나 비밀값을 훔칠 수 있거든.
  3. 단계 요약 — 실패한 단계 안에서 $GITHUB_STEP_SUMMARY에 진단 정보를 추가해.
  4. 아티팩트 덤프 — 실패와 관련된 파일(로그, 스크린샷, 환경변수 덤프)을 if: always()로 업로드해. 다운로드해서 검사할 수 있어.
  5. 로컬 재현 — 같은 이미지, 같은 환경변수를 쓰고 act나 그냥 Docker를 활용해.

흔한 버그와 그걸 드러내는 방법

  • 단계가 예상치 못하게 건너뛰어짐if: 표현식을 확인해. act가 해석된 값을 출력해줘.
  • 비밀값이 비어 보임 → 범위 안에 없거나(조직/환경 불일치) fork PR 때문이야.
  • 캐시가 절대 복원 안 됨 → 키가 불일치해. 디버그로 실행해서 해석된 키 문자열을 봐.
  • 매트릭스가 작업 안에서 생성 안 됨 → 빈 fromJSON 입력이야. 상위 작업의 출력값을 확인해.
  • 셀프 호스티드 러너가 안 가져감 → 라벨 불일치, 러너 오프라인, 또는 러너가 바쁜 상태야.

Code

실패 시 항상 업로드되는 진단 번들·yaml
      - name: Run e2e
        run: ./tests/e2e.sh
      - name: Diagnostic bundle
        if: always()
        run: |
          mkdir -p diag
          cp -r logs/ diag/
          docker compose logs > diag/compose.log 2>&1 || true
          env | sort | grep -v -i 'TOKEN\|KEY\|SECRET' > diag/env.log
      - if: always()
        uses: actions/upload-artifact@v4
        with:
          name: diag-${{ github.run_id }}-${{ github.run_attempt }}
          path: diag/
          retention-days: 7

External links

Exercise

지난 달 실패한 워크플로를 골라봐. 디버그 로깅으로 재실행하고 해석된 표현식과 API 호출을 읽어봐. 이전에 없던 정보를 최소 하나 발견할 수 있을 거야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.