Add periodic bmo tests for release-0.6
[infra/cicd.git] / jjb / nsm / e2e-long-run.Jenkinsfile
1 /*
2 Copyright (c) 2022 Nordix Foundation
3
4 Licensed under the Apache License, Version 2.0 (the "License");
5 you may not use this file except in compliance with the License.
6 You may obtain a copy of the License at
7
8     http://www.apache.org/licenses/LICENSE-2.0
9
10 Unless required by applicable law or agreed to in writing, software
11 distributed under the License is distributed on an "AS IS" BASIS,
12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 See the License for the specific language governing permissions and
14 limitations under the License.
15 */
16 import org.jenkinsci.plugins.pipeline.modeldefinition.Utils
17
18 node('nordix-nsm-build-ubuntu2204') {
19     build_number = env.BUILD_NUMBER
20     workspace = env.WORKSPACE
21     ws("${workspace}/${build_number}") {
22         def git_project = params.GIT_PROJECT
23         def current_branch = params.CURRENT_BRANCH
24         def default_branch = params.DEFAULT_BRANCH
25
26         def meridio_version = params.MERIDIO_VERSION
27         def tapa_version = params.TAPA_VERSION
28         def kubernetes_version = params.KUBERNETES_VERSION
29         def nsm_version = params.NSM_VERSION
30         def ip_family = params.IP_FAMILY
31         def number_of_workers = params.NUMBER_OF_WORKERS
32         def environment_name = params.ENVIRONMENT_NAME
33         def focus = params.FOCUS
34         def skip = params.SKIP
35
36         def number_of_runs = params.NUMBER_OF_RUNS
37         def interval = params.INTERVAL
38
39         stage('Clone/Checkout') {
40             git branch: default_branch, url: git_project
41             checkout([
42                 $class: 'GitSCM',
43                 branches: [[name: current_branch]],
44                 extensions: [],
45                 userRemoteConfigs: [[
46                     refspec: '+refs/pull/*/head:refs/remotes/origin/pr/*',
47                     url: git_project
48                 ]]
49             ])
50             sh 'git show'
51         }
52         timeout(30) {
53             stage('Environment') {
54                 def command = "make -s -C test/e2e/environment/$environment_name/ KUBERNETES_VERSION=$kubernetes_version NSM_VERSION=$nsm_version IP_FAMILY=$ip_family KUBERNETES_WORKERS=$number_of_workers MERIDIO_VERSION=$meridio_version TAPA_VERSION=$tapa_version"
55                 try {
56                     ExecSh(command).call()
57                 } catch (org.jenkinsci.plugins.workflow.steps.FlowInterruptedException e) {
58                     currentBuild.result = 'ABORTED'
59                 } catch (Exception e) {
60                     unstable 'Environment setup failed'
61                     currentBuild.result = 'FAILURE'
62                 }
63             }
64         }
65         stage('E2E List') {
66             E2EList(number_of_runs, interval, environment_name, ip_family, focus, skip).call()
67         }
68         stage('Report') {
69             Report(environment_name, ip_family).call()
70         }
71         stage('Cleanup') {
72             Cleanup()
73         }
74     }
75 }
76
77 // Creates the list of e2e to run during this job
78 def E2EList(number_of_runs, interval, environment_name, ip_family, focus, skip) {
79     return {
80         def stages = [:]
81         def list = sh(script: "seq -w 1 $number_of_runs | paste -sd ' ' -", returnStdout: true).trim().split(' ')
82         def previous = '0'
83         for (i in list) {
84             stages.put("$i", E2E(i, previous, interval, environment_name, ip_family, focus, skip))
85             previous = i
86         }
87         parallel(stages)
88     }
89 }
90
91 // Run e2e
92 def E2E(id, previous_id, interval, environment_name, ip_family, focus, skip) {
93     return {
94         def wait = sh(script: "echo `expr $interval \\* $previous_id`", returnStdout: true).trim()
95         stage("Wait $wait seconds") {
96             sh "sleep $wait"
97         }
98         stage('E2E') {
99             def command = "make e2e E2E_ENVIRONMENT=\"$environment_name\" E2E_IP_FAMILY=\"$ip_family\" E2E_FOCUS=\"$focus\" E2E_SKIP=\"$skip\""
100             timeout(time: interval, unit: 'SECONDS') {
101                 try {
102                     ExecSh(command).call()
103                 } catch (Exception e) {
104                     unstable 'Failing e2e'
105                 }
106             }
107             Archive(id).call()
108         }
109     }
110 }
111
112 def Report(environment_name, ip_family) {
113     return {
114         // Collect logs
115         def command = "cd ./test/e2e ; ./environment/$environment_name/$ip_family/test.sh on_failure"
116         ExecSh(command).call()
117         Archive('Report').call()
118     }
119 }
120
121 def Archive(id) {
122     return {
123         try {
124             sh "tar -czvf ${id}.tar.gz -C _output ."
125             archiveArtifacts artifacts: "${id}.tar.gz", followSymlinks: false
126             sh 'rm -rf _output ; mkdir -p _output'
127         } catch (Exception e) {
128         }
129     }
130 }
131
132 // Raise error in Jenkins job
133 def Error(e) {
134     return {
135         Cleanup()
136         error e
137     }
138 }
139
140 // Cleanup directory and kind cluster
141 def Cleanup() {
142     def command = 'make -s -C docs/demo/scripts/kind/ clean'
143     ExecSh(command).call()
144     cleanWs()
145 }
146
147 // Execute command
148 def ExecSh(command) {
149     return {
150         if (env.DRY_RUN != 'true') {
151             sh """
152                 . \${HOME}/.profile
153                 ${command}
154             """
155         } else {
156             echo "${command}"
157         }
158     }
159 }