티스토리 뷰

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
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함