티스토리 뷰
728x90
🚩 예제 상황 (MSA 환경)
다음과 같은 상황을 가정하겠습니다.
- 주 레포지토리 구조:
msa-project/
├── common-api/ [Submodule]
├── common-auth-lib/ [Submodule]
├── services/
│ ├── order-service/
│ │ └── payment-module/ [Subtree]
│ └── user-service/
│ └── notification-module/ [Subtree]
└── build.gradle
- 빌드 도구: Gradle
- CI 도구: Jenkins
- Git 호스팅: GitLab
🚀 Jenkins Pipeline 예시 (Jenkinsfile)
아래는 Jenkins를 이용하여 빌드와 배포를 수행하는 Jenkinsfile 예제입니다.
pipeline {
agent any
tools {
jdk 'JDK17'
}
environment {
GIT_CREDENTIALS_ID = 'gitlab-credentials'
REPO_URL = 'https://gitlab.com/your-org/msa-project.git'
BRANCH = 'main'
}
stages {
stage('Checkout') {
steps {
script {
// Submodule 포함하여 Git Checkout
checkout([$class: 'GitSCM',
branches: [[name: "${env.BRANCH}"]],
userRemoteConfigs: [[
url: "${env.REPO_URL}",
credentialsId: "${env.GIT_CREDENTIALS_ID}"
]],
extensions: [
[$class: 'SubmoduleOption', recursiveSubmodules: true]
]
])
}
}
}
stage('Update Submodules') {
steps {
// 최신 Submodule 코드 업데이트
sh '''
git submodule init
git submodule update --remote --merge
'''
}
}
stage('Update Subtrees') {
steps {
// Subtree 업데이트 (예: payment-module)
sh '''
git subtree pull --prefix=services/order-service/payment-module \
https://gitlab.com/your-org/payment-module.git main --squash
git subtree pull --prefix=services/user-service/notification-module \
https://gitlab.com/your-org/notification-module.git main --squash
'''
}
}
stage('Build MSA Services') {
steps {
// Gradle을 이용하여 서비스 빌드
sh './gradlew clean build'
}
}
stage('Docker Image Build & Push') {
steps {
script {
// 예시로 order-service Docker 이미지 빌드
sh '''
docker build -t yourregistry.com/order-service:latest services/order-service/
docker push yourregistry.com/order-service:latest
'''
}
}
}
stage('Deploy to Kubernetes (k8s)') {
steps {
script {
withCredentials([file(credentialsId: 'kubeconfig-credentials', variable: 'KUBECONFIG')]) {
sh '''
export KUBECONFIG=$KUBECONFIG
kubectl apply -f services/order-service/k8s/deployment.yaml
kubectl apply -f services/user-service/k8s/deployment.yaml
'''
}
}
}
}
}
post {
success {
echo '✅ 모든 단계 성공!'
}
failure {
echo '❌ 빌드 또는 배포 중 에러 발생'
}
}
}
📚 상세 설명
✔️ Stage별 목적 및 의미:
단계(Stage) 목적 및 역할
Checkout | 메인 프로젝트 및 Submodule을 포함한 코드 Checkout |
Update Submodules | Submodule로 등록된 공통 코드 최신화 |
Update Subtrees | Subtree로 관리되는 모듈 최신 변경사항 반영 |
Build MSA Services | Gradle 빌드 수행 |
Docker Image Build & Push | Docker 이미지 빌드 및 이미지 레지스트리 푸시 |
Deploy to Kubernetes (k8s) | k8s 환경의 Kubernetes에 배포 수행 |
🔖 주요 명령어 다시 보기
✅ Submodule 관련 명령어
# 초기화 및 최신 코드 반영
git submodule init
git submodule update --remote --merge
✅ Subtree 관련 명령어
# 최신 코드 반영 (Subtree Pull)
git subtree pull --prefix=<경로> <레포지토리URL> <브랜치> --squash
🚧 주의사항 및 베스트 프랙티스
- Credentials 관리: Jenkins에서 GitLab credential을 미리 등록하여 안전하게 관리합니다.
- Subtree 및 Submodule 업데이트 주기: Submodule은 빈번히 변경되므로 매 빌드마다 최신화하는 것이 좋습니다. Subtree는 필요할 때만 주기적으로 업데이트합니다 (예: 하루 1회, 주 1회 등).
- 에러 관리: Submodule이나 Subtree 업데이트 시 conflict가 발생할 수 있으므로 Jenkins 빌드 로그를 통해 쉽게 파악할 수 있게 구성합니다.
🚩 요약 및 최종 추천 전략
이 Jenkins Pipeline 예시는 MSA 프로젝트에서 Submodule과 Subtree를 명확히 구분하여 최적의 형태로 운영할 수 있도록 안내합니다.
- Submodule은 MSA 환경의 공통 라이브러리(API 정의, 인증 로직 등)에 적합합니다.
- Subtree는 개별 서비스에 속해있으나 별도 모듈로 관리되어 낮은 빈도로 업데이트되는 기능 모듈에 적합합니다.
이 방식을 통해 MSA의 모듈화와 서비스 독립성을 지키면서도 관리 효율성을 높일 수 있습니다.
728x90
'CI_CD' 카테고리의 다른 글
Harbor 설치 방법 (docker, kubernetes) (0) | 2025.03.29 |
---|---|
CI/CD 파이프라인 구축 시 추천 오픈소스 도구 (1) | 2025.03.23 |
MSA(Microservices Architecture) 환경에서 Git Submodule과 Git Subtree를 혼합한 하이브리드 방식 (0) | 2025.03.20 |
Git에서 Subtree와 Submodule을 동시에 사용하는 하이브리드 운영 방법 (0) | 2025.03.20 |
실무에서 유용한 Git Subtree 활용 팁 7가지 (0) | 2025.03.20 |