+/*
+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-ubuntu1804') {
+node('nordix-nsm-build-ubuntu2204') {
build_number = env.BUILD_NUMBER
workspace = env.WORKSPACE
ws("${workspace}/${build_number}") {
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 seed = params.SEED
stage('Clone/Checkout') {
git branch: default_branch, url: git_project
])
sh 'git show'
}
- timeout(60) {
+ timeout(120) {
stage('Environment') {
- currentBuild.description = "Meridio version: $meridio_version / TAPA version: $tapa_version / NSM version: $nsm_version / IP Family: $ip_family / Kubernetes version: $kubernetes_version / Current Branch: $current_branch"
+ currentBuild.description = "Meridio version: $meridio_version / TAPA version: $tapa_version / NSM version: $nsm_version / IP Family: $ip_family / Kubernetes version: $kubernetes_version / Current Branch: $current_branch / Seed: $seed"
+ 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("make -s -C docs/demo/scripts/kind/ KUBERNETES_VERSION=$kubernetes_version NSM_VERSION=$nsm_version KUBERNETES_IP_FAMILY=$ip_family").call()
- ExecSh("helm install deployments/helm/ --generate-name --create-namespace --namespace red --set trench.name=trench-a --set ipFamily=$ip_family").call()
- ExecSh("helm install deployments/helm/ --generate-name --create-namespace --namespace red --set trench.name=trench-b --set vlan.id=200 --set ipFamily=$ip_family").call()
- ExecSh('helm install examples/target/deployments/helm/ --generate-name --create-namespace --namespace red --set applicationName=target-a --set default.trench.name=trench-a').call()
- ExecSh('helm install examples/target/deployments/helm/ --generate-name --create-namespace --namespace red --set applicationName=target-b --set default.trench.name=trench-b').call()
- sh 'sleep 10'
- ExecSh('kubectl wait --for=condition=Ready pods --all --all-namespaces --timeout=5m').call()
+ ExecSh(command).call()
+ } catch (org.jenkinsci.plugins.workflow.steps.FlowInterruptedException e) {
+ currentBuild.result = 'ABORTED'
} catch (Exception e) {
- Error('Error creating the environment').call()
+ unstable 'Environment setup failed'
+ currentBuild.result = 'FAILURE'
}
}
stage('E2E') {
- try {
- ExecSh("make e2e E2E_PARAMETERS=\"\$(cat ./test/e2e/environment/kind-helm/$ip_family/config.txt | tr '\\n' ' ')\"").call()
- } catch (Exception e) {
- unstable 'E2E Tests failed'
- currentBuild.result = 'FAILURE'
+ if (currentBuild.result != 'FAILURE' && currentBuild.result != 'ABORTED') {
+ def command = "make e2e E2E_PARAMETERS=\"\$(cat ./test/e2e/environment/$environment_name/$ip_family/config.txt | tr '\\n' ' ')\" E2E_SEED=$seed E2E_FOCUS=\"$focus\" E2E_SKIP=\"$skip\""
+ try {
+ ExecSh(command).call()
+ currentBuild.result = 'SUCCESS'
+ } catch (org.jenkinsci.plugins.workflow.steps.FlowInterruptedException e) {
+ currentBuild.result = 'ABORTED'
+ } catch (Exception e) {
+ unstable 'E2E Tests failed'
+ currentBuild.result = 'FAILURE'
+ }
+ } else {
+ Utils.markStageSkippedForConditional('E2E')
}
}
}
- stage('Cleanup') {
- Cleanup()
- }
stage('Report') {
- Report().call()
+ try {
+ Report(build_number).call()
+ } catch (org.jenkinsci.plugins.workflow.steps.FlowInterruptedException e) {
+ currentBuild.result = 'ABORTED'
+ } catch (Exception e) {
+ unstable 'Failed to create the report'
+ }
}
stage('Next') {
- Next(next).call()
+ if (next == true && currentBuild.result != 'ABORTED') {
+ Next(next, number_of_workers, environment_name, focus, skip, current_branch).call()
+ } else {
+ Utils.markStageSkippedForConditional('Next')
+ }
+ }
+ stage('Cleanup') {
+ Cleanup()
}
}
}
-def Next(next) {
- if (next == 'true') {
- return {
- def meridio_version = GetMeridioVersion()
- def tapa_version = GetTAPAVersion()
- def nsm_version = GetNSMVersion()
- def kubernetes_version = GetKubernetesVersion()
- def ip_family = GetIPFamily()
- echo "Meridio version: $meridio_version / TAPA version: $tapa_version / NSM version: $nsm_version / IP Family: $ip_family / Kubernetes version: $kubernetes_version"
- build job: 'meridio-e2e-test-kind', parameters: [
+def Next(next, number_of_workers, environment_name, focus, skip, current_branch) {
+ return {
+ def meridio_version = GetMeridioVersion(environment_name)
+ def tapa_version = GetTAPAVersion(environment_name)
+ def nsm_version = GetNSMVersion(environment_name)
+ def kubernetes_version = GetKubernetesVersion(environment_name)
+ def ip_family = GetIPFamily(environment_name)
+ def seed = GetSeed()
+ echo "Meridio version: $meridio_version / TAPA version: $tapa_version / NSM version: $nsm_version / IP Family: $ip_family / Kubernetes version: $kubernetes_version / Seed: $seed"
+ build job: 'meridio-e2e-test-kind', parameters: [
string(name: 'NEXT', value: 'true'),
string(name: 'MERIDIO_VERSION', value: "$meridio_version"),
string(name: 'TAPA_VERSION', value: "$tapa_version"),
string(name: 'KUBERNETES_VERSION', value: "$kubernetes_version"),
string(name: 'NSM_VERSION', value: "$nsm_version"),
- string(name: 'IP_FAMILY', value: "$ip_family")
+ string(name: 'IP_FAMILY', value: "$ip_family"),
+ string(name: 'NUMBER_OF_WORKERS', value: "$number_of_workers"),
+ string(name: 'ENVIRONMENT_NAME', value: "$environment_name"),
+ string(name: 'SEED', value: "$seed"),
+ string(name: 'FOCUS', value: "$focus"),
+ string(name: 'SKIP', value: "$skip"),
+ string(name: 'CURRENT_BRANCH', value: "$current_branch"),
+ string(name: 'DRY_RUN', value: env.DRY_RUN)
], wait: false
- }
- } else {
- return {
- Utils.markStageSkippedForConditional('Next')
- }
}
}
-def GetMeridioVersion() {
- def number_of_versions = sh(script: 'cat test/e2e/environment/kind-helm/test-scope.yaml | yq ".Meridio[]" | wc -l', returnStdout: true).trim()
+def GetMeridioVersion(environment_name) {
+ def number_of_versions = sh(script: "cat test/e2e/environment/$environment_name/test-scope.yaml | yq '.Meridio[]' | wc -l", returnStdout: true).trim()
def index_of_version_temp = sh(script: "shuf -i 1-$number_of_versions -n1", returnStdout: true).trim()
def index_of_version = sh(script: "expr $index_of_version_temp - 1 || true", returnStdout: true).trim()
- return sh(script: "cat test/e2e/environment/kind-helm/test-scope.yaml | yq '.Meridio[$index_of_version]'", returnStdout: true).trim()
+ return sh(script: "cat test/e2e/environment/$environment_name/test-scope.yaml | yq '.Meridio[$index_of_version]'", returnStdout: true).trim()
}
-def GetTAPAVersion() {
- def number_of_versions = sh(script: 'cat test/e2e/environment/kind-helm/test-scope.yaml | yq ".TAPA[]" | wc -l', returnStdout: true).trim()
+def GetTAPAVersion(environment_name) {
+ def number_of_versions = sh(script: "cat test/e2e/environment/$environment_name/test-scope.yaml | yq '.TAPA[]' | wc -l", returnStdout: true).trim()
def index_of_version_temp = sh(script: "shuf -i 1-$number_of_versions -n1", returnStdout: true).trim()
def index_of_version = sh(script: "expr $index_of_version_temp - 1 || true", returnStdout: true).trim()
- return sh(script: "cat test/e2e/environment/kind-helm/test-scope.yaml | yq '.TAPA[$index_of_version]'", returnStdout: true).trim()
+ return sh(script: "cat test/e2e/environment/$environment_name/test-scope.yaml | yq '.TAPA[$index_of_version]'", returnStdout: true).trim()
}
-def GetNSMVersion() {
- def number_of_versions = sh(script: 'cat test/e2e/environment/kind-helm/test-scope.yaml | yq ".NSM[]" | wc -l', returnStdout: true).trim()
+def GetNSMVersion(environment_name) {
+ def number_of_versions = sh(script: "cat test/e2e/environment/$environment_name/test-scope.yaml | yq '.NSM[]' | wc -l", returnStdout: true).trim()
def index_of_version_temp = sh(script: "shuf -i 1-$number_of_versions -n1", returnStdout: true).trim()
def index_of_version = sh(script: "expr $index_of_version_temp - 1 || true", returnStdout: true).trim()
- return sh(script: "cat test/e2e/environment/kind-helm/test-scope.yaml | yq '.NSM[$index_of_version]'", returnStdout: true).trim()
+ return sh(script: "cat test/e2e/environment/$environment_name/test-scope.yaml | yq '.NSM[$index_of_version]'", returnStdout: true).trim()
}
-def GetKubernetesVersion() {
- def number_of_versions = sh(script: 'cat test/e2e/environment/kind-helm/test-scope.yaml | yq ".Kubernetes[]" | wc -l', returnStdout: true).trim()
+def GetKubernetesVersion(environment_name) {
+ def number_of_versions = sh(script: "cat test/e2e/environment/$environment_name/test-scope.yaml | yq '.Kubernetes[]' | wc -l", returnStdout: true).trim()
def index_of_version_temp = sh(script: "shuf -i 1-$number_of_versions -n1", returnStdout: true).trim()
def index_of_version = sh(script: "expr $index_of_version_temp - 1 || true", returnStdout: true).trim()
- return sh(script: "cat test/e2e/environment/kind-helm/test-scope.yaml | yq '.Kubernetes[$index_of_version]'", returnStdout: true).trim()
+ return sh(script: "cat test/e2e/environment/$environment_name/test-scope.yaml | yq '.Kubernetes[$index_of_version]'", returnStdout: true).trim()
}
-def GetIPFamily() {
- def number_of_ip_family = sh(script: 'cat test/e2e/environment/kind-helm/test-scope.yaml | yq ".IP-Family[]" | wc -l', returnStdout: true).trim()
+def GetIPFamily(environment_name) {
+ def number_of_ip_family = sh(script: "cat test/e2e/environment/$environment_name/test-scope.yaml | yq '.IP-Family[]' | wc -l", returnStdout: true).trim()
def index_of_ip_family_temp = sh(script: "shuf -i 1-$number_of_ip_family -n1", returnStdout: true).trim()
def index_of_ip_family = sh(script: "expr $index_of_ip_family_temp - 1 || true", returnStdout: true).trim()
- return sh(script: "cat test/e2e/environment/kind-helm/test-scope.yaml | yq '.IP-Family[$index_of_ip_family]'", returnStdout: true).trim()
+ return sh(script: "cat test/e2e/environment/$environment_name/test-scope.yaml | yq '.IP-Family[$index_of_ip_family]'", returnStdout: true).trim()
+}
+
+def GetSeed() {
+ return sh(script: 'shuf -i 1-2147483647 -n1', returnStdout: true).trim()
}
// http://JENKINS_URL/job/meridio-e2e-test-kind/api/json?tree=allBuilds[status,timestamp,id,result,description]{0,9}&pretty=true
-def Report() {
+def Report(id) {
return {
def jenkins_url = 'jenkins.nordix.org'
def success = ''
try {
success = sh(script: """
- data=\$(curl -s -L "http://$jenkins_url/job/meridio-e2e-test-kind/api/json?tree=allBuilds\\[status,timestamp,id,result,description\\]\\{0,999\\}&pretty=true")
+ data=\$(curl -s -L "http://$jenkins_url/job/meridio-e2e-test-kind/api/json?tree=allBuilds\\[status,timestamp,id,result,description\\]\\{0,1000\\}&pretty=true")
success=\$(echo \"\$data\" | jq -r '.allBuilds[] | select(.result == \"SUCCESS\") | [.description] | @tsv' | grep -v \"^\$\")
echo \$success
""", returnStdout: true).trim()
def failure = ''
try {
failure = sh(script: """
- data=\$(curl -s -L "http://$jenkins_url/job/meridio-e2e-test-kind/api/json?tree=allBuilds\\[status,timestamp,id,result,description\\]\\{0,999\\}&pretty=true")
+ data=\$(curl -s -L "http://$jenkins_url/job/meridio-e2e-test-kind/api/json?tree=allBuilds\\[status,timestamp,id,result,description\\]\\{0,1000\\}&pretty=true")
failure=\$(echo \"\$data\" | jq -r '.allBuilds[] | select(.result == \"FAILURE\") | [.description] | @tsv' | grep -v \"^\$\")
echo \$failure
""", returnStdout: true).trim()
ReportNSM(success, failure).call()
ReportIPFamily(success, failure).call()
ReportKubernetes(success, failure).call()
+
+ sh 'printenv > _output/parameters.txt'
+ sh "echo 'RESULT=$currentBuild.result' >> _output/parameters.txt"
+
+ try {
+ archiveArtifacts artifacts: '_output/**/*.*', followSymlinks: false
+ sh "tar -czvf ${id}.tar.gz -C _output ."
+ withCredentials([string(credentialsId: 'nsm-nordix-artifactory-api-key', variable: 'API_KEY')]) {
+ sh "curl -H 'X-JFrog-Art-Api:${API_KEY}' -T ${id}.tar.gz 'https://artifactory.nordix.org/artifactory/cloud-native/meridio/e2e-test-reports/${id}.tar.gz'"
+ }
+ } catch (Exception e) {
+ }
}
}
def meridio = sh(script: "echo \"$meridio_success\\n$meridio_failure\" | grep -v '^\$' | awk '{ success[\$1] += \$2 ; failure[\$1] += \$3 } END { for(elem in success) print elem, success[elem], failure[elem] }' | sort -k1", returnStdout: true).trim()
def formatted = sh(script: "echo \"$meridio\" | awk '{ printf \"%s (✅ %s / ❌ %s)\\n\", \$1, \$2, \$3 }' | sed ':a;N;\$!ba;s/\\n/ | /g'", returnStdout: true).trim()
echo "Meridio: $formatted"
- def meridio_badge = addEmbeddableBadgeConfiguration(id: 'meridio-e2e-kind-meridio', subject: 'Meridio', color: '#0B1F67', status: "$formatted")
+ badge('meridio-e2e-kind-meridio', 'Meridio', formatted)
}
}
def tapa = sh(script: "echo \"$tapa_success\\n$tapa_failure\" | grep -v '^\$' | awk '{ success[\$1] += \$2 ; failure[\$1] += \$3 } END { for(elem in success) print elem, success[elem], failure[elem] }' | sort -k1", returnStdout: true).trim()
def formatted = sh(script: "echo \"$tapa\" | awk '{ printf \"%s (✅ %s / ❌ %s)\\n\", \$1, \$2, \$3 }' | sed ':a;N;\$!ba;s/\\n/ | /g'", returnStdout: true).trim()
echo "TAPA: $formatted"
- def tapa_badge = addEmbeddableBadgeConfiguration(id: 'meridio-e2e-kind-tapa', subject: 'TAPA', color: '#0B1F67', status: "$formatted")
+ badge('meridio-e2e-kind-tapa', 'TAPA', formatted)
}
}
def nsm = sh(script: "echo \"$nsm_success\\n$nsm_failure\" | grep -v '^\$' | awk '{ success[\$1] += \$2 ; failure[\$1] += \$3 } END { for(elem in success) print elem, success[elem], failure[elem] }' | sort -k1", returnStdout: true).trim()
def formatted = sh(script: "echo \"$nsm\" | awk '{ printf \"%s (✅ %s / ❌ %s)\\n\", \$1, \$2, \$3 }' | sed ':a;N;\$!ba;s/\\n/ | /g'", returnStdout: true).trim()
echo "NSM: $formatted"
- def nsm_badge = addEmbeddableBadgeConfiguration(id: 'meridio-e2e-kind-nsm', subject: 'NSM', color: '#0B1F67', status: "$formatted")
+ badge('meridio-e2e-kind-nsm', 'NSM', formatted)
}
}
def ip_family = sh(script: "echo \"$ip_family_success\\n$ip_family_failure\" | grep -v '^\$' | awk '{ success[\$1] += \$2 ; failure[\$1] += \$3 } END { for(elem in success) print elem, success[elem], failure[elem] }' | sort -k1", returnStdout: true).trim()
def formatted = sh(script: "echo \"$ip_family\" | awk '{ printf \"%s (✅ %s / ❌ %s)\\n\", \$1, \$2, \$3 }' | sed ':a;N;\$!ba;s/\\n/ | /g'", returnStdout: true).trim()
echo "IP Family: $formatted"
- def ip_family_badge = addEmbeddableBadgeConfiguration(id: 'meridio-e2e-kind-ip-family', subject: 'IP Family', color: '#0B1F67', status: "$formatted")
+ badge('meridio-e2e-kind-ip-family', 'IP Family', formatted)
}
}
def kubernetes = sh(script: "echo \"$kubernetes_success\\n$kubernetes_failure\" | grep -v '^\$' | awk '{ success[\$1] += \$2 ; failure[\$1] += \$3 } END { for(elem in success) print elem, success[elem], failure[elem] }' | sort -k1", returnStdout: true).trim()
def formatted = sh(script: "echo \"$kubernetes\" | awk '{ printf \"%s (✅ %s / ❌ %s)\\n\", \$1, \$2, \$3 }' | sed ':a;N;\$!ba;s/\\n/ | /g'", returnStdout: true).trim()
echo "Kubernetes: $formatted"
- def kubernetes_badge = addEmbeddableBadgeConfiguration(id: 'meridio-e2e-kind-kubernetes', subject: 'Kubernetes', color: '#0B1F67', status: "$formatted")
+ badge('meridio-e2e-kind-kubernetes', 'Kubernetes', formatted)
}
}
+def badge(id, subject, message) {
+ addEmbeddableBadgeConfiguration(id: "${id}", subject: "${subject}", color: '#0B1F67', status: "$message")
+ sh """
+ mkdir -p _output
+ echo '{' >> _output/${id}.json
+ echo '"schemaVersion": 1,' >> _output/${id}.json
+ echo '"label": "${subject}",' >> _output/${id}.json
+ echo '"message": "${message}",' >> _output/${id}.json
+ echo '"color": "#0B1F67"' >> _output/${id}.json
+ echo '}' >> _output/${id}.json
+ """
+}
+
// Raise error in Jenkins job
def Error(e) {
return {
// Cleanup directory and kind cluster
def Cleanup() {
- ExecSh('make -s -C docs/demo/scripts/kind/ clean').call()
+ def command = 'make -s -C docs/demo/scripts/kind/ clean'
+ ExecSh(command).call()
cleanWs()
}
// Execute command
def ExecSh(command) {
return {
- sh """
- . \${HOME}/.profile
- ${command}
- """
+ if (env.DRY_RUN != 'true') {
+ sh """
+ . \${HOME}/.profile
+ ${command}
+ """
+ } else {
+ echo "${command}"
+ }
}
}