06 · Developer Guide
워크플로 스크립트Workflow Scripts
PCL 시안 사이트를 만들면서 실제로 사용한 스크립트 모음입니다.
외부 자산 가져오기 · 압축 · 무결성 검사 · 배포 감지까지 한 페이지에서 다룹니다.
① pcltv 게시판 인덱스 추출
title="..." 속성을 활용하면 게시판 인덱스에서 게시물 ID와 제목을 한 번에 잡을 수 있습니다.
bash
# pcltv.org 게시판에서 게시물 ID 일괄 추출
curl -sL -A "Mozilla/5.0" "https://www.pcltv.org/Board/Index/1090" \
| grep -oE 'class="title" href="/Board/Detail/1090/[0-9]+" title="[^"]+"' \
| head -10
# 결과 예:
# class="title" href="/Board/Detail/1090/182961" title="2026년 4월 새가족 환영회"
# ...② 게시물 이미지 병렬 다운로드
bash
# 게시물 1건의 모든 이미지 URL 추출 + 일괄 다운로드
PID=182961
mkdir -p public/news/$PID
curl -sL -A "Mozilla/5.0" "https://www.pcltv.org/Board/Detail/1090/$PID" \
| grep -oE 'src="/UserData/pcltvhp/files/1090/'$PID'/[A-Za-z0-9]+\.(jpg|jpeg|png)"' \
| sed 's|src="||;s|"$||' \
| sort -u > /tmp/urls.txt
i=1
while IFS= read -r path; do
[ -z "$path" ] && continue
curl -sL -A "Mozilla/5.0" \
-o "public/news/$PID/$(printf '%02d' $i).jpg" \
"http://www.pcltv.org${path}" &
i=$((i+1))
done < /tmp/urls.txt
wait③ PDF → 이미지 일괄 변환
bash
# PDF 다운로드 + 페이지별 이미지 변환
# 1) PDF URL 일괄 다운로드
for no in 509 510 511 512 513 514 515; do
curl -sL -A "Mozilla/5.0" -o "$no.pdf" "..." &
done
wait
# 2) pdftoppm으로 페이지별 분리 (poppler-utils 필요)
for no in 509 510 511 512 513 514 515 516; do
pdftoppm -jpeg -r 150 \
"$no.pdf" \
"public/hamjul/$no/p" \
-jpegopt quality=80 &
done
wait
# 결과 파일: public/hamjul/516/p-01.jpg ~ p-12.jpg④ 자체호스팅 자산 일괄 압축
Vercel 배포 한도(~100MB)에 걸리지 않도록 자산을 정기적으로 압축. sips -Z 1400 formatOptions 55가 가독성·용량 균형 좋음.
bash
# Vercel 배포 한도 안전화 — sips 일괄 압축
# 모든 자체호스팅 JPG에 적용
find public/news public/hamjul public/jubo public/qt -name "*.jpg" -print0 \
| xargs -0 -n 1 -P 8 -I {} sh -c '
sips -Z 1400 -s formatOptions 55 -s format jpeg "$1" \
--out "$1.tmp.jpg" >/dev/null 2>&1 \
&& mv "$1.tmp.jpg" "$1"
' _ {}
# 결과: 사이즈 50~60% 감소, 시각 차이 거의 없음⑤ 내부 링크 무결성 검사
새 라우트를 추가하거나 페이지 이름을 바꾼 후 빌드 전에 돌리면 깨진 링크를 잡을 수 있습니다.
bash
# 내부 링크 무결성 검사 — broken href 잡기
# 1) 모든 라우트 목록
find "app/(site)/site" -name page.tsx \
| sed 's|app/(site)||;s|/page.tsx||' \
| sort > /tmp/routes.txt
# 2) 사이트에서 사용된 모든 href 수집
grep -rhoE 'href[":= ]+["'\'']\/site/[^"'\''#?]*["'\'']' \
"app/(site)" components \
| sed -E 's/href[":= ]+["'\'']//; s/["'\'']$//' \
| sort -u > /tmp/hrefs.txt
# 3) 정적 라우트만 비교 (동적은 별도)
grep -v "\[" /tmp/routes.txt > /tmp/static-routes.txt
comm -23 /tmp/hrefs.txt /tmp/static-routes.txt
# broken 링크가 있으면 출력됨, 없으면 비어있음⑥ 라이브 사이트 HTTP 헬스 체크
bash
# 라이브 사이트 HTTP 헬스 체크 — 모든 페이지 200 확인
cat /tmp/hrefs.txt | while read href; do
code=$(curl -sL -o /dev/null -w "%{http_code}" "https://pcldesign.kr$href")
if [ "$code" != "200" ]; then
echo "$code $href"
fi
done
# 200이 아닌 응답만 출력. 깨끗하면 침묵⑦ Vercel 배포 상태 자동 감지
bash
# Vercel 배포 결과 자동 감지 — gh CLI 활용
LATEST=$(gh api 'repos/{owner}/{repo}/deployments?per_page=1' \
--jq '.[0]')
ID=$(echo "$LATEST" | jq -r '.id')
SHA=$(echo "$LATEST" | jq -r '.sha[0:7]')
# 빌드 중이면 대기
until [ "$(gh api repos/{owner}/{repo}/deployments/$ID/statuses \
--jq '.[0].state' 2>/dev/null)" != "in_progress" ]; do
sleep 15
done
STATE=$(gh api "repos/{owner}/{repo}/deployments/$ID/statuses" --jq '.[0].state')
echo "$SHA → $STATE"
# 빌드 로그 (실패 시)
npx vercel inspect dpl_XXX --logs | tail -50