1. 程式人生 > 其它 >微服務批量部署之程式碼審查和打包,上傳映象部分

微服務批量部署之程式碼審查和打包,上傳映象部分

微服務持續整合之叢集化批量部署

目錄

微服務部署方案優化

單節點的部署方案存在以下問題:

  • 一次只能選擇一個微服務部署
  • 只有一臺生產者部署伺服器
  • 每個微服務只有一個例項,容錯率低


優化方案:

  • 在一個Jenkins工程中選擇多個微服務同時釋出
  • 在一個Jenkins工程中可以選擇多臺生產伺服器同時部署
  • 每個微服務都是以叢集高可用形式部署


Jenkins+Docker+SpringCloud叢集部署流程說明


修改所有微服務配置

註冊中心配置

再去啟動一臺docker2伺服器(安裝部署docker環境),要配置映象加速,並且能夠登陸到harhor倉庫。


idea裡,修改eureka註冊中心配置

# 叢集版
spring:
  application:
    name: EUREKA-HA


---
server:
  port: 10086
spring:
  # 指定profile=eureka-server1
  profiles: eureka-server1
eureka:
  instance:
    # 指定當profile=eureka-server1時,主機名是eureka-server1
    hostname: 192.168.23.12
  client:
    service-url:
      # 將自己註冊到eureka-server1、eureka-server2這個Eureka上面去
      defaultZone: http://192.168.23.12:10086/eureka/,http://192.168.23.14:10086/eureka/

---
server:
  port: 10086
spring:
  profiles: eureka-server2
eureka:
  instance:
    hostname: 192.168.23.14
  client:
    service-url:
      defaultZone: http://192.168.23.12:10086/eureka/,http://192.168.23.14:10086/eureka/

其他微服務配置

除eureka註冊中心以外,其他為伺服器配置都需要加入所有Eureka服務

eureka:
  client:
    service-url:  
      defaultZone: http://192.168.23.14:10086/eureka,http://192.168.23.12:10086/eureka # Eureka訪問地址
  instance:
    prefer-ip-address: true

將整個專案提交到gitlab



設定Jenkins 叢集專案的構建引數

安裝Extended Choice Parameter外掛,支援多選框


建立流水線專案,新增引數


引數化構建


繼續新增引數,選擇 Extended Choice Parameter

name為project_name ,輸入描述資訊後,點選Basic Parameter Types 基礎引數型別


選擇 Choose Source for Value ... ,輸入值


配置value,格式是 專案名@埠,專案名@埠........ 注意,中間的逗號為英文逗號

tensquare_eureka_server@10086,tensquare_zuul@10020,tensquare_admin_service@9001,tensquare_gathering@9002

配置預設值

!


配置描述資訊。描述資訊和值對應,並且,中間的逗號也是英文



儲存後,構建專案時,介面如下



idea 裡修改Jenkinsfile,配置 程式碼檢查 的迴圈構建

修改Jenkinsfile

def git_auth="f3268a97-e838-4da4-ba6a-5a4ef6f12c4b"
def git_url="[email protected]:my_group/tensquare_back.git"

//定義標籤
def tag="latest"
//定義倉庫地址
def harbor_url="192.168.23.13:85"
//定義倉庫名稱
def harbor_name="tensquare"
//harbor憑證
def harbor_auth="a5daf047-4518-4481-bfe6-78940f1b4b95"

