# 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는 `JdbcTokenStore` → `oauth_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)