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 | } |
| 68 | stage('Cleanup') { |
| 69 | Cleanup() |
| 70 | } |
| 71 | } |
| 72 | } |
| 73 | |
| 74 | // Creates the list of e2e to run during this job |
| 75 | def E2EList(number_of_runs, interval, environment_name, ip_family, focus, skip) { |
| 76 | return { |
| 77 | def stages = [:] |
| 78 | def list = sh(script: "seq -w 1 $number_of_runs | paste -sd ' ' -", returnStdout: true).trim().split(' ') |
| 79 | def previous = '0' |
| 80 | env.E2E_PREVIOUSLY_EXECUTED = previous |
| 81 | for (i in list) { |
| 82 | stages.put("$i", E2E(i, previous, interval, environment_name, ip_family, focus, skip)) |
| 83 | previous = i |
| 84 | } |
| 85 | parallel(stages) |
| 86 | } |
| 87 | } |
| 88 | |
| 89 | // Run e2e |
| 90 | def E2E(id, previous_id, interval, environment_name, ip_family, focus, skip) { |
| 91 | return { |
| 92 | stage('Wait for previous') { |
| 93 | waitUntil(initialRecurrencePeriod: 15000, quiet: true) { |
| 94 | return env.E2E_PREVIOUSLY_EXECUTED == previous_id |
| 95 | } |
| 96 | } |
| 97 | if (previous_id != '0') { |
| 98 | stage("Wait $interval seconds") { |
| 99 | sh "sleep $interval" |
| 100 | } |
| 101 | } |
| 102 | stage('E2E') { |
| 103 | def command = "make e2e E2E_ENVIRONMENT=\"$environment_name\" E2E_IP_FAMILY=\"$ip_family\" E2E_FOCUS=\"$focus\" E2E_SKIP=\"$skip\"" |
| 104 | try { |
| 105 | ExecSh(command).call() |
| 106 | } catch (Exception e) { |
| 107 | unstable 'Failing e2e' |
| 108 | } |
| 109 | } |
| 110 | env.E2E_PREVIOUSLY_EXECUTED = id |
| 111 | } |
| 112 | } |
| 113 | |
| 114 | // Raise error in Jenkins job |
| 115 | def Error(e) { |
| 116 | return { |
| 117 | Cleanup() |
| 118 | error e |
| 119 | } |
| 120 | } |
| 121 | |
| 122 | // Cleanup directory and kind cluster |
| 123 | def Cleanup() { |
| 124 | def command = 'make -s -C docs/demo/scripts/kind/ clean' |
| 125 | ExecSh(command).call() |
| 126 | cleanWs() |
| 127 | } |
| 128 | |
| 129 | // Execute command |
| 130 | def ExecSh(command) { |
| 131 | return { |
| 132 | if (env.DRY_RUN != 'true') { |
| 133 | sh """ |
| 134 | . \${HOME}/.profile |
| 135 | ${command} |
| 136 | """ |
| 137 | } else { |
| 138 | echo "${command}" |
| 139 | } |
| 140 | } |
| 141 | } |