-
Notifications
You must be signed in to change notification settings - Fork 4
/
Jenkinsfile
131 lines (112 loc) · 4.67 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
def latestImageTag
def buildImageTag
def gitHashImageTag
def branchLatestTag
pipeline {
agent { label 'linux' }
environment {
DOCKER_REGISTRY = 'https://docker.psiphon.io'
DOCKER_IMAGE_NAME = 'docker.psiphon.io/telegram_bot/telegram_bot'
}
stages {
stage('Build main docker image') {
when {
branch 'master'
}
steps {
script {
latestImageTag = env.DOCKER_IMAGE_NAME + ':latest'
// Will be of the format <image>:jenkins-<name of job>-<build-number>
// Example <image>:jenkins-telegram-bot-master-10
buildImageTag = env.DOCKER_IMAGE_NAME + ':' + env.BUILD_TAG.replaceAll(" ", "-")
gitHashImageTag = env.DOCKER_IMAGE_NAME + ':' + env.GIT_COMMIT
}
withDockerRegistry([credentialsId: 'psiphon-docker-io-creds', url: env.DOCKER_REGISTRY]) {
sh label: 'Pull latest image to populate build cache',
script: 'docker pull ' + latestImageTag,
returnStatus: true // okay if this fails
sh label: 'Build docker image',
script: """
docker build \
--tag ${latestImageTag} \
--tag ${buildImageTag} \
--tag ${gitHashImageTag} \
.
"""
sh label: 'Push latest tag',
script: 'docker push ' + latestImageTag
sh label: 'Push git hash tag',
script: 'docker push ' + gitHashImageTag
sh label: 'Push build image tag',
script: 'docker push ' + buildImageTag
}
}
}
stage('Build PR docker image') {
when {
changeRequest()
}
steps {
script {
latestImageTag = env.DOCKER_IMAGE_NAME + ':latest'
// Will be of the format <image>:jenkins-<name of job>-<build-number>
// Example <image>:jenkins-telegram-bot-PR-5-10
buildImageTag = env.DOCKER_IMAGE_NAME + ':' + env.BUILD_TAG.replaceAll(" ", "-")
gitHashImageTag = env.DOCKER_IMAGE_NAME + ':' + env.GIT_COMMIT
branchLatestTag = env.DOCKER_IMAGE_NAME + ":" + env.BRANCH_NAME + '-latest'
}
withDockerRegistry([credentialsId: 'psiphon-docker-io-creds', url: env.DOCKER_REGISTRY]) {
script {
try {
sh label: 'Pull existing branch image to populate build cache',
script: 'docker pull ' + branchLatestTag
} catch (exc) {
echo 'Could not pull existing branch image, trying latest main build'
try {
sh label: 'Pull latest image to populate build cache',
script: 'docker pull ' + latestImageTag
} catch (inner_exc) {
echo 'No latest image found'
}
}
}
sh label: 'Build docker image',
script: """
docker build \
--tag ${branchLatestTag} \
--tag ${buildImageTag} \
--tag ${gitHashImageTag} \
.
"""
sh label: 'Push PR latest tag',
script: 'docker push ' + branchLatestTag
sh label: 'Push git hash tag',
script: 'docker push ' + gitHashImageTag
sh label: 'Push build image tag',
script: 'docker push ' + buildImageTag
}
}
}
}
post {
failure {
script {
changes = getChangeList()
}
slackSend message:"${env.JOB_NAME} - Build #${env.BUILD_NUMBER} failed (<${env.BUILD_URL}|Open>)\nChanges:\n${changes}",
color: "danger"
}
}
}
String getChangeList() {
if (currentBuild.changeSets.size() == 0) {
return "No changes"
}
def changeList = ""
for (changeSet in currentBuild.changeSets) {
for (entry in changeSet.items) {
changeList += "- ${entry.msg} [${entry.authorName}]\n"
}
}
return changeList
}