pipeline {
agent { label 'ci22' }
environment {
SNOAR_HOST_URL = 'https://sonarqube.syriusrobotics.cn/'
ECR_URI = '633349536424.dkr.ecr.cn-north-1.amazonaws.com.cn'
INTERFACE_DOCUMENT_URL = 'https://docs.flexgalaxy.ai/en/flagship/alpha/sdk/md_flagship_api.html'
MONGO_PORT = getRandomPort()
}
options {
parallelsAlwaysFailFast()
}
stages {
stage('Checkout') {
steps {
checkout([$class : 'RepoScm',
repoUrl : 'ssh://jenkins@gerrit.syriusrobotics.cn:29418/git-repo',
manifestRepositoryUrl: 'ssh://jenkins@gerrit.syriusrobotics.cn:29418/manifests',
manifestBranch : 'master',
manifestFile : 'flexgalxy/templar/order_service.xml',
currentBranch : false,
forceSync : true])
}
}
stage('Build And Test') {
steps {
withCredentials([usernamePassword(
credentialsId: 'maven-credencials', //这个credential的id可用于访问maven release仓库的artifacts,目前只有jenkins.syriusrobotics.cn可用
usernameVariable: 'username', // 此处声明usename的变量名
passwordVariable: 'password'
)]) {
sh '''#!/bin/bash
set -xe
docker run -e MONGO_INITDB_ROOT_USERNAME=root -e MONGO_INITDB_ROOT_PASSWORD=my-secret-pw -p $MONGO_PORT:27017 --name order_service_ci_mongo_$MONGO_PORT -d mongo
docker run --rm --net=host -P \
-v $PWD/src:/src -v /home/ubuntu/jenkins-data/maven/.m2:/root/.m2 \
-v /home/ubuntu/jenkins-data/gradle/.gradle:/root/.gradle \
--env buildNumber=$BUILD_NUMBER \
--env MONGO_PORT=$MONGO_PORT \
-w /src/order_service_parent/ openjdk:14.0.2 \
sh -c "./gradlew clean build -i --stacktrace -PbuildNumber=$buildNumber -PmavenUsername=$username -PmavenPassword=$password"
echo 'order_service jars in $PWD/src/order_service/build/libs:'
ls -al $PWD/src/order_service/build/libs
echo 'adaptor_api jars in $PWD/src/adaptor/adaptor_api/build/libs:'
ls -al $PWD/src/adaptor/adaptor_api/build/libs
'''
}
junit testResults: 'src/**/build/test-results/test/TEST-*.xml',allowEmptyResults: true
junit testResults: 'src/**/**/build/test-results/test/TEST-*.xml',allowEmptyResults: true
}
}
//stage('Generate Coverage Report') {
// steps {
// publishCoverage (adapters: [jacocoAdapter(path: 'src/order_service/build/jacoco/test/jacocoTestReport.xml'),
// jacocoAdapter(path: 'src/adaptor/adaptor_api/build/jacoco/test/jacocoTestReport.xml')])
// }
//}
//stage('SonarQube') {
// steps {
// sh '''#!/bin/bash
// docker run --rm --net=host -P \
// -v $PWD/src:/src \
// -v /home/ubuntu/jenkins-data/maven/.m2:/root/.m2 \
// -v /home/ubuntu/jenkins-data/gradle/.gradle:/root/.gradle \
// --env buildNumber=$BUILD_NUMBER \
// --env sonarqubeHostUrl=$SNOAR_HOST_URL \
// -w /src/order_service/ openjdk:14.0.2 \
// sh -c './gradlew sonarqube --stacktrace -i -PbuildNumber=$buildNumber -PsonarqubeHostUrl=$sonarqubeHostUrl'
// docker run --rm --net=host -P \
// -v $PWD/src:/src \
// -v /home/ubuntu/jenkins-data/maven/.m2:/root/.m2 \
// -v /home/ubuntu/jenkins-data/gradle/.gradle:/root/.gradle \
// --env buildNumber=$BUILD_NUMBER \
// --env sonarqubeHostUrl=$SNOAR_HOST_URL \
// -w /src/adaptor/adaptor_api/ openjdk:14.0.2 \
// sh -c './gradlew sonarqube --stacktrace -i -PbuildNumber=$buildNumber -PsonarqubeHostUrl=$sonarqubeHostUrl'
// '''
// }
//}
stage('Push manifestFile to S3') {
steps {
script {
sh 'repo manifest -r > manifest.xml'
sh 'aws s3 cp manifest.xml s3://syrius-priest-cloud-flexgalaxy/templar/order_service/manifest-cloud/manifest-cloud-${BUILD_NUMBER}/ --acl public-read'
env.MANIFEST_FILE = "s3://syrius-priest-cloud-flexgalaxy/templar/order_service/manifest-cloud/manifest-cloud-${BUILD_NUMBER}/manifest.xml"
}
}
}
stage('Deploy Images') {
steps {
script {
env.VERSION = getVersion()
sh 'aws ecr get-login-password --region cn-north-1 | docker login --username AWS --password-stdin ${ECR_URI}'
}
script {
retry(3) {s
docker.withRegistry('https://' + env.ECR_URI) {
echo 'build and push docker image for order_service'
buildImageAndPush('./src/order_service/', "order_service", "flex-galaxy/templar/order-service")
}
}
//def artifactUrl = env.ECR_URI + "/flex-galaxy/templar/order-service:" + env.VERSION
//def artifactName = "flexgalaxy-templar-order-service-${VERSION}"
//pushArtifactsToPulse(artifactUrl, artifactName, "${INTERFACE_DOCUMENT_URL}", "com.syriusrobotics.flexgalaxy%3Aorder_service")
}
script {
retry(3) {
docker.withRegistry('https://' + env.ECR_URI) {
echo 'build and push docker image for order_service'
buildImageAndPush('./src/adaptor/adaptor_api/', "adaptor_api", "flex-galaxy/templar/adaptor-api")
}
}
//def artifactUrl = env.ECR_URI + "/flex-galaxy/templar/adaptor-api:" + env.VERSION
//def artifactName = "flexgalaxy-templar-adaptor-api-${VERSION}"
//pushArtifactsToPulse(artifactUrl, artifactName, "${INTERFACE_DOCUMENT_URL}", "com.syriusrobotics.flexgalaxy%3Aadaptor_api")
}
}
}
}
}
def pushArtifactsToPulse(artifactUrl, artifactName, interfaceDocumentUrl, testReportComponentName) {
def url = "'${SNOAR_HOST_URL}api/measures/component?component="+testReportComponentName+"&metricKeys=conditions_to_cover,uncovered_conditions,lines_to_cover,uncovered_lines,coverage,line_coverage'"
def lines_to_cover = 0
def uncovered_lines = 0
def conditions_to_cover = 0
def uncovered_conditions = 0
def total_lines = 0
def total_conditions = 0
if(!"none".equals(testReportComponentName)) {
def sonarqubeJson = sh(returnStdout: true, script: 'curl ' + url).trim()
def json = readJSON text: sonarqubeJson, returnPojo: true
def measuresArr = json['component']['measures']
for(po in measuresArr){
if(po['metric'] == 'uncovered_conditions'){
uncovered_conditions = po['value'].toInteger()
}else if(po['metric'] == 'conditions_to_cover'){
conditions_to_cover = po['value'].toInteger()
}else if(po['metric'] == 'uncovered_lines'){
uncovered_lines = po['value'].toInteger()
}else if(po['metric'] == 'lines_to_cover'){
lines_to_cover = po['value'].toInteger()
}
}
total_lines = lines_to_cover + uncovered_lines
total_conditions = conditions_to_cover + uncovered_conditions
}
def push_result_to_pulse_patches_job = build job: 'push_result_to_pulse_patches', propagate: true, wait: false, parameters: [
[$class: 'StringParameterValue', name: 'projectName', value: "flexgalaxy-templar-order-service"],
[$class: 'StringParameterValue', name: 'artifactName', value: artifactName],
[$class: 'StringParameterValue', name: 'artifactUrl', value: artifactUrl],
[$class: 'StringParameterValue', name: 'pulseType', value: "AddArtifacts"],
[$class: 'StringParameterValue', name: 'artifactBuildType', value: "release"],
[$class: 'StringParameterValue', name: 'artifactVersion', value: "${VERSION}"],
[$class: 'StringParameterValue', name: 'artifactOrder', value: "${BUILD_NUMBER}"],
[$class: 'StringParameterValue', name: 'linesExecuteNum', value: lines_to_cover+""],
[$class: 'StringParameterValue', name: 'linesTotalNum', value: total_lines+""],
[$class: 'StringParameterValue', name: 'conditionalsExecuteNum', value: conditions_to_cover+""],
[$class: 'StringParameterValue', name: 'conditionalsTotalNum', value: total_conditions+""],
[$class: 'StringParameterValue', name: 'xmlFilePath', value: "${MANIFEST_FILE}"],
[$class: 'StringParameterValue', name: 'interfaceDocumentUrl', value: interfaceDocumentUrl],
]
}
def pushTestResultToPulse(artifactName, reportUrl) {
build job: 'push_result_to_pulse_patches', wait: false, propagate: true, parameters: [
[$class: 'StringParameterValue', name: 'projectName', value: "flexgalaxy-templar-order-service"],
[$class: 'StringParameterValue', name: 'artifactName', value: artifactName.replace("/", "-").replace(":", "-")],
[$class: 'StringParameterValue', name: 'testReportUrl', value: reportUrl],
[$class: 'StringParameterValue', name: 'pulseType', value: "UpdateArtifactsTestResult"],
[$class: 'StringParameterValue', name: 'currentEnv', value: "UT"],
[$class: 'StringParameterValue', name: 'buildResult', value: "${currentBuild.result}"],
]
}
def buildImageAndPush(path, jarFileName, imageName) {
def targetPath = path + "build/libs"
def jarInTarget = sh ( returnStdout: true, script: 'cd '+ targetPath + ' && find -name *.jar' ).trim()
def copyJarCommand = String.format("#!/bin/bash\n cd %s\n cp %s ../../docker\n cd ../../docker\n mv %s %s.jar\n",
targetPath, jarInTarget, jarInTarget, jarFileName)
sh copyJarCommand
def imageNameTag = imageName + ":" + env.VERSION
def image = docker.build(imageNameTag, path+"/docker")
image.push()
sh 'docker images'
sh 'docker rmi ' + imageNameTag
sh 'docker rmi ' + env.ECR_URI + '/' + imageNameTag
}
def getVersion() {
return String.format("1.0.0.%s", env.BUILD_NUMBER)
}
def getRandomPort() {
def port = (int)(Math.random()*50000) + 10000
return port
}