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

74 lines
5.4 KiB
Markdown

# 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)