微服務批量部署之程式碼審查和打包,上傳映象部分
阿新 • • 發佈:2022-03-04
微服務持續整合之叢集化批量部署
目錄- 微服務部署方案優化
- Jenkins+Docker+SpringCloud叢集部署流程說明
- 修改所有微服務配置
- 設定Jenkins 叢集專案的構建引數
- idea 裡修改Jenkinsfile,配置 程式碼檢查 的迴圈構建
- 修改Jenkinsfile,配置 迴圈打包編譯製作映象
微服務部署方案優化
單節點的部署方案存在以下問題:
- 一次只能選擇一個微服務部署
- 只有一臺生產者部署伺服器
- 每個微服務只有一個例項,容錯率低
優化方案:
- 在一個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)])
}
}
迴圈打包,編譯,製作映象,上傳映象,測試成功