-
Notifications
You must be signed in to change notification settings - Fork 0
/
Jenkinsfile
241 lines (215 loc) · 8.41 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
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
def image
def branch_name = "${env.BRANCH_NAME}" as String
def build_number = "${env.BUILD_NUMBER}" as String
def commit_hash
def tag_name = 'jb_' + branch_name + "_" + build_number
def api_image_name = 'anmeldesystem/anmeldesystem-backend:' + tag_name
def container_database_name = 'anmeldesystem_newman-testing_db_' + tag_name
def container_newman_name = 'anmeldesystem_newman-testing_newman_' + tag_name
def container_backend_name = 'anmeldesystem_newman-testing_backend_' + tag_name
def network_name = 'anmeldesystem_newman-testing_network_' + tag_name
def volume_name = 'anmeldesystem_newman-testing_volume_' + tag_name
pipeline {
agent any
environment {
KEYCLOAK_TEST_GJM_ADMIN_PASSWORD = credentials('KEYCLOAK_TEST_GJM_ADMIN_PASSWORD')
GITHUB_STATUS_ACCESS_TOKEN_SEBAMOMANN = credentials('GITHUB_STATUS_ACCESS_TOKEN_SEBAMOMANN')
}
options {
ansiColor('xterm')
}
stages {
stage('Preamble') {
steps {
script {
echo 'Updating status'
updateStatus("pending")
}
script {
commit_hash = sh(returnStdout: true, script: 'git rev-parse HEAD').trim()
echo 'Control Variables'
echo '-------------------'
echo "COMMIT HASH: ${commit_hash}"
echo "BRANCH NAME: ${branch_name}"
echo "BUILD NUMBER: ${build_number}"
}
}
}
stage('Build Docker image') {
steps {
script {
image = docker.build(api_image_name)
}
}
}
stage('Newman - preamble') {
steps {
script {
echo 'Spinup network'
try {
sh 'docker network create ' + network_name
} catch (err) {
echo err.getMessage()
}
}
script {
echo 'Spinup volume'
try {
sh 'docker volume create ' + volume_name
} catch (err) {
echo err.getMessage()
}
}
}
}
stage('Newman - spinup API and DB') {
steps {
script {
sh 'MYSQL_CONTAINER_NAME=' + container_database_name + ' ' +
'BACKEND_CONTAINER_NAME=' + container_backend_name + ' ' +
'API_IMAGE_NAME=' + api_image_name + ' ' +
'NEWMAN_CONTAINER_NAME=' + container_newman_name + ' ' +
'NETWORK_NAME=' + network_name + ' ' +
'KEYCLOAK_ADMIN_PASSWORD=$KEYCLOAK_TEST_GJM_ADMIN_PASSWORD ' +
'docker-compose -f newman-prepare.docker-compose.yml up ' +
'--detach'
timeout(5) {
waitUntil {
"healthy" == sh(returnStdout: true,
script: "docker inspect " + container_backend_name + " --format=\"{{ .State.Health.Status }}\"").trim()
}
}
}
}
}
//Needs to be in extra step, because the backend is creating the DB Schema
stage('Newman - populate database') {
steps {
script {
sh 'docker exec -i ' + container_database_name + ' mysql -uuser -ppassword anmeldesystem-newman < $(pwd)/test/testdata/data_I_main.sql'
}
}
}
stage('Newman - prepare volume') {
steps {
script {
sh 'docker container create --name temp_' + container_newman_name + ' -v ' + volume_name + ':/data busybox'
sh 'docker cp $(pwd)/test/collection/gjm.postman_collection.json temp_' + container_newman_name + ':/data/collection.json'
sh 'docker cp $(pwd)/test/testdata/files/testfile.pdf temp_' + container_newman_name + ':/data/testfile.pdf'
sh 'docker cp $(pwd)/test/testdata/files/testfile.txt temp_' + container_newman_name + ':/data/testfile.txt'
sh 'docker rm temp_' + container_newman_name
}
}
}
stage('Newman - execute') {
steps {
script {
sh 'docker run ' +
'-v ' + volume_name + ':/etc/newman ' +
'-v /var/www/vhosts/sebamomann.dankoe.de/additional_testing.dein.li/gjm-newman.postman_environment:/etc/newman/environment.json.postman_environment ' +
'--name ' + container_newman_name + ' ' +
'-p 3000:3000 ' +
'--net ' + network_name + ' ' +
'-t postman/newman:alpine ' +
'run "collection.json" ' +
'--environment="environment.json.postman_environment" ' +
'--env-var baseUrl=' + container_backend_name + ':3000 ' +
'-n 1 ' +
'--bail'
}
}
}
stage('Publish to registry') {
when {
expression {
return branch_name =~ /^\d\.\d\.\d(-\d+)?/
}
}
steps {
script {
docker.withRegistry('http://localhost:34015') {
image.push(branch_name)
}
}
}
}
stage('Publish to registry - master') {
when {
expression {
return branch_name =~ "master"
}
}
steps {
script {
docker.withRegistry('http://localhost:34015') {
image.push('latest')
}
}
}
}
}
post {
always {
script {
try {
sh 'docker container rm ' + container_backend_name + ' -f -v'
} catch (err) {
echo err.getMessage()
}
try {
sh 'docker container rm ' + container_newman_name + ' -f -v'
} catch (err) {
echo err.getMessage()
}
try {
sh 'docker container rm ' + container_database_name + ' -f -v'
} catch (err) {
echo err.getMessage()
}
try {
sh 'docker network rm ' + network_name
} catch (err) {
echo err.getMessage()
}
try {
sh 'docker volume rm ' + volume_name + ' -f'
} catch (err) {
echo err.getMessage()
}
try {
sh 'docker image rm ' + api_image_name + ' -f'
} catch (err) {
echo err.getMessage()
}
}
}
success {
script {
updateStatus("success")
try {
sh 'docker image prune --filter label=stage=intermediate -f --volumes'
} catch (err) {
echo err.getMessage()
}
}
}
failure {
script {
updateStatus("failure")
}
}
aborted {
script {
updateStatus("error")
}
}
}
}
void updateStatus(String value) {
sh 'curl -s "https://api.github.com/repos/sebamomann/anmeldesystem-backend/statuses/$GIT_COMMIT" \\\n' +
' -H "Content-Type: application/json" \\\n' +
' -H "Authorization: token $GITHUB_STATUS_ACCESS_TOKEN_SEBAMOMANN" \\\n' +
' -X POST \\\n' +
' -d "{\\"state\\": \\"' + value + '\\", \\"description\\": \\"Jenkins\\", \\"context\\": \\"continuous-integration/jenkins\\", \\"target_url\\": \\"https://jenkins.dankoe.de/job/anmeldesystem-backend/job/$BRANCH_NAME/$BUILD_NUMBER/console\\"}" \\\n' +
' '
}