Jenkinsfile-gitlab 23.4 KB
Newer Older
1
#!/bin/groovy
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/*
 * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The OpenAirInterface Software Alliance licenses this file to You under
 * the OAI Public License, Version 1.1  (the "License"); you may not use this file
 * except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.openairinterface.org/?page_id=698
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *-------------------------------------------------------------------------------
 * For more information about the OpenAirInterface (OAI) Software Alliance:
 *      contact@openairinterface.org
 */
22

23
24
25
26
27
28
29
30
31
32
// Abstraction function to send social media messages:
// like on Slack or Mattermost
def sendSocialMediaMessage(pipeChannel, pipeColor, pipeMessage) {
    if (params.pipelineUsesSlack != null) {
        if (params.pipelineUsesSlack) {
            slackSend channel: pipeChannel, color: pipeColor, message: pipeMessage
        }
    }
}

Raphael Defosseux's avatar
CI:    
Raphael Defosseux committed
33
34
def doRedHatBuild = false

35
36
37
38
39
40
41
42
pipeline {
    agent {
        label 'bellatrix'
    }
    options {
        disableConcurrentBuilds()
        timestamps()
        gitLabConnection('OAI GitLab')
43
        gitlabBuilds(builds: ["Build eNb-USRP", "Build basic-sim", "Build phy-sim", "Build eNb-ethernet", "Build UE-ethernet", "Analysis with cppcheck", "Test phy-sim", "Test basic-sim", "Test-FDD-Band7", "Test-TDD-Band40"])
Raphael Defosseux's avatar
CI:    
Raphael Defosseux committed
44
        ansiColor('xterm')
45
46
47
    }

    stages {
Raphael Defosseux's avatar
CI:    
Raphael Defosseux committed
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
        stage ("Verify Parameters") {
            steps {
                script {
                    echo '\u2705 \u001B[32mVerify Parameters\u001B[0m'
                    def allParametersPresent = true

                    if (params.RedHatRemoteServer == null) {
                        allParametersPresent = false
                    }
                    if (params.RedHatRemoteCredentials == null) {
                        allParametersPresent = false
                    }
                    if (params.RedHatWorkingPath == null) {
                        allParametersPresent = false
                    }
                    if (allParametersPresent) {
64
                        echo "Performing Red Hat Build"
Raphael Defosseux's avatar
CI:    
Raphael Defosseux committed
65
66
67
68
69
70
71
                        doRedHatBuild = true
                    } else {
                        doRedHatBuild = false
                    }
                }
            }
        }
72
        stage ("Verify Guidelines") {
73
74
75
76
77
            steps {
                echo "Git URL         is ${GIT_URL}"
                echo "GitLab Act      is ${env.gitlabActionType}"
                script {
                    if ("MERGE".equals(env.gitlabActionType)) {
78
                        // GitLab-Jenkins plugin integration is lacking to perform the merge by itself
79
                        // Doing it manually --> it may have merge conflicts
80
                        sh "./ci-scripts/doGitLabMerge.sh --src-branch ${env.gitlabSourceBranch} --src-commit ${env.gitlabMergeRequestLastCommit} --target-branch ${env.gitlabTargetBranch} --target-commit ${GIT_COMMIT}"
81
                        sh "zip -r -qq localZip.zip ."
82
83
84
85

                        // Running astyle options on the list of modified files by the merge request
                        // For the moment, there is no fail criteria. Just a notification of number of files that do not follow
                        sh "./ci-scripts/checkCodingFormattingRules.sh --src-branch ${env.gitlabSourceBranch} --target-branch ${env.gitlabTargetBranch}"
86
87
                        def res=readFile('./oai_rules_result.txt').trim();
                        if ("0".equals(res)) {
88
89
                            def message = "OAI " + JOB_NAME + " build (" + BUILD_ID + "): All Changed files in Merge Request follow OAI Formatting Rules"
                            addGitLabMRComment comment: message
90
                        } else {
91
92
                            def message = "OAI " + JOB_NAME + " build (" + BUILD_ID + "): Some Changed files in Merge Request DO NOT follow OAI Formatting Rules"
                            addGitLabMRComment comment: message
93
94
95
96
                        }
                    } else {
                        echo "Git Branch      is ${GIT_BRANCH}"
                        echo "Git Commit      is ${GIT_COMMIT}"
97

98
                        sh "zip -r -qq localZip.zip ."
99
100
                        // Running astyle options on all C/H files in the repository
                        // For the moment, there is no fail criteria. Just a notification of number of files that do not follow
101
                        sh "./ci-scripts/checkCodingFormattingRules.sh"
102
103
104
                    }
                }
            }
105
106
            post {
                failure {
107
108
109
110
                    script {
                        def message = "OAI " + JOB_NAME + " build (" + BUILD_ID + "): Merge Conflicts -- Cannot perform CI"
                        addGitLabMRComment comment: message
                    }
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
        stage ("Start VM -- cppcheck") {
            steps {
                sh "./ci-scripts/createVM.sh --variant cppcheck --job-name ${JOB_NAME} --build-id ${BUILD_ID}"
            }
        }

        stage ("Start VM -- enb-usrp") {
            steps {
                sh "./ci-scripts/createVM.sh --variant enb-usrp --job-name ${JOB_NAME} --build-id ${BUILD_ID}"
            }
        }

        stage ("Start VM -- basic-sim") {
            steps {
                sh "./ci-scripts/createVM.sh --variant basic-sim --job-name ${JOB_NAME} --build-id ${BUILD_ID}"
            }
        }

        stage ("Start VM -- phy-sim") {
            steps {
                sh "./ci-scripts/createVM.sh --variant phy-sim --job-name ${JOB_NAME} --build-id ${BUILD_ID}"
            }
        }

        stage ("Start VM -- enb-ethernet") {
            steps {
                sh "./ci-scripts/createVM.sh --variant enb-ethernet --job-name ${JOB_NAME} --build-id ${BUILD_ID}"
            }
        }

        stage ("Start VM -- ue-ethernet") {
            steps {
                sh "./ci-scripts/createVM.sh --variant ue-ethernet --job-name ${JOB_NAME} --build-id ${BUILD_ID}"
            }
        }

151
152
        stage ("Variant Builds") {
            parallel {
153
154
155
                stage ("Analysis with cppcheck") {
                    steps {
                        gitlabCommitStatus(name: "Analysis with cppcheck") {
156
                            sh "./ci-scripts/buildOnVM.sh --workspace $WORKSPACE --variant cppcheck --job-name ${JOB_NAME} --build-id ${BUILD_ID}"
157
158
159
                        }
                    }
                }
160
161
162
                stage ("Build eNb-USRP") {
                    steps {
                        gitlabCommitStatus(name: "Build eNb-USRP") {
163
                            sh "./ci-scripts/buildOnVM.sh --workspace $WORKSPACE --variant enb-usrp --job-name ${JOB_NAME} --build-id ${BUILD_ID}"
164
165
166
167
168
169
                        }
                    }
                }
                stage ("Build basic simulator") {
                    steps {
                        gitlabCommitStatus(name: "Build basic-sim") {
170
                            sh "./ci-scripts/buildOnVM.sh --workspace $WORKSPACE --variant basic-sim --job-name ${JOB_NAME} --build-id ${BUILD_ID} --keep-vm-alive"
171
172
                        }
                    }
173
                }
Raphael Defosseux's avatar
Raphael Defosseux committed
174
175
176
                stage ("Build physical simulators") {
                    steps {
                        gitlabCommitStatus(name: "Build phy-sim") {
177
                            sh "./ci-scripts/buildOnVM.sh --workspace $WORKSPACE --variant phy-sim --job-name ${JOB_NAME} --build-id ${BUILD_ID} --keep-vm-alive"
Raphael Defosseux's avatar
Raphael Defosseux committed
178
179
180
                        }
                    }
                }
181
182
183
184
185
186
187
188
189
190
191
192
193
194
                stage ("Build eNb-ethernet") {
                    steps {
                        gitlabCommitStatus(name: "Build eNb-ethernet") {
                            sh "./ci-scripts/buildOnVM.sh --workspace $WORKSPACE --variant enb-ethernet --job-name ${JOB_NAME} --build-id ${BUILD_ID} --keep-vm-alive"
                        }
                    }
                }
                stage ("Build UE-ethernet") {
                    steps {
                        gitlabCommitStatus(name: "Build UE-ethernet") {
                            sh "./ci-scripts/buildOnVM.sh --workspace $WORKSPACE --variant ue-ethernet --job-name ${JOB_NAME} --build-id ${BUILD_ID} --keep-vm-alive"
                        }
                    }
                }
Raphael Defosseux's avatar
CI:    
Raphael Defosseux committed
195
196
197
198
199
                stage ("Build eNb-USRP on Red Hat") {
                    when {
                        expression {doRedHatBuild}
                    }
                    steps {
Raphael Defosseux's avatar
Raphael Defosseux committed
200
201
202
203
204
205
206
207
208
209
                        gitlabCommitStatus(name: "Build eNb-USRP-CentOS") {
                            script {
                                try {
                                    withCredentials([
                                        [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.RedHatRemoteCredentials}", usernameVariable: 'RH_Username', passwordVariable: 'RH_Password']
                                    ]) {
                                        sh "./ci-scripts/buildOnRH.sh --workspace $WORKSPACE --job-name ${JOB_NAME} --build-id ${BUILD_ID} --remote-host ${params.RedHatRemoteServer} --remote-path ${params.RedHatWorkingPath} --remote-user-name ${RH_Username} --remote-password ${RH_Password}"
                                    }
                                } catch (Exception e) {
                                    echo "Red Hat build failed not an error now"
Raphael Defosseux's avatar
CI:    
Raphael Defosseux committed
210
211
212
213
214
                                }
                            }
                        }
                    }
                }
215
216
217
218
            }
            post {
                always {
                    script {
219
                        dir ('archives') {
Raphael Defosseux's avatar
CI:    
Raphael Defosseux committed
220
                            sh "zip -r -qq vm_build_logs.zip basic_sim enb_usrp phy_sim cppcheck enb_eth ue_eth red_hat"
221
222
223
                        }
                        if(fileExists('archives/vm_build_logs.zip')) {
                            archiveArtifacts artifacts: 'archives/vm_build_logs.zip'
224
225
226
                        }
                        if ("MERGE".equals(env.gitlabActionType)) {
                            sh "./ci-scripts/reportBuildLocally.sh --git-url ${GIT_URL} --job-name ${JOB_NAME} --build-id ${BUILD_ID} --trigger merge-request --src-branch ${env.gitlabSourceBranch} --src-commit ${env.gitlabMergeRequestLastCommit} --target-branch ${env.gitlabTargetBranch} --target-commit ${GIT_COMMIT}"
Raphael Defosseux's avatar
CI:    
Raphael Defosseux committed
227
228
229
230
231
                            sh "./ci-scripts/checkAddedWarnings.sh --src-branch ${env.gitlabSourceBranch} --target-branch ${env.gitlabTargetBranch}"
                            def res=readFile('./oai_warning_files.txt').trim();
                            if ("0".equals(res)) {
                                echo "No issues w/ warnings/errors in this merge request"
                            } else {
232
                                def fileList=readFile('./oai_warning_files_list.txt').trim();
Raphael Defosseux's avatar
CI:    
Raphael Defosseux committed
233
234
235
                                def message = "OAI " + JOB_NAME + " build (" + BUILD_ID + "): Some modified files in Merge Request MAY have INTRODUCED WARNINGS (" + fileList + ")"
                                addGitLabMRComment comment: message
                            }
236
237
238
239
                        } else {
                            sh "./ci-scripts/reportBuildLocally.sh --git-url ${GIT_URL} --job-name ${JOB_NAME} --build-id ${BUILD_ID} --trigger push --branch ${GIT_BRANCH} --commit ${GIT_COMMIT}"
                        }
                        if(fileExists('build_results.html')) {
Raphael Defosseux's avatar
Raphael Defosseux committed
240
                            sh "sed -i -e 's#Build-ID: ${BUILD_ID}#Build-ID: <a href=\"{BUILD_URL}\">${BUILD_ID}</a>#' build_results.html"
241
242
243
244
245
246
                            archiveArtifacts artifacts: 'build_results.html'
                        }
                    }
                }
            }
        }
Raphael Defosseux's avatar
Raphael Defosseux committed
247

Raphael Defosseux's avatar
Raphael Defosseux committed
248
249
250
251
252
        stage ("Variant Tests") {
            parallel {
                stage ("Test physical simulators") {
                    steps {
                        gitlabCommitStatus(name: "Test phy-sim") {
253
                            sh "./ci-scripts/runTestOnVM.sh --workspace $WORKSPACE --variant phy-sim --job-name ${JOB_NAME} --build-id ${BUILD_ID}"
Raphael Defosseux's avatar
Raphael Defosseux committed
254
255
256
257
258
                        }
                    }
                }
                stage ("Test basic simulator") {
                    steps {
259
                        gitlabCommitStatus(name: "Test basic-sim") {
Raphael Defosseux's avatar
Raphael Defosseux committed
260
                            sh "./ci-scripts/runTestOnVM.sh --workspace $WORKSPACE --variant basic-sim --job-name ${JOB_NAME} --build-id ${BUILD_ID} --keep-vm-alive"
261
                        }
Raphael Defosseux's avatar
Raphael Defosseux committed
262
263
                    }
                }
264
265
266
267
                stage ("Test on CI bench #1") {
                    stages {
                        stage ("Test FDD - Band 7 - B210") {
                            steps {
268
269
270
271
272
                                script {
                                    try {
                                        if ("MERGE".equals(env.gitlabActionType)) {
                                            gitlabCommitStatus(name: "Test-FDD-Band7") {
                                                build job: 'eNB-CI-FDD-Band7-B210',
273
274
275
276
277
278
                                                   parameters: [
                                                       string(name: 'eNB_Repository', value: String.valueOf(GIT_URL)),
                                                       string(name: 'eNB_Branch', value: String.valueOf(env.gitlabSourceBranch)),
                                                       string(name: 'eNB_CommitID', value: String.valueOf(env.gitlabMergeRequestLastCommit)),
                                                       booleanParam(name: 'eNB_mergeRequest', value: true)
                                                   ]
279
280
281
282
                                            }
                                        } else {
                                            gitlabCommitStatus(name: "Test-FDD-Band7") {
                                                build job: 'eNB-CI-FDD-Band7-B210',
283
284
285
286
287
288
289
                                                   parameters: [
                                                       string(name: 'eNB_Repository', value: String.valueOf(GIT_URL)),
                                                       string(name: 'eNB_Branch', value: String.valueOf(GIT_BRANCH)),
                                                       string(name: 'eNB_CommitID', value: String.valueOf(GIT_COMMIT)),
                                                       booleanParam(name: 'eNB_mergeRequest', value: false)
                                                   ]
                                            }
290
                                        }
291
292
                                    } catch (Exception e) {
                                        currentBuild.result = 'FAILURE'
293
                                    }
Raphael Defosseux's avatar
Raphael Defosseux committed
294
                                }
295
                            }
296
297
                            post {
                                // In case of any non-success, we are retrieving the HTML report of the last completed
298
                                // slave job.
299
                                // The only drop-back is that we may retrieve the HTML report of a previous build
300
                                always {
301
302
303
304
305
306
307
308
309
310
                                    script {
                                        if (!fileExists('test_results-eNB-CI-FDD-Band7-B210.html')) {
                                            copyArtifacts(projectName: 'eNB-CI-FDD-Band7-B210',
                                                          filter: 'test_results*.html',
                                                          selector: lastCompleted())
                                            if (fileExists('test_results-eNB-CI-FDD-Band7-B210.html')) {
                                                archiveArtifacts artifacts: 'test_results-eNB-CI-FDD-Band7-B210.html'
                                            }
                                        }
                                    }
311
312
313
                                }
                            }
                        }
314
315
                        stage ("Test TDD - Band 40 - B210") {
                            steps {
316
317
318
319
320
                                script {
                                    try {
                                        if ("MERGE".equals(env.gitlabActionType)) {
                                            gitlabCommitStatus(name: "Test-TDD-Band40") {
                                                build job: 'eNB-CI-TDD-Band40-B210',
321
322
323
324
325
326
                                                   parameters: [
                                                       string(name: 'eNB_Repository', value: String.valueOf(GIT_URL)),
                                                       string(name: 'eNB_Branch', value: String.valueOf(env.gitlabSourceBranch)),
                                                       string(name: 'eNB_CommitID', value: String.valueOf(env.gitlabMergeRequestLastCommit)),
                                                       booleanParam(name: 'eNB_mergeRequest', value: true)
                                                   ]
327
328
329
330
                                            }
                                        } else {
                                            gitlabCommitStatus(name: "Test-TDD-Band40") {
                                                build job: 'eNB-CI-TDD-Band40-B210',
331
332
333
334
335
336
337
                                                   parameters: [
                                                       string(name: 'eNB_Repository', value: String.valueOf(GIT_URL)),
                                                       string(name: 'eNB_Branch', value: String.valueOf(GIT_BRANCH)),
                                                       string(name: 'eNB_CommitID', value: String.valueOf(GIT_COMMIT)),
                                                       booleanParam(name: 'eNB_mergeRequest', value: false)
                                                   ]
                                            }
338
                                        }
339
340
                                    } catch (Exception e) {
                                        currentBuild.result = 'FAILURE'
341
342
343
344
345
                                    }
                                }
                            }
                            post {
                                // In case of any non-success, we are retrieving the HTML report of the last completed
346
                                // slave job.
347
                                // The only drop-back is that we may retrieve the HTML report of a previous build
348
                                always {
349
350
351
352
353
354
355
356
357
                                    script {
                                        if (!fileExists('test_results-eNB-CI-TDD-Band40-B210.html')) {
                                            copyArtifacts(projectName: 'eNB-CI-TDD-Band40-B210',
                                                          filter: 'test_results*.html',
                                                          selector: lastCompleted())
                                            if (fileExists('test_results-eNB-CI-TDD-Band40-B210.html')) {
                                                archiveArtifacts artifacts: 'test_results-eNB-CI-TDD-Band40-B210.html'
                                            }
                                        }
Raphael Defosseux's avatar
CI:    
Raphael Defosseux committed
358
359
360
361
                                    }
                                }
                            }
                        }
362
                    }
363
                }
Raphael Defosseux's avatar
Raphael Defosseux committed
364
365
366
367
368
            }
            post {
                always {
                    script {
                        dir ('archives') {
369
                            sh "if [ -d basic_sim/test ] || [ -d phy_sim/test ]; then zip -r -qq vm_tests_logs.zip */test ; fi"
Raphael Defosseux's avatar
Raphael Defosseux committed
370
371
372
                        }
                        if(fileExists('archives/vm_tests_logs.zip')) {
                            archiveArtifacts artifacts: 'archives/vm_tests_logs.zip'
373
374
375
376
377
378
                            if ("MERGE".equals(env.gitlabActionType)) {
                                sh "./ci-scripts/reportTestLocally.sh --git-url ${GIT_URL} --job-name ${JOB_NAME} --build-id ${BUILD_ID} --trigger merge-request --src-branch ${env.gitlabSourceBranch} --src-commit ${env.gitlabMergeRequestLastCommit} --target-branch ${env.gitlabTargetBranch} --target-commit ${GIT_COMMIT}"
                            } else {
                                sh "./ci-scripts/reportTestLocally.sh --git-url ${GIT_URL} --job-name ${JOB_NAME} --build-id ${BUILD_ID} --trigger push --branch ${GIT_BRANCH} --commit ${GIT_COMMIT}"
                            }
                            if(fileExists('test_simulator_results.html')) {
Raphael Defosseux's avatar
Raphael Defosseux committed
379
                                sh "sed -i -e 's#Build-ID: ${BUILD_ID}#Build-ID: <a href=\"{BUILD_URL}\">${BUILD_ID}</a>#' test_simulator_results.html"
380
381
                                archiveArtifacts artifacts: 'test_simulator_results.html'
                            }
Raphael Defosseux's avatar
Raphael Defosseux committed
382
383
384
385
386
                        }
                    }
                }
            }
        }
Raphael Defosseux's avatar
Raphael Defosseux committed
387
388
389
390
391
        stage ("Destroy all Virtual Machines") {
            steps {
                sh "./ci-scripts/destroyAllRunningVM.sh --job-name ${JOB_NAME} --build-id ${BUILD_ID}"
            }
        }
392
393
394
    }
    post {
        always {
395
            script {
Raphael Defosseux's avatar
Raphael Defosseux committed
396
397
                // Stage destroy may not be run if error in previous stage
                sh "./ci-scripts/destroyAllRunningVM.sh --job-name ${JOB_NAME} --build-id ${BUILD_ID}"
398
399
400
401
402
403
404
405
406
                emailext attachmentsPattern: '*results*.html',
                     body: '''Hi,
Here are attached HTML report files for $PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS!

Regards,
OAI CI Team''',
                     replyTo: 'no-reply@openairinterface.org',
                     subject: '$PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS!',
                     to: env.gitlabUserEmail
407
            }
408
409
410
        }
        success {
            script {
411
                def message = "OAI " + JOB_NAME + " build (" + BUILD_ID + "): passed (" + BUILD_URL + ")"
412
413
414
                if ("MERGE".equals(env.gitlabActionType)) {
                    echo "This is a MERGE event"
                    addGitLabMRComment comment: message
415
                    def message2 = "OAI " + JOB_NAME + " build (" + BUILD_ID + "): passed (" + BUILD_URL + ") -- MergeRequest #" + env.gitlabMergeRequestIid + " (" + env.gitlabMergeRequestTitle + ")"
416
                    sendSocialMediaMessage('ci-enb', 'good', message2)
417
                } else {
418
                    sendSocialMediaMessage('ci-enb', 'good', message)
419
420
421
422
423
                }
            }
        }
        failure {
            script {
424
                def message = "OAI " + JOB_NAME + " build (" + BUILD_ID + "): failed (" + BUILD_URL + ")"
425
426
427
                if ("MERGE".equals(env.gitlabActionType)) {
                    echo "This is a MERGE event"
                    addGitLabMRComment comment: message
428
                    def message2 = "OAI " + JOB_NAME + " build (" + BUILD_ID + "): failed (" + BUILD_URL + ") -- MergeRequest #" + env.gitlabMergeRequestIid + " (" + env.gitlabMergeRequestTitle + ")"
429
                    sendSocialMediaMessage('ci-enb', 'danger', message2)
430
                } else {
431
                    sendSocialMediaMessage('ci-enb', 'danger', message)
432
433
434
435
436
                }
            }
        }
    }
}