파이프라인: find | head -1 의 SIGPIPE 로 배포가 멈추던 것 수정
All checks were successful
deploy-wise / deploy (push) Successful in 1m5s

act 는 run: 스텝을 bash -e -o pipefail 로 실행한다. `find ... | head -1` 은
head 가 첫 줄을 받고 파이프를 닫는 순간 find 가 SIGPIPE(141)로 죽어 파이프라인
전체가 실패로 판정된다. 빌드가 BUILD SUCCESS 로 끝나고 192MB WAR 까지 만든 뒤
"산출물 검증" 스텝이 출력 한 줄 없이 죽어 배포가 멈췄다.

실측: bash -e -o pipefail 에서 `find | head -1` → 141, `-print -quit` → 0.

- 산출물 검증: find 를 -print -quit 로 바꿔 파이프 자체를 없앤다
- 사전 점검: `free -h | head -2` 도 같은 경합을 안고 있어 파이프를 제거

리포 주석이 경고하던 바로 그 함정이다(deploy/dev 배포 스크립트의
unzip -l | grep -q 사고와 동일 원인).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
infraurp 2026-08-26 15:23:14 +09:00
parent 8257820b57
commit 7f3c86c588

View File

@ -62,7 +62,8 @@ jobs:
run: |
set -e
df -h /opt | tail -1
free -h | head -2
# `free -h | head -2` 도 같은 SIGPIPE 함정을 안고 있다(작아서 대개 통과하지만 경합이다).
free -h
# 터널이 살아 있어야 배포 후 확인이 가능하다
systemctl is-active arko-was-tunnel || echo "::warning::터널이 죽어 있다 — 배포 후 확인이 실패할 수 있다"
@ -80,7 +81,11 @@ jobs:
run: |
set -e
# 바이트코드 major=51(Java 7). JDK 11/17 로 잘못 빌드되면 WAS 에서 못 뜬다.
CLS=$(find target/classes -name '*.class' | head -1)
# `find ... | head -1` 로 쓰면 안 된다. head 가 첫 줄을 받고 파이프를 닫는 순간
# find 가 SIGPIPE(141)로 죽고, act 가 스텝을 bash -e -o pipefail 로 돌리기 때문에
# 파이프라인 전체가 실패로 판정된다 — 출력 한 줄 없이 배포가 멈춘다(2026-08-26 실제 발생).
# -print -quit 는 첫 매치를 찍고 스스로 끝내므로 파이프가 필요 없다.
CLS=$(find target/classes -name '*.class' -print -quit)
VER=$(od -An -t d1 -j 7 -N 1 "$CLS" | tr -d ' ')
echo "바이트코드 major=$VER (51이어야 정상)"
[ "$VER" = "51" ] || { echo "::error::JDK 8 이 아닌 컴파일러로 빌드됐다"; exit 1; }