-
Notifications
You must be signed in to change notification settings - Fork 0
/
Jenkinsfile
182 lines (158 loc) · 5.43 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
171
172
173
174
175
176
177
178
179
180
181
182
/*
Create By Jack Ran
2020.04.12
Set the environment variable in Jenkins
DINGTALK_ROBOT
EMAIL_TO
HARBOR_URL
HARBOR_URL_TAG
IRISHMAN_HARBOR_IMAGE
EMAIL_TEMPLATE_MOUNT_FILE
*/
//set slave label
def slave_label() {
return "jenkins-slave-k8s"
}
//get commit tag
def imageTag() {
return sh(script: "git rev-parse --short HEAD", returnStdout: true).trim()
}
//set version using timestamp
def createVersion() {
// 定义一个版本号作为当次构建的版本,输出结果 20191210175842_69
return new Date().format('yyyyMMddHHmmss') + "_${env.BUILD_ID}"
}
//dcoker build
def buildImage() {
// docker.build("${env.HARBOR_URL_TAG}/ranzhendong/irishman:${build_tag}")
// script表示里面是脚本式写法
script {
docker.build("${env.HARBOR_URL_TAG}/ranzhendong/irishman:${build_tag}")
}
}
//change email template html
//using configmap mount to slave node
def changeTemp(String color, res, agent) {
sh "cat ${env.EMAIL_TEMPLATE_MOUNT_FILE} > /home/email-template.html "
sh "sed -i 's/BUILD_COLOR/${color}/g' /home/email-template.html"
sh "sed -i 's/BUILD_RESULT/${res}/g' /home/email-template.html"
sh "sed -i 's/JENKINS_AGENT_NAME/${agent}/g' /home/email-template.html"
return sh(script: "cat /home/email-template.html", returnStdout: true)
}
//dingtalk info
def changeDingtalk(String res) {
return """
### ${env.gitlabSourceRepoName}项目构建通知
#### **构建状态:** ${res}\n\n
#### **构建人员:** ${env.gitlabUserName}\n
> 触发分支: ${env.gitlabTargetBranch}\n
> 项目地址: [${env.gitlabSourceRepoName}](${env.gitlabSourceRepoHomepage})\n
> Commit地址: [${build_tag}](${env.gitlabSourceRepoHomepage}/commit/${env.gitlabMergeRequestLastCommit})\n
"""
}
pipeline {
// agent any
agent{
label slave_label()
}
options {
// 表示保留10次构建历史
//buildDiscarder(logRotator(numToKeepStr: '10'))
// 不允许同时执行流水线,被用来防止同时访问共享资源等
disableConcurrentBuilds()
// 设置流水线运行的超时时间, 在此之后,Jenkins将中止流水线
timeout(time: 10, unit: 'MINUTES')
// 重试次数
retry(1)
}
stages {
stage('Add ENV'){
steps{
sh 'printenv'
// 脚本式写法,赋值变量
script {
//build tag
build_tag = imageTag()
//dingtalk robot infomation
title = "Jenkins Notice"
}
}
}
stage('Build') {
steps {
// 镜像构建
buildImage()
}
}
stage('Push') {
steps {
echo "4.Push Docker Image Stage"
withCredentials([usernamePassword(credentialsId: 'zhendongharbor', passwordVariable: 'zhendongharborPassword', usernameVariable: 'zhendongharborUser')]) {
sh "docker login -u ${zhendongharborUser} -p ${zhendongharborPassword} ${env.HARBOR_URL}"
sh "docker push ${env.HARBOR_URL_TAG}/ranzhendong/irishman:${build_tag}"
}
}
}
stage('YAML') {
steps {
echo "5. Change YAML File Stage"
sh "sed -i 's!.*image:.*! - image: ${env.HARBOR_URL_TAG}/ranzhendong/irishman:${build_tag}!' /irishman/irishman-deployment.yaml"
sh "sed -i 's!.*value:.*! value: ${env.BRANCH_NAME}!' /irishman/irishman-deployment.yaml"
}
}
stage('DEPLOY') {
steps {
sh "kubectl apply -f /irishman/irishman-deployment.yaml"
}
}
}
post {
success {
script {
info = changeDingtalk("Success✅")
}
//dingtalk notice
sh """
curl '${env.DINGTALK_ROBOT}' \
-H 'Content-Type: application/json' \
-d '{"msgtype": "markdown",
"markdown": {
"title": "${title}",
"text": "${info}"
}
}'
"""
//email notice
//emailext has default configure at jenkins Global configuration
emailext (
subject: "Successful: Pipeline ${env.JOB_NAME} - Build: #${env.BUILD_NUMBER}",
to: "${env.EMAIL_TO}",
attachLog: true,
compressLog: true,
body: changeTemp("green"," SUCCESSFUL","${env.JENKINS_AGENT_NAME}")
)
}
failure {
script {
info = changeDingtalk("Failure❌")
}
sh """
curl '${env.DINGTALK_ROBOT}' \
-H 'Content-Type: application/json' \
-d '{"msgtype": "markdown",
"markdown": {
"title": "${title}",
"text": "${info}"
}
}'
"""
emailext (
subject: "Failure: Pipeline ${env.JOB_NAME} - Build: #${env.BUILD_NUMBER}",
to: "${env.EMAIL_TO}",
attachLog: true,
compressLog: true,
body: changeTemp("red"," FAILURE","${env.JENKINS_AGENT_NAME}")
)
}
}
}