홈 › CI/CD › 07 / 7

파이프라인 운영과 문제 해결

섹션 7진행 0 / 7

3. 코드 예제

예제 1: 실패 로그에서 첫 에러 찾기 — 01_ops_troubleshoot.sh 발췌

bash
cat > ci_log.txt <<'EOF'
[checkout] main@a1b2c3d 체크아웃 완료
[build] BUILD SUCCESS
[test] testAdd PASSED
[test] testDivide FAILED
[test] java.lang.ArithmeticException: / by zero
[test] 3 tests, 1 failed
EOF
grep -n -m1 -iE 'error:|FAIL' ci_log.txt
grep -n -A1 'FAILED' ci_log.txt
text
6:[test] testDivide FAILED
6:[test] testDivide FAILED
7-[test] java.lang.ArithmeticException: / by zero

-m1 로 첫 매치에서 멈추고, -A1 로 원인 줄까지 같이 확인합니다.

예제 2: 로컬에서 같은 실패 재현 — 01_ops_troubleshoot.sh 발췌

bash
"$JAVA_BIN/javac" -encoding UTF-8 -d out Calc.java
if "$JAVA_BIN/java" -cp out Calc > repro.txt 2>&1; then
  echo "재현 실패: 로컬에서 통과했습니다 (예상과 다릅니다)"
else
  echo "재현 성공: 파이프라인과 같은 예외가 로컬에서도 발생"
  grep -m1 'Exception' repro.txt
fi
text
재현 성공: 파이프라인과 같은 예외가 로컬에서도 발생
Exception in thread "main" java.lang.ArithmeticException: / by zero

같은 예외가 로컬에서도 나오면 수정하고 같은 명령으로 재확인합니다.

예제 3: 플레이키 테스트 재시도 — 01_ops_troubleshoot.sh 발췌

bash
echo 0 > attempt_count.txt
run_flaky() {
  local n; n=$(cat attempt_count.txt)
  n=$((n + 1)); echo "$n" > attempt_count.txt
  if [ "$n" -lt 2 ]; then return 1; fi
  return 0
}
for i in $(seq 1 3); do
  if run_flaky; then ok=1; break; fi
done
text
  시도 1: 실패 (테스트 통과, 빌드는 아직 실패)
  시도 2: 성공
결과: 2번째 시도에 성공, 파이프라인 계속 진행

난수 대신 카운터 파일로 "2번째 시도에 성공" 을 항상 같게 재현합니다.

예제 4: 시크릿 검사와 pre-commit 훅 — 01_ops_troubleshoot.sh 발췌

bash
cat > .git/hooks/pre-commit <<'HOOK'
pattern='ghp_[A-Za-z0-9]{20,}|AKIA[0-9A-Z]{16}'
hit=$(git diff --cached -U0 | grep -nE "$pattern")
if [ -n "$hit" ]; then
  echo "커밋 차단: 시크릿으로 보이는 값이 있습니다"
  echo "$hit"; exit 1
fi
exit 0
HOOK
chmod +x .git/hooks/pre-commit
text
커밋 결과: 차단됨 (exit 1)
커밋 차단: 시크릿으로 보이는 값이 있습니다
7:+token=ghp_ABCDEFGHIJKLMNOPQRST

시크릿을 지우고 다시 커밋하면 훅을 통과합니다.