node {
   //獲取當前選擇專案名稱,將project_name的值,按照逗號分隔。獲取到的應該是 專案名@埠
    def selectedProjectNames="${project_name}".split(",")


    stage('pull code') {
       checkout([$class: 'GitSCM', branches: [[name: "${branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]]])
    }
     stage('check code') {

                 // 使用for 迴圈遍歷,獲取的值依次是 專案1@專案1埠 ,專案2@專案2埠..........
                 for(int i=0;i<selectedProjectNames.length;i++){
                     //專案資訊  tensquare_eureka_server@10086
                     def projectInfo=selectedProjectNames[i]

                     //當前的專案名稱,將projectInfo的值,按照@符號進行分隔,獲取第一項,即時專案名
                     def currentProjectName="${projectInfo}".split("@")[0]

                     //當前的專案埠
                     def currentProjectPort="${projectInfo}".split("@")[1]


                //定義SonarQubeScanner工具
                def scannerHome = tool 'sonar-scanner'
                //引用SonarQube系統環境
                withSonarQubeEnv('sonarqube') {
                sh """
                    cd ${currentProjectName}
                    ${scannerHome}/bin/sonar-scanner
                   """
                   }
            }

      }
      stage('make install public sub project') {
               sh "mvn -f tensquare_common clean install"
          }
      //打包微服務專案,製作映象
      stage('make package') {
              sh  "mvn -f ${project_name} clean package dockerfile:build"
              //映象打標籤
              def imageName="${project_name}:${tag}"
              sh "docker tag ${imageName} ${harbor_url}/${harbor_name}/${imageName}"
              //映象推送到harbor
             withCredentials([usernamePassword(credentialsId: "${harbor_auth}", passwordVariable: 'password', usernameVariable: 'username')]) {
                 //登入harbor
                 sh "docker login -u ${username} -p ${password} ${harbor_url}"
                 //上傳映象
                 sh "docker push ${harbor_url}/${harbor_name}/${imageName}"
                 sh "echo 映象上傳成功"
             }
       sshPublisher(publishers: [sshPublisherDesc(configName: 'master_server', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "/opt/jenkins_shell/deploy.sh ${harbor_url} ${harbor_name} ${project_name} ${tag} ${port}", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
      }
}


構建專案,測試程式碼檢查

選擇4個專案,然後進行構建(最後後報錯),進入到專案的終端輸出,檢視


修改Jenkinsfile,配置 迴圈打包編譯製作映象

修改Jenkinsfile檔案

def git_auth="f3268a97-e838-4da4-ba6a-5a4ef6f12c4b"
def git_url="[email protected]:my_group/tensquare_back.git"

//定義標籤
def tag="latest"
//定義倉庫地址
def harbor_url="192.168.23.13:85"
//定義倉庫名稱
def harbor_name="tensquare"
//harbor憑證
def harbor_auth="a5daf047-4518-4481-bfe6-78940f1b4b95"

node {
   //獲取當前選擇專案名稱,將project_name的值,按照逗號分隔。獲取到的應該是 專案名@埠
    def selectedProjectNames="${project_name}".split(",")


    stage('pull code') {
       checkout([$class: 'GitSCM', branches: [[name: "${branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]]])
    }
     stage('check code') {

                 // 使用for 迴圈遍歷,獲取的值依次是 專案1@專案1埠 ,專案2@專案2埠..........
                 for(int i=0;i<selectedProjectNames.length;i++){
                     //專案資訊  tensquare_eureka_server@10086
                     def projectInfo=selectedProjectNames[i]

                     //當前的專案名稱,將projectInfo的值,按照@符號進行分隔,獲取第一項,即時專案名
                     def currentProjectName="${projectInfo}".split("@")[0]

                     //當前的專案埠
                     def currentProjectPort="${projectInfo}".split("@")[1]


                //定義SonarQubeScanner工具
                def scannerHome = tool 'sonar-scanner'
                //引用SonarQube系統環境
                withSonarQubeEnv('sonarqube') {
                sh """
                    cd ${currentProjectName}
                    ${scannerHome}/bin/sonar-scanner
                   """
                   }
            }

      }
      stage('make install public sub project') {
               sh "mvn -f tensquare_common clean install"
          }


      //打包微服務專案,製作映象
      stage('make package') {

        for(int i=0;i<selectedProjectNames.length;i++){
            //專案資訊  tensquare_eureka_server@10086
            def projectInfo=selectedProjectNames[i]

            //當前的專案名稱
            def currentProjectName="${projectInfo}".split("@")[0]

            //當前的專案埠
            def currentProjectPort="${projectInfo}".split("@")[1]


              sh  "mvn -f ${currentProjectName} clean package dockerfile:build"
              //映象打標籤
              def imageName="${currentProjectName}:${tag}"
              sh "docker tag ${imageName} ${harbor_url}/${harbor_name}/${imageName}"
              //映象推送到harbor
             withCredentials([usernamePassword(credentialsId: "${harbor_auth}", passwordVariable: 'password', usernameVariable: 'username')]) {
                 //登入harbor
                 sh "docker login -u ${username} -p ${password} ${harbor_url}"
                 //上傳映象
                 sh "docker push ${harbor_url}/${harbor_name}/${imageName}"
                 sh "echo 映象上傳成功"
             }
         }
        //部署應用
       sshPublisher(publishers: [sshPublisherDesc(configName: 'master_server', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "/opt/jenkins_shell/deploy.sh ${harbor_url} ${harbor_name} ${project_name} ${tag} ${port}", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
      }

}








迴圈打包,編譯,製作映象,上傳映象,測試成功