blob: 15913737f19a1f3da8b30e9370504434cd38561d [file] [log] [blame]
Lionel Jouinab2f8972022-12-15 11:14:43 +01001/*
2Copyright (c) 2022 Nordix Foundation
3
4Licensed under the Apache License, Version 2.0 (the "License");
5you may not use this file except in compliance with the License.
6You may obtain a copy of the License at
7
8 http://www.apache.org/licenses/LICENSE-2.0
9
10Unless required by applicable law or agreed to in writing, software
11distributed under the License is distributed on an "AS IS" BASIS,
12WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13See the License for the specific language governing permissions and
14limitations under the License.
15*/
16import org.jenkinsci.plugins.pipeline.modeldefinition.Utils
17
18node('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 }
Lionel Jouin9fc85f62023-05-10 16:07:22 +020068 stage('Report') {
69 Report(environment_name, ip_family).call()
70 }
Lionel Jouinab2f8972022-12-15 11:14:43 +010071 stage('Cleanup') {
72 Cleanup()
73 }
74 }
75}
76
77// Creates the list of e2e to run during this job
78def 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'
Lionel Jouinab2f8972022-12-15 11:14:43 +010083 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
92def E2E(id, previous_id, interval, environment_name, ip_family, focus, skip) {
93 return {
Lionel Jouin2d28d8a2023-03-07 17:58:33 +010094 def wait = sh(script: "echo `expr $interval \\* $previous_id`", returnStdout: true).trim()
95 stage("Wait $wait seconds") {
96 sh "sleep $wait"
Lionel Jouinab2f8972022-12-15 11:14:43 +010097 }
98 stage('E2E') {
99 def command = "make e2e E2E_ENVIRONMENT=\"$environment_name\" E2E_IP_FAMILY=\"$ip_family\" E2E_FOCUS=\"$focus\" E2E_SKIP=\"$skip\""
Lionel Jouin2d28d8a2023-03-07 17:58:33 +0100100 timeout(time: interval, unit: 'SECONDS') {
101 try {
102 ExecSh(command).call()
103 } catch (Exception e) {
104 unstable 'Failing e2e'
105 }
Lionel Jouinab2f8972022-12-15 11:14:43 +0100106 }
Lionel Jouin9fc85f62023-05-10 16:07:22 +0200107 Archive(id).call()
108 }
109 }
110}
111
112def 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
121def 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) {
Lionel Jouinab2f8972022-12-15 11:14:43 +0100128 }
Lionel Jouinab2f8972022-12-15 11:14:43 +0100129 }
130}
131
132// Raise error in Jenkins job
133def Error(e) {
134 return {
135 Cleanup()
136 error e
137 }
138}
139
140// Cleanup directory and kind cluster
141def Cleanup() {
142 def command = 'make -s -C docs/demo/scripts/kind/ clean'
143 ExecSh(command).call()
144 cleanWs()
145}
146
147// Execute command
148def 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}