-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathjenkinsfile
152 lines (138 loc) · 6.88 KB
/
jenkinsfile
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
pipeline {
agent any
environment {
GITHUB_REPO = "https://github.com/homeless-code-team/homeless-cde-msa.git"
}
stages {
stage('Checkout') {
steps {
echo "===== [Checkout] GitHub에서 저장소를 Pull 합니다. ====="
withCredentials([usernamePassword(credentialsId: 'gitToken', usernameVariable: 'GIT_USER', passwordVariable: 'GIT_PASS')]) {
sh '''
if [ ! -d "homeless-cde-msa/.git" ]; then
echo "🚀 Repository does not exist. Cloning..."
git clone https://$GIT_USER:$GIT_PASS@github.com/homeless-code-team/homeless-cde-msa.git
else
echo "✅ Repository exists. Pulling latest changes..."
fi
cd homeless-cde-msa
git reset --hard
git pull origin develop
'''
}
echo "===== [Checkout] 완료 ====="
}
}
stage('Detect Changed Files') {
steps {
echo "===== [Detect Changed Files] 변경된 파일들을 감지합니다. ====="
script {
def changedFiles = sh(script: '''
cd homeless-cde-msa
git diff --name-only HEAD~1 HEAD || echo ""
''', returnStdout: true).trim()
echo "🔍 Changed files: ${changedFiles}"
def changedModules = sh(script: """
echo "${changedFiles}" | awk -F'/' '{print \$1}' | sort -u | grep -E '(-server|-service)' || echo ""
""", returnStdout: true).trim()
echo "🚀 Changed modules (servers & services): ${changedModules}"
def dockerComposeChanged = sh(script: '''
echo "${changedFiles}" | grep "docker-compose.yaml" || echo ""
''', returnStdout: true).trim()
echo "📄 docker-compose.yaml changed: ${dockerComposeChanged}"
def configServerChanged = sh(script: '''
echo "${changedFiles}" | grep "config-service" || echo ""
''', returnStdout: true).trim()
echo "⚙️ Config Service changed: ${configServerChanged}"
env.CHANGED_MODULES = changedModules ? changedModules : "none"
env.DOCKER_COMPOSE_CHANGED = dockerComposeChanged ? "yes" : "no"
env.CONFIG_SERVER_CHANGED = configServerChanged ? "yes" : "no"
if (configServerChanged) {
env.CHANGED_MODULES = "all"
}
echo "=== 최종 CHANGED_MODULES: ${env.CHANGED_MODULES} ==="
}
echo "===== [Detect Changed Files] 완료 ====="
}
}
stage('Build JAR Files') {
when { expression { return env.CHANGED_MODULES != "none" || env.CONFIG_SERVER_CHANGED == "yes" } }
steps {
echo "===== [Build JAR Files] 변경된 모듈에 대해 JAR 빌드를 진행합니다. ====="
script {
def modules = env.CHANGED_MODULES.tokenize("\n")
if (env.CONFIG_SERVER_CHANGED == "yes") {
modules.add("config-service")
}
modules.each { module ->
echo "🔨 [${module}] 빌드를 시작합니다."
sh """
(cd homeless-cde-msa/${module} && chmod +x ./gradlew && ./gradlew clean build -x test)
"""
}
}
echo "===== [Build JAR Files] 완료 ====="
}
}
stage('Build & Push Docker Images') {
when { expression { return env.CHANGED_MODULES != "none" } }
steps {
echo "===== [Build & Push Docker Images] Docker 이미지 빌드 및 푸시를 진행합니다. ====="
withCredentials([usernamePassword(credentialsId: 'docker-hub-credentials', usernameVariable: 'DOCKER_USER', passwordVariable: 'DOCKER_PASS')]) {
sh '''
echo "$DOCKER_PASS" | docker login -u "$DOCKER_USER" --password-stdin
'''
}
script {
def modules = env.CHANGED_MODULES.tokenize("\n")
if (env.CONFIG_SERVER_CHANGED == "yes") {
modules.add("config-service")
}
modules.each { module ->
echo "🐳 [${module}] Docker 이미지 빌드 및 푸시를 시작합니다."
sh """
echo ">> Docker build for ${module}"
docker build -t sihyogeon/homeless-cde-msa:${module} homeless-cde-msa/${module}
echo ">> Docker push for ${module}"
docker push sihyogeon/homeless-cde-msa:${module}
"""
}
}
echo "===== [Build & Push Docker Images] 완료 ====="
}
}
stage('Copy docker-compose.yaml to EC2') {
steps {
echo "===== [Copy docker-compose.yaml to EC2] 업데이트된 docker-compose.yaml 파일을 EC2로 전송합니다. ====="
withCredentials([sshUserPrivateKey(credentialsId: 'jenkins-ec2-key', keyFileVariable: 'SSH_KEY')]) {
sh '''
echo ">> Copy docker-compose.yaml to EC2"
scp -o StrictHostKeyChecking=no -i $SSH_KEY homeless-cde-msa/docker-compose.yaml ubuntu@3.35.152.209:/home/ubuntu/app/docker-compose.yaml
'''
}
echo "===== [Copy docker-compose.yaml to EC2] 완료 ====="
}
}
stage('Deploy to EC2') {
steps {
echo "===== [Deploy to EC2] EC2에 배포를 진행합니다. ====="
withCredentials([sshUserPrivateKey(credentialsId: 'jenkins-ec2-key', keyFileVariable: 'SSH_KEY')]) {
sh '''
echo ">> Deploying to EC2..."
ssh -o StrictHostKeyChecking=no -i $SSH_KEY ubuntu@3.35.152.209 << 'EOF'
cd /home/ubuntu/app
docker-compose pull
docker-compose up -d
EOF
'''
}
echo "===== [Deploy to EC2] 완료 ====="
}
}
}
post {
always {
echo "===== Pipeline 종료 ====="
}
}
}