itsm_ysm/docs/CICD_PIPELINE.md
itms-merge-dev 5e5ccc0ec7 docs+build(itms): CI/CD 정본 문서·APK 게시 자산·모바일 빌드 수정 (v1.0.0 APK 게시)
- docs/CICD_PIPELINE.md 정본(LIVE) + deploy/README.md 가동중 갱신
- deploy/apk/: publish_app_manifest.sh·mobile-app.html(WISE QR)·itms-latest.json
- deploy/nginx: /mobile-app(ITMS 전용)+/downloads/(APK)+매니페스트 서빙 반영
- mobile: EAS 빌드 의존 승격(react-navigation/expo-modules-core/metro)·.easignore·eas appVersionSource

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 19:41:29 +09:00

5.4 KiB

ITMS CI/CD 파이프라인 정본 (LIVE)

최종 갱신: 2026-07-19 | 상태: 가동 중 (2026-07-17 "산출물 준비형" 판정을 대체) 상세 실행 기록: C:\GUARDiA\_workspace\itms_cicd\01~06_*.md (설계·구축·스키마·모바일·SR·QA)

1. 한 줄 요약

git push 한 번이면 개발서버 빌드·배포 → 헬스체크 → 운영서버 자동 승격 → QR 페이지까지 자동 처리된다.

git push (Gitea ythong/itms, main)
  → Gitea webhook → deploy_server.py itms 블록 (개발서버 101.79.17.164:9999)
  → gradle 모듈 빌드 (common 선행 → auth/api/front/batch/datatrans bootWar, JDK17)
  → 산출물 아카이브 (/opt/itms/artifacts/current)
  → dev 재기동: itms-front + itms-auth + itms-api (systemd)
  → dev 헬스체크 게이트  ← 실패 시 여기서 중단 (운영 오염 방지)
  → prod 승격: front WAR tar-over-ssh (ssh -p 9271, jenkins 배포키)
  → prod 재기동 + 헬스체크 → 완료

2. 서버·도메인

구분 서버 도메인 기동 범위 TLS
개발 101.79.17.164 https://itms.zioinfo.co.kr front(11020)+auth(11000)+api(11010) — 실로그인 동작 Let's Encrypt(자동갱신)
운영 211.37.173.197 (wise.ai.kr, ssh :9271) https://itms.wise.ai.kr front-only (RAM 게이트) Let's Encrypt(자동갱신)
  • 운영서버 211.37.173.197 ITMS 배포는 2026-07-19 소유자 지정·승인 (CAMP와 동일 서버, Host 헤더 기반 vhost — bare IP 접근은 404).
  • 운영 RAM 게이트: prod 총 2GB·가용 ~500MB → front 단일 JVM(-Xmx320m)만. auth/api/DB 운영 기동은 RAM 증설 후 (그 전 강행 금지 — 기존 WISE/CAMP 운영 서비스 보호).

3. 개발서버 런타임 (Stage B — 로그인 실동작)

  • MariaDB 10.11 + ur_itms_db (전용 계정 itms_zio) + swap 2G
  • 스키마: 고객 DDL 부재 → MyBatis 매퍼 역설계 22테이블 (_workspace/itms_cicd/03_schema_min.sql)
    • 함정1: auth는 JdbcTokenStoreoauth_access_token/oauth_refresh_token/oauth_approvals 3테이블 없으면 로그인 자체 실패
    • 함정2: 로그인 쿼리 = COMVNUSERMASTER ⋈ TB_USER_CRYP_CNF INNER JOIN → 두 테이블에 동일 ESNTL_ID 시드 필수
  • 프로파일: 기존 16기관 yml 불변. 신규 zio 프로파일은 서버 외부 config(/opt/itms/config/application-zio.yml, -Dspring.config.additional-location) — 재빌드 불필요
  • 시크릿: /opt/itms/secrets/ (0600) — 데모 admin 비번·DB 비번. 문서/커밋 기재 금지
  • nginx Bearer 분기(핵심 함정): front와 api가 동일 URL prefix(/main·/srm·/sys 등)를 화면/REST로 각각 사용 → 경로 분기 불가. Authorization: Bearer 헤더 map으로 분기: Bearer→api(11010), 세션(브라우저)→front(11020), /oauth/→auth(11000). 정본: deploy/nginx/itms.zioinfo.co.kr.conf

4. 모바일 앱 · QR 배포

  • 앱: mobile/ 독립 Expo 앱(SDK 51, TS, 12화면) — Gradle 컴포짓 무관 순수 Node
  • 인증: OAuth2 password grant POST /oauth/token(+Basic client, ssoYn=N) → RS256 JWT 24h
  • 업무 API: 루트 prefix POST /*.do + Bearer (/api prefix 아님 — constants/Config.ts 권위), 응답 봉투 {data,status,totalCount,code,message}
  • QR 다운로드 페이지: dev·prod /mobile-app — APK 매니페스트 기반 버전·QR·다운로드 표시
  • APK: EAS 클라우드 빌드(EXPO_TOKEN 환경변수 — 값 저장 금지)

5. 고객 SR 반영 현황 (2026-07-19 push 53b8f42c)

  • 원본: docs/ITSM 고객 수정 요청 체크리스트_20260708.xlsx(25건) + docs/ITSM 기능개선 및 장애처리_V1.1_20260707.pptx(15건) + 브랜딩(F12) = 40건
  • 완료 23건 (로그인 잠금/메시지, 서비스데스크 서버측 권한·검증, 용어 통일 172건, 임시저장 버튼, 로고/파비콘 관리 등) — 개발·운영 라이브 검증 완료
  • 보류 17건: 고객 DB 스키마/프로시저 의존·설계 확정 필요·정책 판단 — docs/SR_BACKLOG_20260708.md 권고안 포함
  • 조치 기록(고객 제출용): docs/ITSM 고객 수정 요청 체크리스트_20260708_조치결과.xlsx — 쉬운 설명 + 변경 전/후 코드 나란히 비교
  • 상세 diff: docs/SR_CHANGES_20260719.md

6. 운영 절차 (Runbook)

작업 방법
배포 git push origin main — 이후 전자동. push = 운영 배포이므로 로컬 빌드 게이트(전 모듈 bootWar EXIT 0) 통과 후에만
배포 추적 dev journalctl -u zioinfo-deploy -f (webhook→build→restart→promote 로그)
롤백 dev: /opt/itms/artifacts/ 이전 아카이브 재기동 / prod: 이전 front WAR 재전송+재기동
헬스 dev/prod 도메인 HTTP 200 + systemctl status itms-front itms-auth itms-api
deploy_server 수정 로컬 정본 scripts/deploy/deploy_server.py + 서버 /opt/zioinfo/deploy_server.py 양쪽 반영 + zioinfo-deploy 재시작 필수(미반영 시 웹훅 1ms no-op)

7. 잔여 백로그

  1. APK 게시: EAS 빌드 완료 → dev/prod /mobile-app 매니페스트 갱신 (진행 중)
  2. 운영 풀스택(로그인): RAM 증설 결정 대기
  3. DB 의존 SR 17건: 고객 ur_itms_db 덤프 확보 시 (또는 역설계 확장)
  4. batch(Oracle XE)·datatrans(기관 NAS): 기관 전용망 확보 시 — CI 빌드·아카이브는 이미 포함
  5. legacy/nlib: CI 제외 유지(Maven·Java8)