X-Git-Url: https://gerrit.nordix.org/gitweb?a=blobdiff_plain;f=jjb%2Fnsm%2Fe2e.Jenkinsfile;h=d38d88f2140de2ced112578f929cb141c4254a0d;hb=1317f9eeeb7105cab08285c6fcfd56d3065d5b0c;hp=6eed926dcfd937f25e3c9de0a8dbf6ec6c555825;hpb=c0ae71815239fb8abdb9824f6a52cd2d3d013c06;p=infra%2Fcicd.git diff --git a/jjb/nsm/e2e.Jenkinsfile b/jjb/nsm/e2e.Jenkinsfile index 6eed926dc..d38d88f21 100644 --- a/jjb/nsm/e2e.Jenkinsfile +++ b/jjb/nsm/e2e.Jenkinsfile @@ -1,6 +1,21 @@ +/* +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}") { @@ -14,6 +29,12 @@ node('nordix-nsm-build-ubuntu1804') { 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 @@ -30,56 +51,75 @@ node('nordix-nsm-build-ubuntu1804') { } timeout(60) { 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" - - 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/helm/ --generate-name --create-namespace --namespace red --set applicationName=target-a --set default.trench.name=trench-a').call() - ExecSh('helm install examples/target/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() + 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(command).call() + } catch (Exception e) { + unstable 'Environment setup failed' + currentBuild.result = 'FAILURE' + } } stage('E2E') { - echo "Meridio version: $meridio_version" - echo "TAPA version: $tapa_version" - ExecSh("make e2e E2E_PARAMETERS=\"\$(cat ./test/e2e/environment/kind-helm/$ip_family/config.txt | tr '\\n' ' ')\"").call() + if (currentBuild.result != 'FAILURE') { + 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 (Exception e) { + unstable 'E2E Tests failed' + currentBuild.result = 'FAILURE' + } + } else { + Utils.markStageSkippedForConditional('E2E') + } } } - stage('Cleanup') { - Cleanup() - } stage('Report') { - Report().call() + try { + Report().call() + } 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() + def tapa_version = GetTAPAVersion() + def nsm_version = GetNSMVersion() + def kubernetes_version = GetKubernetesVersion() + def ip_family = GetIPFamily() + 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') - } } } @@ -118,28 +158,45 @@ def GetIPFamily() { return sh(script: "cat test/e2e/environment/kind-helm/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() { return { def jenkins_url = 'jenkins.nordix.org' - def 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") - success=\$(echo \"\$data\" | jq -r '.allBuilds[] | select(.result == \"SUCCESS\") | [.description] | @tsv' | grep -v \"^\$\") - echo \$success - """, returnStdout: true).trim() + 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,1000\\}&pretty=true") + success=\$(echo \"\$data\" | jq -r '.allBuilds[] | select(.result == \"SUCCESS\") | [.description] | @tsv' | grep -v \"^\$\") + echo \$success + """, returnStdout: true).trim() + } catch (Exception e) { + } - def 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") - failure=\$(echo \"\$data\" | jq -r '.allBuilds[] | select(.result == \"FAILURE\") | [.description] | @tsv' | grep -v \"^\$\") - echo \$failure - """, 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,1000\\}&pretty=true") + failure=\$(echo \"\$data\" | jq -r '.allBuilds[] | select(.result == \"FAILURE\") | [.description] | @tsv' | grep -v \"^\$\") + echo \$failure + """, returnStdout: true).trim() + } catch (Exception e) { + } ReportMeridio(success, failure).call() ReportTAPA(success, failure).call() ReportNSM(success, failure).call() ReportIPFamily(success, failure).call() ReportKubernetes(success, failure).call() + + try { + archiveArtifacts artifacts: '_output/*', followSymlinks: false + } catch (Exception e) { + } } } @@ -147,10 +204,10 @@ def ReportMeridio(success, failure) { return { def meridio_success = sh(script: "echo \"$success\" | grep -oP '(?<=Meridio version: ).*?(?=\\/)' | sort | uniq -c | awk '{ printf \"%s %s 0\\n\", \$2, \$1 }'", returnStdout: true).trim() def meridio_failure = sh(script: "echo \"$failure\" | grep -oP '(?<=Meridio version: ).*?(?=\\/)' | sort | uniq -c | awk '{ printf \"%s 0 %s\\n\", \$2, \$1 }'", returnStdout: true).trim() - def meridio = sh(script: "echo \"$meridio_success\\n$meridio_failure\" | awk '{ success[\$1] += \$2 ; failure[\$1] += \$3 } END { for(elem in success) print elem, success[elem], failure[elem] }' | sort -k1", returnStdout: true).trim() + 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) } } @@ -158,10 +215,10 @@ def ReportTAPA(success, failure) { return { def tapa_success = sh(script: "echo \"$success\" | grep -oP '(?<=TAPA version: ).*?(?=\\/)' | sort | uniq -c | awk '{ printf \"%s %s 0\\n\", \$2, \$1 }'", returnStdout: true).trim() def tapa_failure = sh(script: "echo \"$failure\" | grep -oP '(?<=TAPA version: ).*?(?=\\/)' | sort | uniq -c | awk '{ printf \"%s 0 %s\\n\", \$2, \$1 }'", returnStdout: true).trim() - def tapa = sh(script: "echo \"$tapa_success\\n$tapa_failure\" | awk '{ success[\$1] += \$2 ; failure[\$1] += \$3 } END { for(elem in success) print elem, success[elem], failure[elem] }' | sort -k1", returnStdout: true).trim() + 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) } } @@ -169,10 +226,10 @@ def ReportNSM(success, failure) { return { def nsm_success = sh(script: "echo \"$success\" | grep -oP '(?<=NSM version: ).*?(?=\\/)' | sort | uniq -c | awk '{ printf \"%s %s 0\\n\", \$2, \$1 }'", returnStdout: true).trim() def nsm_failure = sh(script: "echo \"$failure\" | grep -oP '(?<=NSM version: ).*?(?=\\/)' | sort | uniq -c | awk '{ printf \"%s 0 %s\\n\", \$2, \$1 }'", returnStdout: true).trim() - def nsm = sh(script: "echo \"$nsm_success\\n$nsm_failure\" | awk '{ success[\$1] += \$2 ; failure[\$1] += \$3 } END { for(elem in success) print elem, success[elem], failure[elem] }' | sort -k1", returnStdout: true).trim() + 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) } } @@ -180,10 +237,10 @@ def ReportIPFamily(success, failure) { return { def ip_family_success = sh(script: "echo \"$success\" | grep -oP '(?<=IP Family: ).*?(?=\\/)' | sort | uniq -c | awk '{ printf \"%s %s 0\\n\", \$2, \$1 }'", returnStdout: true).trim() def ip_family_failure = sh(script: "echo \"$failure\" | grep -oP '(?<=IP Family: ).*?(?=\\/)' | sort | uniq -c | awk '{ printf \"%s 0 %s\\n\", \$2, \$1 }'", returnStdout: true).trim() - def ip_family = sh(script: "echo \"$ip_family_success\\n$ip_family_failure\" | awk '{ success[\$1] += \$2 ; failure[\$1] += \$3 } END { for(elem in success) print elem, success[elem], failure[elem] }' | sort -k1", returnStdout: true).trim() + 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) } } @@ -191,13 +248,26 @@ def ReportKubernetes(success, failure) { return { def kubernetes_success = sh(script: "echo \"$success\" | grep -oP '(?<=Kubernetes version: ).*?(?=\\/)' | sort | uniq -c | awk '{ printf \"%s %s 0\\n\", \$2, \$1 }'", returnStdout: true).trim() def kubernetes_failure = sh(script: "echo \"$failure\" | grep -oP '(?<=Kubernetes version: ).*?(?=\\/)' | sort | uniq -c | awk '{ printf \"%s 0 %s\\n\", \$2, \$1 }'", returnStdout: true).trim() - def kubernetes = sh(script: "echo \"$kubernetes_success\\n$kubernetes_failure\" | awk '{ success[\$1] += \$2 ; failure[\$1] += \$3 } END { for(elem in success) print elem, success[elem], failure[elem] }' | sort -k1", returnStdout: true).trim() + 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 { @@ -208,16 +278,21 @@ def Error(e) { // 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}" + } } }