Skip to content
Snippets Groups Projects
Jenkinsfile-GitLab-Docker 10.6 KiB
Newer Older
#!/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 oai-cn5g-fed.zip .git"
            sh "mkdir -p archives DS-TEST-RESULTS"
            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)
            }
          }
          if (scmEvent) {
            sh "git clean -x -d -f > /dev/null 2>&1"
            sh "zip -r oai-cn5g-fed.zip .git"
            sh "mkdir -p archives DS-TEST-RESULTS"
            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)
            }
          }
        }
      }
    }
    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)
              }
            }
          }
        }
      }
    }
    stage ('Check with DS Tester') {
      when { expression {dsT_host_flag} }
      steps {
        lock (ds_tester_ci_resource) {
          script {
            sh "sleep 10"
          }
        }
      }
    }
    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('test_results_oai_epc.html')) {
          archiveArtifacts artifacts: 'test_results_oai_epc.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 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
}