jenkinsfile

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
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值