#!/bin/groovy /* * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The OpenAirInterface Software Alliance licenses this file to You under * the OAI Public License, Version 1.1 (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.openairinterface.org/?page_id=698 * * 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. *------------------------------------------------------------------------------- * For more information about the OpenAirInterface (OAI) Software Alliance: * contact@openairinterface.org */ //------------------------------------------------------------------------------- // Abstraction function to send social media messages: // like on Slack or Mattermost def sendSocialMediaMessage(pipeChannel, pipeColor, pipeMessage) { if (params.pipelineUsesSlack != null) { if (params.pipelineUsesSlack) { slackSend channel: pipeChannel, color: pipeColor, message: pipeMessage } } } // Location of the CN executor node def cn_ci_host = params.Host_CN_CI_Server // for lock def cn_ci_resource = params.DockerContainers def ds_tester_ci_resource = params.DsTester // Location of the 2nd CN executor def new_host_flag = false def new_host = "" def new_host_user = "" // Location of the CN tester def dsT_host_flag = false def dsT_host = "" def dsT_host_user = "" def dsT_host_ip_addr = "" // Flags def scmEvent = false def upstreamEvent = false // Default tags / branches --> could be passed on by upstream job or by PR content def amfTag = 'develop' def amfBranch = 'develop' def smfTag = 'develop' def smfBranch = 'develop' def spgwuTag = 'develop' def spgwuBranch = 'develop' //------------------------------------------------------------------------------- // Pipeline start pipeline { agent { label cn_ci_host } options { disableConcurrentBuilds() timestamps() ansiColor('xterm') lock(cn_ci_resource) } stages { stage ('Verify Parameters') { steps { script { echo '\u2705 \u001B[32mVerify Parameters\u001B[0m' JOB_TIMESTAMP = sh returnStdout: true, script: 'date --utc --rfc-3339=seconds | sed -e "s#+00:00##"' JOB_TIMESTAMP = JOB_TIMESTAMP.trim() if (params.Host_CN_CI_2nd_Server_Flag != null) { new_host_flag = params.Host_CN_CI_2nd_Server_Flag if (new_host_flag) { new_host = params.Host_CN_CI_2nd_Server new_host_user = params.Host_CN_CI_2nd_Server_Login echo "1st Node is ${NODE_NAME}" echo "2nd Node is ${new_host}" } else { echo "Node is ${NODE_NAME}" } } else { echo "Node is ${NODE_NAME}" } if (params.DS_Tester_Server_Flag != null) { dsT_host_flag = params.DS_Tester_Server_Flag if (dsT_host_flag) { def allParametersPresent = true if (params.DS_Tester_Server_Name == null) { allParametersPresent = false } else { dsT_host = params.DS_Tester_Server_Name } if (params.DS_Tester_Server_Login == null) { allParametersPresent = false } else { dsT_host_user = params.DS_Tester_Server_Login } if (params.DS_Tester_Server_IP_Addr == null) { allParametersPresent = false } else { dsT_host_ip_addr = params.DS_Tester_Server_IP_Addr } if (allParametersPresent) { echo "DS Tester is on ${dsT_host}" } else { echo "Some DS Tester parameters are missing!" sh "./ci-scripts/fail.sh" } } } // Find out the cause of the trigger for (cause in currentBuild.getBuildCauses()) { if (cause.toString() ==~ /.*UpstreamCause.*/) { upstreamEvent = true } else { scmEvent = true } } if (upstreamEvent) { if (params.AMF_TAG != null) { amfTag = params.AMF_TAG echo "Upstream Job passed AMF_TAG to use: ${amfTag}" } if (params.AMF_BRANCH != null) { amfBranch = params.AMF_BRANCH echo "Upstream Job passed AMF_BRANCH to use: ${amfBranch}" } if (params.SMF_TAG != null) { smfTag = params.SMF_TAG echo "Upstream Job passed SMF_TAG to use: ${smfTag}" } if (params.SMF_BRANCH != null) { smfBranch = params.SMF_BRANCH echo "Upstream Job passed SMF_BRANCH to use: ${smfBranch}" } sh "git clean -x -d -f > /dev/null 2>&1" sh "zip -r -qq oai-cn5g-fed.zip .git" sh "mkdir -p archives DS-TEST-RESULTS" sh './scripts/syncComponents.sh --amf-branch ' + amfBranch + ' --smf-branch ' + smfBranch if (new_host_flag) { // Prepare the workspace in remote server copyTo2ndServer('oai-cn5g-fed.zip', new_host_flag, new_host_user, new_host) myShCmd('git clean -x -d -f > /dev/null 2>&1', new_host_flag, new_host_user, new_host) myShCmd('mkdir -p archives DS-TEST-RESULTS', new_host_flag, new_host_user, new_host) myShCmd('./scripts/syncComponents.sh --amf-branch ' + amfBranch + ' --smf-branch ' + smfBranch, new_host_flag, new_host_user, new_host) } } if (scmEvent) { sh "git clean -x -d -f > /dev/null 2>&1" if ("MERGE".equals(env.gitlabActionType)) { sh "./ci-scripts/doGitLabMerge.sh --src-branch ${env.gitlabSourceBranch} --src-commit ${env.gitlabMergeRequestLastCommit} --target-branch ${env.gitlabTargetBranch} --target-commit ${GIT_COMMIT}" } sh "zip -r -qq oai-cn5g-fed.zip .git" sh "mkdir -p archives DS-TEST-RESULTS" sh './scripts/syncComponents.sh' if (new_host_flag) { // Prepare the workspace in remote server copyTo2ndServer('oai-cn5g-fed.zip', new_host_flag, new_host_user, new_host) myShCmd('git clean -x -d -f > /dev/null 2>&1', new_host_flag, new_host_user, new_host) if ("MERGE".equals(env.gitlabActionType)) { myShCmd("./ci-scripts/doGitLabMerge.sh --src-branch ${env.gitlabSourceBranch} --src-commit ${env.gitlabMergeRequestLastCommit} --target-branch ${env.gitlabTargetBranch} --target-commit ${GIT_COMMIT}", new_host_flag, new_host_user, new_host) } myShCmd('mkdir -p archives DS-TEST-RESULTS', new_host_flag, new_host_user, new_host) myShCmd('./scripts/syncComponents.sh', new_host_flag, new_host_user, new_host) } } } } } stage ('Deploy Whole EPC') { stages { stage ('Create Public Network') { steps { script { myShCmd('python3 ./ci-scripts/dsTestDeployTools.py --action=CreateNetworks', new_host_flag, new_host_user, new_host) } } } stage ('Deploy Containers') { steps { script { // Deploy and configure MySQL Server myShCmd('python3 ./ci-scripts/dsTestDeployTools.py --action=DeployMySqlServer', new_host_flag, new_host_user, new_host) // Deploy and configure AMF myShCmd('python3 ./ci-scripts/dsTestDeployTools.py --action=DeployAMF --tag=' + amfTag, new_host_flag, new_host_user, new_host) // Deploy and configure SMF myShCmd('python3 ./ci-scripts/dsTestDeployTools.py --action=DeploySMF --tag=' + smfTag, new_host_flag, new_host_user, new_host) // Deploy and configure UPF myShCmd('python3 ./ci-scripts/dsTestDeployTools.py --action=DeployUPF --tag=develop', new_host_flag, new_host_user, new_host) } } post { always { script { copyFrom2ndServer('archives/*_config.log', 'archives', new_host_flag, new_host_user, new_host) sh 'python3 ./ci-scripts/generateHtmlReportDeployment.py --job_name=' + JOB_NAME + ' --job_id=' + BUILD_ID + ' --job_url=' + BUILD_URL } } } } } } stage ('Check with DS Tester') { when { expression {dsT_host_flag} } steps { lock (ds_tester_ci_resource) { script { myShCmd('cd /home/oaici/CI-dev-ops-cn5g && git clean -x -d -f > /dev/null', new_host_flag, new_host_user, new_host) myShCmdWithLog('cd /home/oaici/CI-dev-ops-cn5g/scripts && CI_ENV=True SRC_BASE_DIR=/tmp/CI-CN5G-FED ./run-5gc.bash -pt --shark --detach --get-results --5g', 'archives/run-5g-dstester.log', new_host_flag, new_host_user, new_host) copyFrom2ndServer('DS-TEST-RESULTS/*.tar', 'DS-TEST-RESULTS', new_host_flag, new_host_user, new_host) } } } } stage ('Undeploy EPC') { stages { stage ('Undeploy Containers') { steps { script { // Remove the containers myShCmd('python3 ./ci-scripts/dsTestDeployTools.py --action=RemoveAllContainers', new_host_flag, new_host_user, new_host) } } } stage ('Delete Public Network') { steps { script { myShCmd('python3 ./ci-scripts/dsTestDeployTools.py --action=RemoveNetworks', new_host_flag, new_host_user, new_host) } } } } } } post { always { script { // Removing all containers myShCmd('python3 ./ci-scripts/dsTestDeployTools.py --action=RemoveAllContainers', new_host_flag, new_host_user, new_host) // Removing the network myShCmd('python3 ./ci-scripts/dsTestDeployTools.py --action=RemoveNetworks', new_host_flag, new_host_user, new_host) // Zipping all archived log files sh "zip -r -qq cn5g_fed_docker_logs.zip archives DS-TEST-RESULTS/*.tar DS-TEST-RESULTS/status.txt" if (fileExists('cn5g_fed_docker_logs.zip')) { archiveArtifacts artifacts: 'cn5g_fed_docker_logs.zip' } if (fileExists('deploy_results_oai_cn5g.html')) { archiveArtifacts artifacts: 'deploy_results_oai_cn5g.html' } } } } } // Functions def copyTo2ndServer(filename, flag, user, host) { if (flag) { if ("oai-cn5g-fed.zip".equals(filename)) { sh "ssh ${user}@${host} 'rm -rf /tmp/CI-CN5G-FED'" sh "ssh ${user}@${host} 'mkdir -p /tmp/CI-CN5G-FED'" } sh "scp ${filename} ${user}@${host}:/tmp/CI-CN5G-FED" if ("oai-cn5g-fed.zip".equals(filename)) { sh "ssh ${user}@${host} 'cd /tmp/CI-CN5G-FED && unzip -qq oai-cn5g-fed.zip && rm oai-cn5g-fed.zip'" sh "ssh ${user}@${host} 'cd /tmp/CI-CN5G-FED && git checkout -f ${GIT_COMMIT}'" sh "ssh ${user}@${host} 'cd /tmp/CI-CN5G-FED && git log -n1'" } } } def copyFrom2ndServer(filename, target, flag, user, host) { if (flag) { sh "scp ${user}@${host}:/tmp/CI-CN5G-FED/${filename} ${target}" } } def myShCmd(cmd, flag, user, host) { if (flag) { sh "ssh -t -t ${user}@${host} 'cd /tmp/CI-CN5G-FED && ${cmd}'" } else { sh "${cmd}" } } def myShCmdWithLog(cmd, logFile, flag, user, host) { if (flag) { sh "ssh -t -t ${user}@${host} 'export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:.:/usr/local/devsol/bin && ${cmd}' > ${logFile} 2>&1" } else { sh "${cmd} > ${logFile} 2>&1" } } def myShRetCmd(cmd, flag, user, host) { if (flag) { ret = sh returnStdout: true, script: "ssh -t -t ${user}@${host} 'cd /tmp/CI-CN5G-FED && ${cmd}'" } else { ret = sh returnStdout: true, script: "${cmd}" } ret = ret.trim() return ret }