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
Need Help

도움이 필요하신가요?

주님의교회 PCL 디자인 시스템을 적용하시다가 막히는 부분이 있다면, 다음 경로로 직접 문의하실 수 있습니다.