#!/usr/bin/env groovy properties([[$class: 'ParametersDefinitionProperty', parameterDefinitions: [ [$class: 'hudson.model.StringParameterDefinition', name: 'PHASE', defaultValue: "BUILD_DEPLOY"], [$class: 'hudson.model.StringParameterDefinition', name: 'TARGET_ENV', defaultValue: "DEV"], [$class: 'hudson.model.StringParameterDefinition', name: 'K8S_CLUSTER_URL',defaultValue: "https://k8s.onap.org"], [$class: 'hudson.model.StringParameterDefinition', name: 'K8S_CONTEXT',defaultValue: "default"], [$class: 'hudson.model.StringParameterDefinition', name: 'K8S_USERNAME',defaultValue: "root"], [$class: 'hudson.model.PasswordParameterDefinition', name: 'K8S_PASSWORD',defaultValue: "k8s_password"], [$class: 'hudson.model.PasswordParameterDefinition', name: 'K8S_TOKEN',defaultValue: "k8suser@fgps.onap.org:enc:dfxissWKLGRuldTwXuAuK-WAT-b-f-wS"], [$class: 'hudson.model.StringParameterDefinition', name: 'K8S_NAME',defaultValue: "DEV"], [$class: 'hudson.model.StringParameterDefinition', name: 'K8S_PODS_REPLICAS',defaultValue: "1"], [$class: 'hudson.model.StringParameterDefinition', name: 'K8S_SERVICE_ACCOUNT',defaultValue: "default"], [$class: 'hudson.model.BooleanParameterDefinition', name: 'USE_ROOT_NS',defaultValue: false], [$class: 'hudson.model.StringParameterDefinition', name: 'BROKER_URL',defaultValue: "http://broker.onap.org:30120"], [$class: 'hudson.model.StringParameterDefinition', name: 'PACT_USERNAME', defaultValue: "pactadmin"], [$class: 'hudson.model.PasswordParameterDefinition', name: 'PACT_PASSWORD', defaultValue: "pactadmin"], [$class: 'hudson.model.StringParameterDefinition', name: 'CONSUMER', defaultValue: ""], [$class: 'hudson.model.StringParameterDefinition', name: 'GIT_REPO_FOLDER',defaultValue: ""], [$class: 'hudson.model.StringParameterDefinition', name: 'DEV_TEST_GIT_APP',defaultValue: ""], [$class: 'hudson.model.StringParameterDefinition', name: 'DEV_TEST_SERVER_URL',defaultValue: ""], [$class: 'hudson.model.StringParameterDefinition', name: 'LISA_PATH', defaultValue: "/opt/app/workload/tools/itko/server/9.5.1/Projects/"], [$class: 'hudson.model.StringParameterDefinition', name: 'TEST_CASE_PATH',defaultValue: "/Tests/HelloTest.tst"], [$class: 'hudson.model.StringParameterDefinition', name: 'SUITE_CASE_PATH', defaultValue: "/Tests/Suites/AllTestsSuite.ste"], [$class: 'hudson.model.StringParameterDefinition', name: 'CONFIG_PATH', defaultValue: "/Configs/project.config"], [$class: 'hudson.model.StringParameterDefinition', name: 'STAGING_DOC_PATH',defaultValue: "/Tests/StagingDocs/Run1User1Cycle.stg"], [$class: 'hudson.model.StringParameterDefinition', name: 'ANS_ROLE',defaultValue: ""], [$class: 'hudson.model.StringParameterDefinition', name: 'ANS_INVENTORY',defaultValue: "inventory/dev/hosts"], [$class: 'hudson.model.StringParameterDefinition', name: 'GITPlaybookPATH', defaultValue: ""], [$class: 'hudson.model.StringParameterDefinition', name: 'GITConfigRolePATH', defaultValue: ""], [$class: 'hudson.model.StringParameterDefinition', name: 'SONAR_BREAKER_SKIP',defaultValue: "True"], [$class: 'hudson.model.StringParameterDefinition', name: 'SONAR_BREAKER_QRY_INTERVAL',defaultValue: "7000"], [$class: 'hudson.model.StringParameterDefinition', name: 'SONAR_BREAKER_QRY_MAXATTEMPTS',defaultValue: "100"], [$class: 'hudson.model.StringParameterDefinition', name: 'ECO_PIPELINE_ID',defaultValue: ""], [$class: 'hudson.model.StringParameterDefinition', name: 'BUILD_VERSION',defaultValue: ""] ]]]) /** jdk1.8 = fixed name for java M3 = fixed name for maven general_maven_settings = fixed name for maven settings Jenkins managed file */ echo "Build branch: ${env.BRANCH_NAME}" node("docker") { stage 'Checkout' checkout scm pom = readMavenPom file: 'pom.xml' PROJECT_NAME = pom.properties['namespace'] + ":" + pom.artifactId; // env.SERVICE_NAME=pom.artifactId; env.APP_NAME=pom.artifactId; env.SERVICE_NAME=pom.properties['serviceArtifactName'] env.VERSION=pom.version; env.ANS_ROLE=SERVICE_NAME+"_configrole" env.BUILDNUMBER_TIMESTAMP="${BUILD_NUMBER}"+"-"+"${currentBuild.timeInMillis}" echo "ANS_ROLE: ${ANS_ROLE}" LABEL_VERSION=pom.version.replaceAll(".", "-"); echo "LabelVerion: " + LABEL_VERSION NAMESPACE=pom.properties['namespace'] TARGET_ENV=TARGET_ENV.toLowerCase() if(params.USE_ROOT_NS) { env.KUBE_NAMESPACE=pom.properties['kube.namespace'] }else{ env.KUBE_NAMESPACE=pom.properties['kube.namespace']+"-"+TARGET_ENV } if(TARGET_ENV!="dev"){ env.ANS_INVENTORY="inventory/"+TARGET_ENV+"/hosts" echo "ANS_INVENTORY: ${ANS_INVENTORY}" } env.TARGET_ENV=TARGET_ENV REPLICA_COUNT="${params.K8S_PODS_REPLICAS}" env.IMAGE_NAME=pom.properties['docker.registry']+"/"+NAMESPACE+"/"+SERVICE_NAME+":latest" if (env.TARGET_ENV == "prod") { env.IMAGE_NAME=pom.properties['docker.registry']+"/"+NAMESPACE+"/"+SERVICE_NAME+":release" } echo "Artifact: " + PROJECT_NAME env.DOCKER_HOST="tcp://localhost:4243" env.DOCKER_CONFIG="${WORKSPACE}/.docker" def branchName //This value can ideally come from pom as in IMAGE_NAME def dockerRegistry = "nexus.onap.org:5100" if(params.BUILD_VERSION != "") { echo "BUILD VERSION Set : " + BUILD_VERSION currentBuild.displayName = "VERSION-${BUILD_VERSION}" currentBuild.description = "${BUILD_VERSION} ${ECO_PIPELINE_ID} ${PHASE}" }else{ echo "BUILD VERSION Not Set, Use pom version: " + VERSION currentBuild.displayName = "VERSION-" +VERSION currentBuild.description = "${VERSION} ${ECO_PIPELINE_ID} ${PHASE}" } env.KUBECTL_OPTS="--server=${K8S_CLUSTER_URL} --insecure-skip-tls-verify=true --password=${K8S_PASSWORD} --username=${K8S_USERNAME}" env.K8S_SERVER_CREDENTIALS = " k8server=${K8S_CLUSTER_URL}:6443 k8susername=${K8S_USERNAME} k8spassword=${K8S_PASSWORD} k8stoken=${K8S_TOKEN}" if ("${K8S_TOKEN}" != "" ) { env.KUBECTL_OPTS = "--server=${K8S_CLUSTER_URL} --insecure-skip-tls-verify=true --token=${K8S_TOKEN}" env.K8S_SERVER_CREDENTIALS =" k8server=${K8S_CLUSTER_URL}:6443 k8susername= k8spassword= k8stoken=${K8S_TOKEN}" } //echo "env.KUBECTL_OPTS=${KUBECTL_OPTS}" //echo "K8S_SERVER_CREDENTIALS=${K8S_SERVER_CREDENTIALS}" //IST Variable LISA_PATH_NEW="${LISA_PATH}"+SERVICE_NAME // Create kubectl.conf file here from Pipeline properties provided. withEnv(["PATH=${env.PATH}:${tool 'M3'}/bin:${tool 'jdk1.8'}/bin", "JAVA_HOME=${tool 'jdk1.8'}", "MAVEN_HOME=${tool 'M3'}"]) { echo "JAVA_HOME=${env.JAVA_HOME}" echo "MAVEN_HOME=${env.MAVEN_HOME}" echo "PATH=${env.PATH}" wrap([$class: 'ConfigFileBuildWrapper', managedFiles: [ [fileId: 'maven-settings.xml', variable: 'MAVEN_SETTINGS'], [fileId: 'sonar-secret.txt', variable: 'SONAR_SECRET'], [fileId: 'sonar.properties', variable: 'SONAR_PROPERTIES'] ]]) { branchName = (env.BRANCH_NAME ?: "master").replaceAll(/[^0-9a-zA-Z_]/, "-") if ("${PHASE}" == "BUILD" || "${PHASE}" == "BUILD_DEPLOY" ) { stage 'Compile' sh 'mvn -DskipTests -Dmaven.test.skip=true -s $MAVEN_SETTINGS -Ddummy.prop=$SONAR_PROPERTIES clean compile' stage 'Unit Test' sh 'mvn -s $MAVEN_SETTINGS verify -P all-tests' stage 'Package' sh 'mvn -DskipTests -Dmaven.test.skip=true -s $MAVEN_SETTINGS package' stage 'Verify' sh 'mvn -DskipTests -Dmaven.test.skip=true -s $MAVEN_SETTINGS verify' if ("${DEV_TEST_GIT_APP}" != "") { stage("CADev Repo Update") { def GitinvokeURL = "${DEV_TEST_GIT_APP}/gitapp/service/git/push?gitUrl=${GIT_REPO_FOLDER}/${SERVICE_NAME}" sh "curl -i -X GET \'${GitinvokeURL}\'" } stage("Component Test Using CA DEV TEST") { def invokeURL = "${DEV_TEST_SERVER_URL}/lisa-invoke/runTest?testCasePath=${LISA_PATH_NEW}${TEST_CASE_PATH}&stagingDocPath=${LISA_PATH_NEW}${STAGING_DOC_PATH}" sh "curl -i \'${invokeURL}\'" invokeURL = "${DEV_TEST_SERVER_URL}/lisa-invoke/runSuite?suitePath=${LISA_PATH_NEW}${SUITE_CASE_PATH}&configPath=${LISA_PATH_NEW}${CONFIG_PATH}" sh "curl -i \'${invokeURL}\'" } } stage 'Component Test Using Mockito' sh 'mvn -s $MAVEN_SETTINGS -Dtest=ITComponentTest test' stage 'Publish Artifact' //sh 'docker ps' sh 'mvn -DskipTests -Dmaven.test.skip=true -Dhttps.protocols="TLSv1" -Djavax.net.ssl.trustStore="/opt/app/etc/cacerts.jks" -Djavax.net.ssl.trustStorePassword="password" -Djavax.net.ssl.keyStore="/opt/app/etc/cacerts.jks" -Djavax.net.ssl.keyStorePassword="password" -s $MAVEN_SETTINGS -U docker:build docker:push' } if ("${PHASE}" == "BUILD_DEPLOY" || "${PHASE}" == "DEPLOY" || "${PHASE}" == "CONFIG") { // deploy to k8s stage ('Clone playbook and configrole') { // read values captured at the generate time env.REPO_PROJECT = readFile './repoproject.txt' env.REPO_PROJECT= "${REPO_PROJECT.trim()}" // put some if conditions to use below values if empty above. if(params.GITPlaybookPATH==""){ GITPlaybookPATH="https://git.onap.org/scm/"+"${REPO_PROJECT}"+"/"+SERVICE_NAME+"_playbook.git" } echo "GITPlaybookPATH: ${GITPlaybookPATH}" if(params.GITConfigRolePATH==""){ GITConfigRolePATH="https://git.onap.org/scm/"+"${REPO_PROJECT}"+"/"+SERVICE_NAME+"_configrole.git" } echo "GITConfigRolePATH: ${GITConfigRolePATH}" env.dockermechid = readFile './dockerbuilduser.txt' env.dockermechid = "${dockermechid.trim()}" env.repogitid = readFile './repogitid.txt' env.repogitid = "${repogitid.trim()}" echo "repogitid : ${repogitid}" withCredentials([usernamePassword(credentialsId: env.repogitid, usernameVariable: 'ITS_SECRET_USERNAME', passwordVariable: 'ITS_SECRET_PASSWORD')]) { env.DOCKER_HOST='unix:///var/run/docker.sock' env.ANS_HOST = params.ANS_HOST ?: new URL("${params.K8S_CLUSTER_URL}").getHost() sh 'rm -rf playbook' dir('playbook') { git url: "${GITPlaybookPATH}", credentialsId: "${repogitid}" } dir("playbook/roles/${ANS_ROLE}") { if (branchName != 'master'){ echo "branchName: ${branchName}" git url: "${GITConfigRolePATH}", credentialsId: "${repogitid}", branch: "${branchName}" } else{ echo "else branchName: ${branchName}" git url: "${GITConfigRolePATH}", credentialsId: "${repogitid}" } } } } } if ( "${PHASE}" == "CONTRACT_GENERATE") { stage 'Contract Generate Publish and QG2' sh 'mvn -s $MAVEN_SETTINGS -Dtest=PactTestSuit test -DBROKER_URL=${BROKER_URL} -DuserName=${PACT_USERNAME} -Dpassword=${PACT_PASSWORD}' sh 'mvn -s $MAVEN_SETTINGS pact:publish -DBROKER_URL=${BROKER_URL} -DuserName=${PACT_USERNAME} -Dpassword=${PACT_PASSWORD}' } if ("${PHASE}" == "CONTRACT_VERIFY" ) { stage ('Contract Verify' ){ withEnv([ "APP_NAME=${SERVICE_NAME}", "K8S_CTX=${K8S_CONTEXT}", "APP_NS=${KUBE_NAMESPACE}", "KUBECTL=/opt/app/kubernetes/v1.5.2/bin/kubectl", ]) { def CLUSTER_URL=K8S_CLUSTER_URL.substring(8) NODE_PORT = sh ( script: '${KUBECTL} get service ${APP_NAME} --namespace ${APP_NS} --context ${K8S_CTX} ${KUBECTL_OPTS} --output jsonpath={.spec.ports[*].nodePort}', returnStdout: true ).trim() if( "${CONSUMER}" == "") { sh "mvn -s $MAVEN_SETTINGS pact:verify -DBROKER_URL=${BROKER_URL} -DuserName=${PACT_USERNAME} -Dpassword=${PACT_PASSWORD} -DAPP_URL=${CLUSTER_URL} -DAPP_PORT=${NODE_PORT}" } else { sh "mvn -s $MAVEN_SETTINGS pact:verify -Dpact.filter.consumers=${CONSUMER} -DBROKER_URL=${BROKER_URL} -DuserName=${PACT_USERNAME} -Dpassword=${PACT_PASSWORD} -DAPP_URL=${CLUSTER_URL} -DAPP_PORT=${NODE_PORT}" } } } } if ("${PHASE}" == "INTEGRATION_TEST" || "${PHASE}" == "IST" || "${PHASE}" == "DEPLOY_IST" ) { stage("CADev Repo Update") { def GitinvokeURL = "${DEV_TEST_GIT_APP}/gitapp/service/git/push?gitUrl=${GIT_REPO_FOLDER}/${SERVICE_NAME}" sh "curl -i -X GET \'${GitinvokeURL}\'" } stage("Functional Test") { def invokeURL = "${DEV_TEST_SERVER_URL}/lisa-invoke/runTest?testCasePath=${LISA_PATH_NEW}${TEST_CASE_PATH}&stagingDocPath=${LISA_PATH_NEW}${STAGING_DOC_PATH}" sh "curl -i \'${invokeURL}\'" invokeURL = "${DEV_TEST_SERVER_URL}/lisa-invoke/runSuite?suitePath=${LISA_PATH_NEW}${SUITE_CASE_PATH}&configPath=${LISA_PATH_NEW}${CONFIG_PATH}" sh "curl -i \'${invokeURL}\'" } } } } }