-
Notifications
You must be signed in to change notification settings - Fork 2
/
Jenkinsfile
130 lines (116 loc) · 3.26 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
// deploy apps in need.
setJobProperties()
def config = readConfig()
node (config.node) {
stage("prepare") {
scmCheckout(config)
}
if (shouldProceed(config) || env.forceDeploy) {
stage("verify config") {
checkConfig(config)
}
stage("copy config") {
copyConfig(config)
}
stage("update apps") {
updateApps(config)
}
}
}
// checkConfig verifies config files.
def checkConfig(config) {
ws("${env.WORKSPACE}/${repoName(config)}") {
// verifies docker-compose config
sh "docker-compose -f ${config.compose_file} config"
// verifies nginx config
sh """docker run -v ${pwd()}:${pwd()} \
-v "/etc/nginx:/etc/nginx" \
${nginxImage(config)} sh -c ' \
echo 127.0.0.1 jenkins-wechat >> /etc/hosts && \
echo 127.0.0.1 jenkins-mirror-proxy >> /etc/hosts && \
echo 127.0.0.1 jenkins-nexus3 >> /etc/hosts && \
nginx -t -c ${pwd()}/${config.nginx_config}'"""
// verifies ssh pub key config
sh "python3 -m sshmanager --verify"
}
}
// copyConfig copies config files to specific host paths
def copyConfig(config) {
// copy nginx config
sh "mkdir -p /etc/nginx && cp -f ${repoName(config)}/${config.nginx_config} /etc/nginx/nginx.current.conf"
}
// updateApps updates apps in need.
def updateApps(config) {
def force = Boolean.valueOf(env.forceDeploy)? "--force-recreate":""
def reloadFailed = false
try {
sh "docker-compose -f ${repoName(config)}/${config.compose_file} up -d ${force}"
sh "python3 -m sshmanager"
}
catch(Exception e) {
reloadFailed = true
throw e
}
finally {
sendMail(config, reloadFailed)
}
}
// sendMail sends mail according to the value of onFailed.
def sendMail(config, onFailed) {
def msg = config.email.failed
if (!onFailed) {
msg = config.email.success
}
try {
mail(msg)
}
catch(Exception e) {
// just prints a message and sets this build to unstable status.
println "failed to send mail"
setUnstable()
}
}
// nginxImage returns the name of nginx image.
def nginxImage(config) {
def compose = readYaml file: config.compose_file
return compose.services."jenkins-nginx".image
}
// setJobProperties sets the pipeline properties.
def setJobProperties() {
properties([buildDiscarder(logRotator(daysToKeepStr: '30', numToKeepStr: '100')),
parameters([booleanParam(defaultValue: false, description: '', name: 'forceDeploy')]),
disableConcurrentBuilds(),
disableResume()]
)
}
// repoName returns the repo name.
def repoName(config) {
return config.git.url.trim().split("/")[-1].split("\\.")[0]
}
// scmCheckout downloads the git repo, branch is default to master.
def scmCheckout(config) {
def branch = config.git.branch?:"master"
sh "rm -rf ${repoName(config)}"
sh "git clone ${config.git.url} --depth=2 --no-tags --branch ${branch}"
}
// shouldProceed proceeds the pipeline in need.
def shouldProceed(config) {
def folders = config.git.folders?:[""]
ws("${env.WORKSPACE}/${repoName(config)}") {
def out = sh(returnStdout: true, script: "git diff HEAD HEAD^ --name-only ${folders.join(' ')}")
if (out.trim() == "") {
return false
}
return true
}
}
// setUnstable sets the build result to another status.
def setUnstable() {
currentBuild.result = "UNSTABLE"
}
// readConfig reads pipeline config.
def readConfig() {
def text = readTrusted 'config.yaml'
def config = readYaml text: text
return config
}