Lionel Jouin | ab2f897 | 2022-12-15 11:14:43 +0100 | [diff] [blame] | 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 | } |
Lionel Jouin | 9fc85f6 | 2023-05-10 16:07:22 +0200 | [diff] [blame] | 68 | stage('Report') { |
| 69 | Report(environment_name, ip_family).call() |
| 70 | } |
Lionel Jouin | ab2f897 | 2022-12-15 11:14:43 +0100 | [diff] [blame] | 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' |
Lionel Jouin | ab2f897 | 2022-12-15 11:14:43 +0100 | [diff] [blame] | 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 { |
Lionel Jouin | 2d28d8a | 2023-03-07 17:58:33 +0100 | [diff] [blame] | 94 | def wait = sh(script: "echo `expr $interval \\* $previous_id`", returnStdout: true).trim() |
| 95 | stage("Wait $wait seconds") { |
| 96 | sh "sleep $wait" |
Lionel Jouin | ab2f897 | 2022-12-15 11:14:43 +0100 | [diff] [blame] | 97 | } |
| 98 | stage('E2E') { |
| 99 | def command = "make e2e E2E_ENVIRONMENT=\"$environment_name\" E2E_IP_FAMILY=\"$ip_family\" E2E_FOCUS=\"$focus\" E2E_SKIP=\"$skip\"" |
Lionel Jouin | 2d28d8a | 2023-03-07 17:58:33 +0100 | [diff] [blame] | 100 | timeout(time: interval, unit: 'SECONDS') { |
| 101 | try { |
| 102 | ExecSh(command).call() |
| 103 | } catch (Exception e) { |
| 104 | unstable 'Failing e2e' |
| 105 | } |
Lionel Jouin | ab2f897 | 2022-12-15 11:14:43 +0100 | [diff] [blame] | 106 | } |
Lionel Jouin | 9fc85f6 | 2023-05-10 16:07:22 +0200 | [diff] [blame] | 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) { |
Lionel Jouin | ab2f897 | 2022-12-15 11:14:43 +0100 | [diff] [blame] | 128 | } |
Lionel Jouin | ab2f897 | 2022-12-15 11:14:43 +0100 | [diff] [blame] | 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 | } |