blob: 15913737f19a1f3da8b30e9370504434cd38561d [file] [log] [blame]
/*
Copyright (c) 2022 Nordix Foundation
Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
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.
*/
import org.jenkinsci.plugins.pipeline.modeldefinition.Utils
node('nordix-nsm-build-ubuntu2204') {
build_number = env.BUILD_NUMBER
workspace = env.WORKSPACE
ws("${workspace}/${build_number}") {
def git_project = params.GIT_PROJECT
def current_branch = params.CURRENT_BRANCH
def default_branch = params.DEFAULT_BRANCH
def meridio_version = params.MERIDIO_VERSION
def tapa_version = params.TAPA_VERSION
def kubernetes_version = params.KUBERNETES_VERSION
def nsm_version = params.NSM_VERSION
def ip_family = params.IP_FAMILY
def number_of_workers = params.NUMBER_OF_WORKERS
def environment_name = params.ENVIRONMENT_NAME
def focus = params.FOCUS
def skip = params.SKIP
def number_of_runs = params.NUMBER_OF_RUNS
def interval = params.INTERVAL
stage('Clone/Checkout') {
git branch: default_branch, url: git_project
checkout([
$class: 'GitSCM',
branches: [[name: current_branch]],
extensions: [],
userRemoteConfigs: [[
refspec: '+refs/pull/*/head:refs/remotes/origin/pr/*',
url: git_project
]]
])
sh 'git show'
}
timeout(30) {
stage('Environment') {
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"
try {
ExecSh(command).call()
} catch (org.jenkinsci.plugins.workflow.steps.FlowInterruptedException e) {
currentBuild.result = 'ABORTED'
} catch (Exception e) {
unstable 'Environment setup failed'
currentBuild.result = 'FAILURE'
}
}
}
stage('E2E List') {
E2EList(number_of_runs, interval, environment_name, ip_family, focus, skip).call()
}
stage('Report') {
Report(environment_name, ip_family).call()
}
stage('Cleanup') {
Cleanup()
}
}
}
// Creates the list of e2e to run during this job
def E2EList(number_of_runs, interval, environment_name, ip_family, focus, skip) {
return {
def stages = [:]
def list = sh(script: "seq -w 1 $number_of_runs | paste -sd ' ' -", returnStdout: true).trim().split(' ')
def previous = '0'
for (i in list) {
stages.put("$i", E2E(i, previous, interval, environment_name, ip_family, focus, skip))
previous = i
}
parallel(stages)
}
}
// Run e2e
def E2E(id, previous_id, interval, environment_name, ip_family, focus, skip) {
return {
def wait = sh(script: "echo `expr $interval \\* $previous_id`", returnStdout: true).trim()
stage("Wait $wait seconds") {
sh "sleep $wait"
}
stage('E2E') {
def command = "make e2e E2E_ENVIRONMENT=\"$environment_name\" E2E_IP_FAMILY=\"$ip_family\" E2E_FOCUS=\"$focus\" E2E_SKIP=\"$skip\""
timeout(time: interval, unit: 'SECONDS') {
try {
ExecSh(command).call()
} catch (Exception e) {
unstable 'Failing e2e'
}
}
Archive(id).call()
}
}
}
def Report(environment_name, ip_family) {
return {
// Collect logs
def command = "cd ./test/e2e ; ./environment/$environment_name/$ip_family/test.sh on_failure"
ExecSh(command).call()
Archive('Report').call()
}
}
def Archive(id) {
return {
try {
sh "tar -czvf ${id}.tar.gz -C _output ."
archiveArtifacts artifacts: "${id}.tar.gz", followSymlinks: false
sh 'rm -rf _output ; mkdir -p _output'
} catch (Exception e) {
}
}
}
// Raise error in Jenkins job
def Error(e) {
return {
Cleanup()
error e
}
}
// Cleanup directory and kind cluster
def Cleanup() {
def command = 'make -s -C docs/demo/scripts/kind/ clean'
ExecSh(command).call()
cleanWs()
}
// Execute command
def ExecSh(command) {
return {
if (env.DRY_RUN != 'true') {
sh """
. \${HOME}/.profile
${command}
"""
} else {
echo "${command}"
}
}
}