arko_renual/.gitea/workflows/deploy-dev.yml
infraurp e4973fb777
All checks were successful
deploy-dev / deploy (push) Successful in 39s
배포 파이프라인 결함 3건 수정
2026-07-30 나눔고딕 글꼴 배포 중 드러난 문제들이다.

1) build-and-upload.sh: 업로드 검증이 없어 잘린 WAR이 통과했다
   pscp가 대용량 전송 중 약 30초 지점에서 조용히 끊기며 exit 0을 반환해,
   194MB WAR이 66MB/84MB로 잘린 채 "업로드 완료"로 처리됐다. 그 WAR로
   배포가 돌아 실패했다. 30MB 조각 전송 + 조각별 크기 확인(3회 재시도) +
   서버 결합 후 size/md5 대조를 통과할 때만 arko.war 로 교체하도록 바꿨다.

2) build-and-upload.sh: mvn -ntp 는 Maven 3.6.1+ 전용
   PATH에 3.5.4가 잡히면 "Unrecognized option: -ntp"로 빌드가 즉시 죽는다.
   진행률 억제 옵션일 뿐이라 제거했다.

3) arko-dev-deploy.sh: WAR 검증이 파이프+pipefail 조합으로 취약
   정상 WAR인데 Actions 실행 중 "WEB-INF/web.xml 없음"으로 오판해 배포가
   멈췄다(서버에서 동일 명령 재실행 시 20/20 통과). unzip 목록을 한 번만
   읽어 변수에 담고 파이프 없이 검사한다.
   ※ 서버의 /opt/arko-dev/bin/ 사본은 워크플로가 갱신하지 않으므로 별도 반영 필요.

덧붙여 워크플로 주석의 "빈 커밋으로 재배포" 안내를 정정했다 —
paths-ignore 때문에 변경 경로가 없는 커밋은 워크플로가 실행되지 않는다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-30 13:44:50 +09:00

117 lines
5.3 KiB
YAML

