hgzero/deployment/jenkins/JENKINS_SETUP.md
hjmoons 3483c9c1b2 Jenkins 파이프라인 추가
- Jenkinsfile: GitHub Actions 대체 Jenkins Pipeline 구축
  - 5개 백엔드 서비스 빌드 (user, meeting, stt, ai, notification)
  - Gradle 빌드 및 SonarQube 분석 (선택사항)
  - Docker 이미지 빌드 및 ACR 푸시
  - Manifest 저장소 업데이트 (ArgoCD 연동)
  - 환경별 배포 지원 (dev/staging/prod)

- deployment/jenkins/JENKINS_SETUP.md: Jenkins 설정 가이드
  - Credentials 설정 방법
  - JDK 21 및 SonarQube 설정
  - Pipeline Job 생성 및 실행 가이드
  - 트러블슈팅 가이드

- 사용 이유: GitHub Actions 차단으로 인한 대체 CI/CD 구축
2025-10-30 18:16:56 +09:00

257 lines
7.6 KiB
Markdown

# Jenkins Pipeline 설정 가이드
## 개요
GitHub Actions가 막혀 있을 때 Jenkins를 사용하여 HGZero 백엔드 서비스를 빌드하고 배포하는 가이드입니다.
## 전제 조건
### 1. Jenkins 서버 요구사항
- Jenkins 2.x 이상
- Docker가 설치되어 있어야 함
- Kustomize CLI 다운로드 가능한 환경
- 인터넷 연결 (Docker Hub, Azure Container Registry, GitHub 접근)
### 2. 필수 Jenkins 플러그인
다음 플러그인들이 설치되어 있어야 합니다:
- Pipeline (기본 포함)
- Git Plugin
- Docker Pipeline Plugin
- SonarQube Scanner Plugin (선택사항)
- Credentials Plugin (기본 포함)
## Jenkins 설정 단계
### 1단계: Credentials 설정
Jenkins 관리 → Manage Credentials → Global credentials에서 다음 credential들을 추가합니다:
#### 1.1 ACR Credentials
- **ID**: `acr-credentials`
- **Type**: Username with password
- **Username**: Azure Container Registry 사용자명
- **Password**: Azure Container Registry 비밀번호
- **Description**: Azure Container Registry Credentials
#### 1.2 Docker Hub Credentials
- **ID**: `dockerhub-credentials`
- **Type**: Username with password
- **Username**: Docker Hub 사용자명
- **Password**: Docker Hub 비밀번호 또는 Access Token
- **Description**: Docker Hub Credentials (rate limit 방지용)
#### 1.3 SonarQube Token (선택사항)
- **ID**: `sonar-token`
- **Type**: Secret text
- **Secret**: SonarQube authentication token
- **Description**: SonarQube Token
#### 1.4 Git Credentials
- **ID**: `git-credentials`
- **Type**: Username with password
- **Username**: GitHub 사용자명
- **Password**: GitHub Personal Access Token (repo 권한 필요)
- **Description**: GitHub Credentials for Manifest Repository
> **중요**: GitHub Personal Access Token 생성 시 다음 권한이 필요합니다:
> - `repo` (Full control of private repositories)
### 2단계: JDK 21 설정
Jenkins 관리 → Global Tool Configuration → JDK에서:
1. "Add JDK" 클릭
2. **Name**: `JDK21`
3. "Install automatically" 체크
4. Install from adoptium.net 선택
5. Version: jdk-21.x.x 선택
> **참고**: 또는 Jenkins 서버에 JDK 21이 이미 설치되어 있다면, 설치 경로를 지정할 수 있습니다.
### 3단계: SonarQube 서버 설정 (선택사항)
SonarQube 분석을 사용하려면:
Jenkins 관리 → Configure System → SonarQube servers에서:
1. "Add SonarQube" 클릭
2. **Name**: `SonarQube`
3. **Server URL**: SonarQube 서버 URL
4. **Server authentication token**: 앞서 생성한 `sonar-token` credential 선택
### 4단계: Pipeline Job 생성
1. Jenkins 메인 화면에서 "New Item" 클릭
2. Job 이름 입력 (예: `hgzero-backend-pipeline`)
3. "Pipeline" 선택
4. "OK" 클릭
Pipeline 설정:
1. **General**
- "This project is parameterized" 체크 (자동으로 Jenkinsfile의 parameters가 인식됨)
2. **Pipeline**
- **Definition**: Pipeline script from SCM
- **SCM**: Git
- **Repository URL**: `https://github.com/hjmoons/HGZero.git` (또는 실제 저장소 URL)
- **Credentials**: 필요시 Git credentials 선택
- **Branch Specifier**: `*/main` (또는 원하는 브랜치)
- **Script Path**: `Jenkinsfile`
3. "Save" 클릭
## Pipeline 실행
### 수동 실행
1. 생성한 Pipeline Job 선택
2. "Build with Parameters" 클릭
3. 파라미터 선택:
- **ENVIRONMENT**: `dev`, `staging`, 또는 `prod` 선택
- **SKIP_SONARQUBE**: `true` (건너뛰기) 또는 `false` (실행)
4. "Build" 클릭
### Pipeline 동작 흐름
```
1. Checkout
└─> Git 저장소에서 코드 체크아웃
2. Setup Java
└─> JDK 21 환경 설정
3. Load Environment Variables
└─> .github/config/deploy_env_vars_{환경} 파일에서 환경변수 로드
4. Build with Gradle
└─> ./gradlew build -x test 실행 (JAR 파일 생성)
5. SonarQube Analysis (선택사항)
└─> 각 서비스별 테스트 및 코드 품질 분석
6. Archive Artifacts
└─> 생성된 JAR 파일을 Jenkins에 보관
7. Docker Build & Push
└─> 각 서비스별 Docker 이미지 빌드 및 ACR에 푸시
8. Update Manifest Repository
└─> hgzero-manifest 저장소의 Kustomize 파일 업데이트
└─> ArgoCD가 자동으로 배포 감지
```
## 빌드 결과 확인
### 성공 시
- Console Output에 "✅ Pipeline completed successfully!" 메시지 표시
- Environment와 Image Tag 정보 출력
- Manifest 저장소가 업데이트됨
- ArgoCD가 자동으로 새 이미지를 배포
### 실패 시
- Console Output에 "❌ Pipeline failed!" 메시지 표시
- 실패한 Stage와 에러 메시지 확인
- Workspace가 자동으로 정리됨
## 환경별 설정
### Dev 환경
```bash
ENVIRONMENT: dev
```
- 개발 환경에 배포
- 빠른 반복 개발용
### Staging 환경
```bash
ENVIRONMENT: staging
```
- 스테이징 환경에 배포
- 프로덕션 배포 전 최종 검증
### Production 환경
```bash
ENVIRONMENT: prod
```
- 프로덕션 환경에 배포
- **주의**: 프로덕션 배포는 신중하게 진행
## 트러블슈팅
### 문제 1: Gradle 빌드 실패
**증상**: `./gradlew build` 실패
**해결방법**:
- Console Output에서 에러 로그 확인
- Java 버전이 21인지 확인
- Gradle wrapper 권한 확인: `chmod +x gradlew`
### 문제 2: Docker 로그인 실패
**증상**: Docker login 실패
**해결방법**:
- Jenkins Credentials에 ACR credentials가 올바르게 설정되었는지 확인
- Azure Container Registry URL이 `acrdigitalgarage02.azurecr.io`인지 확인
- Credential ID가 정확히 `acr-credentials`인지 확인
### 문제 3: Git clone 실패 (Manifest Repository)
**증상**: hgzero-manifest 저장소 clone 실패
**해결방법**:
- GitHub Personal Access Token이 유효한지 확인
- Token에 `repo` 권한이 있는지 확인
- Credential ID가 정확히 `git-credentials`인지 확인
### 문제 4: Kustomize 설치 실패
**증상**: Kustomize 다운로드 실패
**해결방법**:
- Jenkins 서버에서 인터넷 연결 확인
- curl 명령어가 사용 가능한지 확인
- 필요시 Kustomize를 미리 설치하고 PATH에 추가
## 보안 고려사항
1. **Credentials 관리**
- 모든 비밀번호와 토큰은 Jenkins Credentials로 관리
- Pipeline 코드에 절대 하드코딩하지 않음
2. **Git Credentials**
- Personal Access Token 사용 (비밀번호 사용 금지)
- 최소 권한 원칙 적용
3. **Docker Registry**
- ACR 접근은 Service Principal 또는 관리되는 자격 증명 사용 권장
## 추가 참고사항
### Webhook 설정 (선택사항)
GitHub push 이벤트 시 자동으로 빌드를 트리거하려면:
1. Jenkins Job → Configure → Build Triggers
2. "GitHub hook trigger for GITScm polling" 체크
3. GitHub 저장소 → Settings → Webhooks
4. Jenkins URL 추가: `http://{jenkins-url}/github-webhook/`
### 알림 설정 (선택사항)
빌드 결과를 이메일이나 Slack으로 받으려면:
- Email: Email Extension Plugin 설치 및 설정
- Slack: Slack Notification Plugin 설치 및 설정
## 지원 서비스
현재 Pipeline에서 빌드하는 서비스:
- `user`: 사용자 관리 서비스
- `meeting`: 회의 관리 서비스
- `stt`: 음성-텍스트 변환 서비스
- `ai`: AI 처리 서비스
- `notification`: 알림 서비스
## 관련 파일
- `Jenkinsfile`: Pipeline 정의 파일
- `.github/config/deploy_env_vars_{환경}`: 환경별 변수 파일
- `deployment/container/Dockerfile-backend`: 백엔드 Dockerfile
- `hgzero-manifest` 저장소: Kubernetes 매니페스트 파일
## 문의
Pipeline 관련 문제가 발생하면 Jenkins Console Output을 확인하고, 필요시 DevOps 팀에 문의하세요.