-
Notifications
You must be signed in to change notification settings - Fork 0
/
Jenkinsfile
165 lines (153 loc) · 4.51 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
#!groovy
pipeline {
agent none
environment {
DOCKER_IMAGE = 'licql/petclinic'
SONARQUBE_ENV = 'sonar'
TEAMS_WEBHOOK_URL = 'teams_url'
}
options {
timeout(time: 1, unit: 'HOURS')
disableConcurrentBuilds()
}
parameters {
choice(name: 'ENV', choices: ['dev', 'qa'], description: 'Environment to deploy to')
string(name: 'VERSION', defaultValue: 'latest', description: 'Docker image version to deploy')
}
stages {
stage("Check Commit Message") {
agent any
steps {
script {
checkCommitMessage()
}
}
}
stage("Clone Repository") {
agent any
steps {
script {
cloneRepository()
}
}
}
stage("Static Code Analysis") {
agent {
docker { image 'maven:3.8.4-openjdk-17' }
}
steps {
script {
runStaticCodeAnalysis()
}
}
}
stage("Build Docker Image") {
agent any
steps {
script {
buildDockerImage()
}
}
}
stage("Push Docker Image") {
agent any
steps {
script {
pushDockerImage()
}
}
}
stage("Deploy") {
agent any
steps {
script {
deployImage(params.ENV, params.VERSION)
}
}
}
stage("Health Check") {
agent any
steps {
script {
runHealthCheck()
}
}
}
}
post {
success {
script {
notifyTeams("Build succeeded: ${currentBuild.fullDisplayName}")
}
}
failure {
script {
notifyTeams("Build failed: ${currentBuild.fullDisplayName}")
}
}
}
}
// ================================================================================================
// Functions
// ================================================================================================
def checkCommitMessage() {
def changeLogSets = currentBuild.changeSets
def commitMessagePattern = ~/^JIRA-\d+: .+/
changeLogSets.each { changeLogSet ->
changeLogSet.items.each { entry ->
def msg = entry.msg
if (!msg.matches(commitMessagePattern)) {
error("Commit message '${msg}' does not follow the required pattern 'JIRA-<number>: <message>'")
}
}
}
}
def cloneRepository() {
withCredentials([usernamePassword(credentialsId: 'github_token', passwordVariable: 'GITHUB_PASSWORD', usernameVariable: 'GITHUB_USERNAME')]) {
sh 'rm -rf spring-petclinic'
sh "git clone --depth 1 -b main https://${GITHUB_USERNAME}:${GITHUB_PASSWORD}@github.com/spring-projects/spring-petclinic.git"
}
}
def runStaticCodeAnalysis() {
dir('spring-petclinic') {
withSonarQubeEnv('sonar') {
sh './mvnw clean verify sonar:sonar -DskipTests'
}
}
}
def buildDockerImage() {
dir('spring-petclinic') {
def buildTag = "${env.BUILD_ID}"
sh "docker build -t ${DOCKER_IMAGE}:latest -t ${DOCKER_IMAGE}:${buildTag} ."
}
}
def pushDockerImage() {
docker.withRegistry('https://registry.hub.docker.com', 'dockerHubCredentials') {
def imageName = "${DOCKER_IMAGE}"
def buildTag = "${env.BUILD_ID}"
sh "docker push ${imageName}:latest"
sh "docker push ${imageName}:${buildTag}"
}
}
def deployImage(environment, version) {
docker.withRegistry('https://registry.hub.docker.com', 'dockerHubCredentials') {
def imageName = "${DOCKER_IMAGE}:${version}"
sh "docker pull ${imageName}"
sh "docker run -d --name petclinic-${environment} -p 8080:8080 ${imageName}"
}
}
def runHealthCheck() {
def url = "http://localhost:8080/actuator/health"
sh "sleep 10" // Pause to allow the container to start
sh "curl -f ${url} || exit 1"
}
def notifyTeams(message) {
def payload = JsonOutput.toJson([text: message])
httpRequest(
acceptType: 'APPLICATION_JSON',
contentType: 'APPLICATION_JSON',
httpMode: 'POST',
requestBody: payload,
url: env.TEAMS_WEBHOOK_URL
)
}