# arko_renual — 개발서버(csv.zioinfo.co.kr) 자동 배포 파이프라인
#
# ┌ 설계 배경 ─────────────────────────────────────────────────────────────┐
# │ 이 서버(zio-server)는 2코어 / 메모리 여유 1G에 40개 이상의 서비스가 │
# │ 동거한다. 구축 중 서버 전체가 응답 불능이 되어 재부팅된 일이 두 번 있다. │
# │ 그래서 Maven 빌드(힙 1G)는 서버에서 돌리지 않는다. │
# └────────────────────────────────────────────────────────────────────────┘
#
# [개발자 PC] bash deploy/dev/build-and-upload.sh → 빌드 + WAR 업로드
# [개발자 PC] git push origin master → 이 워크플로 자동 실행
# [개발서버] ROOT 재전개 + 환경설정 주입 + 재기동 + 헬스체크(+실패 시 롤백)
# [개발→운영] 개발 헬스체크 통과 시 운영 웹(211.37.173.197)으로 정적 리소스 배포
#
# 접속 방향이 개발 → 운영인 이유: 개발서버는 NAT 뒤라 외부에서 먼저 접속할 수 없고,
# 운영 웹서버는 공인망에 SSH(9271)가 열려 있어 개발서버에서 나갈 수 있다.
#
# ※ Gitea 1.22.3 기준으로 작성했다. 이 버전은 workflow_dispatch(수동 실행 버튼)와
# inputs 컨텍스트를 지원하지 않는다 — 넣으면 워크플로 자체가 목록에 뜨지 않는다.
# 그래서 트리거는 push 하나만 둔다.
# ※ 빈 커밋(`git commit --allow-empty`)으로는 재배포되지 않는다 — 변경 경로가 없어
# 아래 paths-ignore 조건에서 걸러지고 워크플로가 아예 실행되지 않는다(2026-07-30 확인).
# 재배포가 필요하면 아래 무시 대상이 아닌 파일을 실제로 변경해 push 하거나,
# 서버에서 `bash /opt/arko-dev/bin/arko-dev-deploy.sh /opt/arko-dev/incoming/arko.war` 를 직접 실행한다.
# 롤백은 서버에서 직접 수행한다(deploy/dev/README.md 참고).
name: deploy-dev
on:
push:
branches: [master]
paths-ignore: # 문서만 바뀐 커밋으로 재배포하지 않는다
- '**.md'
- '**.docx'
- '**.pptx'
- 'docs/**'
- '_workspace_privacy/**'
concurrency:
group: arko-dev-deploy
cancel-in-progress: false # 배포 도중 취소되면 ROOT가 반쪽 상태로 남는다
env:
APP_HOME: /opt/arko-dev
INCOMING_WAR: /opt/arko-dev/incoming/arko.war
SITE_URL: https://csv.zioinfo.co.kr/ # 개발 웹 (개발서버 nginx)
PROD_SITE_URL: https://csv.wise.ai.kr/ # 운영 웹 (211.37.173.197)
jobs:
deploy:
runs-on: arko-dev
timeout-minutes: 20
steps:
- name: 사전 점검
run: |
set -e
df -h "$APP_HOME" | tail -1
free -h | head -2
uptime
- name: WAR 확인
run: |
set -e
if [ ! -f "$INCOMING_WAR" ]; then
echo "::error::업로드된 WAR이 없다: $INCOMING_WAR"
echo "개발자 PC에서 'bash deploy/dev/build-and-upload.sh' 를 먼저 실행할 것."
exit 1
fi
ls -lh "$INCOMING_WAR"
WAR_EPOCH=$(stat -c %Y "$INCOMING_WAR")
echo "WAR 빌드 시각: $(date -d @$WAR_EPOCH '+%F %T')"
NOW=$(date +%s)
AGE_MIN=$(( (NOW - WAR_EPOCH) / 60 ))
if [ "$AGE_MIN" -gt 120 ]; then
echo "::warning::업로드된 WAR이 ${AGE_MIN}분 전 것이다. 소스 변경이 포함된 커밋이라면 build-and-upload.sh 로 다시 올릴 것."
fi
- name: 배포
run: |
set -e
bash "$APP_HOME/bin/arko-dev-deploy.sh" "$INCOMING_WAR"
- name: 개발 결과 확인
run: |
set -e
CODE=000
for i in $(seq 1 60); do
CODE=$(curl -s -o /dev/null -w "%{http_code}" --max-time 10 http://127.0.0.1:8088/ || echo 000)
if [ "$CODE" = "200" ] || [ "$CODE" = "302" ]; then break; fi
sleep 3
done
echo "Tomcat 직접 → HTTP $CODE"
EXT=$(curl -s -o /dev/null -w "%{http_code}" --max-time 20 "$SITE_URL" || echo 000)
echo "$SITE_URL → HTTP $EXT"
case "$CODE" in
200|302) echo "개발 배포 정상" ;;
*) echo "::error::Tomcat 응답 없음 (HTTP $CODE)"; exit 1 ;;
esac
# 개발 헬스체크를 통과한 뒤에만 운영 웹으로 넘어간다.
# 개발이 깨진 산출물을 운영 웹에 밀어 넣지 않기 위한 순서다.
- name: 운영 웹서버 배포
run: |
set -e
bash "$APP_HOME/bin/arko-prodweb-deploy.sh"
- name: 운영 결과 확인
run: |
set -e
CODE=$(curl -s -o /dev/null -w "%{http_code}" --max-time 30 "$PROD_SITE_URL" || echo 000)
echo "$PROD_SITE_URL → HTTP $CODE"
case "$CODE" in
200|302) echo "운영 웹 배포 정상" ;;
*) echo "::error::운영 웹 응답 없음 (HTTP $CODE) — 터널(arko-was-tunnel) 상태를 확인할 것"; exit 1 ;;
esac