forked from TEAM-2NE1/steach-server
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathJenkinsfile
170 lines (153 loc) · 8.19 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
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
pipeline {
agent any // 어떤 노드에서나 실행 가능
environment {
IMAGE_NAME = 'steach-server' // Docker 이미지 이름 설정
}
triggers {
githubPush() // GitHub 푸시 이벤트 트리거
}
stages {
stage('Checkout') { // 코드 체크아웃 단계
steps {
script {
// BRANCH_NAME 변수는 Jenkins가 자동으로 설정해주는 환경 변수로, 빌드 트리거된 브랜치의 이름을 가집니다.
// 그러나, 이 변수가 자동으로 설정되지 않는 경우도 있으므로, 이를 명시적으로 설정해야 할 수 있습니다.
def branch = env.GIT_BRANCH ? env.GIT_BRANCH.replaceAll(/^origin\//, '') : 'main'
env.BRANCH_NAME = branch
echo "Checking out branch: ${branch}" // 변경된 브랜치 표시
checkout([
$class: 'GitSCM',
// [[name: "${branch}"]]: 이 부분은 branches 키워드의 값으로, 실제로 체크아웃할 브랜치를 나타냅니다. 리스트 내의 딕셔너리 형태로 작성됩니다.
branches: [[name: "${branch}"]], // 변경된 브랜치를 지정
userRemoteConfigs: [[
url: 'https://github.com/TEAM-2NE1/steach-server.git',
credentialsId: 'steach-server-jen'
]]
])
}
// ====================Pipeline Syntax로 얻은 script코드 ==================
script {
def branch = env.GIT_BRANCH ? env.GIT_BRANCH.replaceAll(/^origin\//, '') : 'main'
checkout scmGit(
// BRANCH_NAME 변수는 Jenkins가 자동으로 설정해주는 환경 변수로, 빌드 트리거된 브랜치의 이름을 가집니다.
// 그러나, 이 변수가 자동으로 설정되지 않는 경우도 있으므로, 이를 명시적으로 설정해야 할 수 있습니다.
branches: [[name: "${branch}"]], // 변경된 브랜치를 지정
extensions: [submodule(parentCredentials: true, recursiveSubmodules: true, reference: '', trackingSubmodules: true)],
userRemoteConfigs: [[url: 'https://github.com/TEAM-2NE1/steach-server.git']]
)
}
}
}
stage('Verify Docker Installation') {
steps {
script {
sh 'docker --version' // Docker가 설치되어 있고, 명령어가 올바르게 작동하는지 확인합니다.
sh 'docker ps' // Docker 데몬에 접근할 수 있는지 확인
}
}
}
stage('Build') { // Docker 이미지 빌드 단계
steps {
script {
sh 'chmod +x ./gradlew' // gradlew 파일에 실행 권한 추가
sh './gradlew --no-daemon clean build'
echo 'build Image'
docker.build("${IMAGE_NAME}:latest") // Docker 이미지를 빌드하고 latest 태그 추가
}
}
}
stage('Deploy Server') {
steps {
script {
sh 'docker-compose --version'
sh 'docker-compose -f docker-compose.prod.yml down || true'
sh 'docker-compose -f docker-compose.prod.yml up -d --build'
// steach-server 컨테이너 실제 ID(긴 ID) 가져오기
def containerId = sh(script: "docker inspect --format='{{.Id}}' \$(docker ps -qf 'name=steach-server')", returnStdout: true).trim()
// 컨테이너 로그 경로 설정
env.SERVER_LOG_PATH = "/var/lib/docker/containers/${containerId}"
echo "log path : ${env.SERVER_LOG_PATH}"
}
}
}
stage('SonarQube Analysis') {
steps {
script {
// 수정
def branchName = env.BRANCH_NAME
sh "./gradlew --info --warning-mode all sonar -Dsonar.projectKey=steach-server-${branchName} -Dsonar.projectName=steach-server-${branchName}"
}
}
}
stage('Deploy Promtail') {
steps {
script {
// Alloy 컨테이너가 이미 존재하면 삭제 (없으면 무시)
sh """
if [ \$(docker ps -aq -f name=promtail) ]; then
docker rm -f promtail
fi
"""
// 동적으로 Docker Compose 파일 생성
writeFile file: 'docker-compose.promtail.yml', text: """
services:
promtail: # Promtail 서비스 설정입니다.
image: grafana/promtail:main
container_name: promtail # 컨테이너 이름을 'promtail'로 지정합니다.
volumes: # 여러 파일과 디렉토리를 마운트합니다.
- ${env.SERVER_LOG_PATH}:/var/log/steach-server # 호스트의 /var/log 디렉토리를 컨테이너의 /var/log 디렉토리로 마운트합니다.
- /var/run/docker.sock:/var/run/docker.sock # 호스트의 Docker 소켓을 컨테이너 내부로 마운트합니다.
- /home/ubuntu/grafana/promtail/promtail-config.yaml:/etc/promtail/promtail-config.yaml # 호스트의 Promtail 설정 파일을 컨테이너 내부로 마운트합니다.
command: -config.file=/etc/promtail/promtail-config.yaml # Promtail 설정 파일 경로를 지정합니다.
networks:
- steach-server-network # 'steach-server-network' 네트워크에 연결합니다.
networks:
steach-server-network:
external: true # 외부에서 생성된 네트워크를 사용하도록 설정합니다.
name: steach-server-network # 사용하려는 네트워크 이름을 'steach-server-network'로 지정합니다.
"""
sh 'docker-compose -f docker-compose.promtail.yml up -d --build'
}
}
}
stage('Deploy Alloy') {
steps {
script {
// Alloy 컨테이너가 이미 존재하면 삭제 (없으면 무시)
sh """
if [ \$(docker ps -aq -f name=alloy) ]; then
docker rm -f alloy
fi
"""
// 동적으로 Docker Compose 파일 생성
writeFile file: 'docker-compose.alloy.yml', text: """
services:
alloy:
image: grafana/alloy:latest
container_name: alloy
ports:
- 12345:12345
volumes:
- /home/ubuntu/grafana/alloy/alloy-config.alloy:/etc/alloy/config.alloy
- ${env.SERVER_LOG_PATH}:/tmp/log
command: run --server.http.listen-addr=0.0.0.0:12345 --storage.path=/var/lib/alloy/data /etc/alloy/config.alloy
networks:
- steach-server-network
networks:
steach-server-network:
external: true
name: steach-server-network
"""
sh 'docker-compose -f docker-compose.alloy.yml up -d --build'
}
}
}
}
post {
always {
sh 'docker-compose -f docker-compose.prod.yml logs || true' // Docker Compose 로그 출력
sh 'docker logs steach-server || true' // steach-server 컨테이너 로그 출력, 없으면 오류 무시
cleanWs() // 작업 공간 정리
}
}
}