微服務持續整合-使用Dockerfile編譯、生成映象(人在很悲傷的時候,很容易笑,搞得悲傷之外,還多了內疚)
阿新 • • 發佈:2022-03-03
微服務持續整合(4)-使用Dockerfile編譯、生成映象
tensquare_common中pom配置
其他微服務pom中的配置部分
把整個專案目錄再次提交
再次構建
公共子工程被安裝到的路徑是/root/repo/com/tensquare/tensquare_common/1.0-SNAPSHOT/tensquare_common-1.0-SNAPSHOT.pom
開始編譯打包所有微服務專案
在Jenkinsfile中新增微服務打包程式碼(紅色程式碼)
zuul新增父程序
提交修改
再次構建專案,先構建eureka服務
繼續構建tensquare_zuul服務閘道器
原因:Jenkins伺服器中並沒有tensquare_paren工程,而zuul需要依賴這個工程
解決方法:傳遞父工程進Jenkins倉庫
cd /root/repo/com/tensquare
[root@jenkins target]# cd /root/repo/
[root@jenkins repo]# ls
[root@jenkins repo]# cd com
[root@jenkins com]# cd tensquare/
此時把父工程目錄傳遞進去
unzip tensquare_parent.zip
繼續打包zuul服務閘道器
繼續打包許可權中心服務
最後打包活動微服務
到此所有微服務專案打包成功!!!
利用dockerfile-maven-plugin外掛構建Docker映象
1)在每個微服務專案的pom.xml加入dockerfile-maven-plugin外掛
2)在每個微服務專案根目錄下建立Dockerfile檔案
#FROMjava:8
FROMopenjdk:8-jdk-alpine
ARGJAR_FILE
COPY ${JAR_FILE}app.jar
EXPOSE10086
ENTRYPOINT ["java","-jar","/app.jar"]
注意:每個專案公開的埠不一樣
3)修改Jenkinsfile構建指令碼
//git的憑證 def git_auth="1be38991-873b-4a68-8eb6-312347fdc0a4" //git的URL def git_url="[email protected]:kgc_group/tensquare_back.git" node { stage('pull code') { //切換成變數,字串符號使用雙引號 checkout([$class: 'GitSCM', branches: [[name: "*/${branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]]]) } stage('check code') { //定義SonarQubeScanner工具 def scannerHome = tool 'sonar-scanner' //引用SonarQube系統環境 withSonarQubeEnv('sonarqube') { sh """ cd ${project_name} ${scannerHome}/bin/sonar-scanner """ } } //新增公共子工程 stage('make install public sub project') { sh "mvn -f tensquare_common clean install" }構建tensquare_back專案進行測試: 解決方法: 把以下父工程pom中的maven外掛程式碼移至除了tensquare_common以外每個子工程pom中}
<build> <plugins> <plugin> <!--提供打包(將應用打包成可執行的jar包)--> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
//git的憑證 def git_auth="1be38991-873b-4a68-8eb6-312347fdc0a4" //git的URL def git_url="[email protected]:kgc_group/tensquare_back.git" node { stage('pull code') { //切換成變數,字串符號使用雙引號 checkout([$class: 'GitSCM', branches: [[name: "*/${branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]]]) } stage('check code') { //定義SonarQubeScanner工具 def scannerHome = tool 'sonar-scanner' //引用SonarQube系統環境 withSonarQubeEnv('sonarqube') { sh """ cd ${project_name} ${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" } }
//git的憑證 def git_auth="1be38991-873b-4a68-8eb6-312347fdc0a4" //git的URL def git_url="[email protected]:kgc_group/tensquare_back.git" node { stage('pull code') { //切換成變數,字串符號使用雙引號 checkout([$class: 'GitSCM', branches: [[name: "*/${branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]]]) } stage('check code') { //定義SonarQubeScanner工具 def scannerHome = tool 'sonar-scanner' //引用SonarQube系統環境 withSonarQubeEnv('sonarqube') { sh """ cd ${project_name} ${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" } }構建eureka服務 進入Jenkins伺服器檢視映象 後續的所有專案都按以上步驟製作映象 所有服務映象製作完成!!! 微服務持續整合(5)-上傳到Harbor映象倉庫 1)修改Jenkinsfile構建指令碼
//git的憑證 def git_auth="1be38991-873b-4a68-8eb6-312347fdc0a4" //git的URL def git_url="[email protected]:kgc_group/tensquare_back.git" //映象標籤 def tag="latest" //harbor的url地址 def harbor_url="192.168.195.183:85" //映象倉庫名 def harbor_name="tensquare" node { stage('pull code') { //切換成變數,字串符號使用雙引號 checkout([$class: 'GitSCM', branches: [[name: "*/${branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]]]) } stage('check code') { //定義SonarQubeScanner工具 def scannerHome = tool 'sonar-scanner' //引用SonarQube系統環境 withSonarQubeEnv('sonarqube') { sh """ cd ${project_name} ${scannerHome}/bin/sonar-scanner """ } } //新增公共子工程 stage('make install public sub project') { sh "mvn -f tensquare_common clean install" } //打包微服務,製作映象,上傳映象 stage('make package images,push images') { sh "mvn -f ${project_name} clean package dockerfile:build" //定義映象名稱 def imageName="${project_name}:${tag}" //對映象打標籤 sh "docker tag ${imageName} ${harbor_url}/${harbor_name}/${imageName}" } }構建eureka測試打標籤結果 2)使用憑證管理Harbor私服賬戶和密碼 先在憑證建立Harbor的憑證,在生成憑證指令碼程式碼
//git的憑證 def git_auth="1be38991-873b-4a68-8eb6-312347fdc0a4" //git的URL def git_url="[email protected]:kgc_group/tensquare_back.git" //映象標籤 def tag="latest" //harbor的url地址 def harbor_url="192.168.195.183:85" //映象倉庫名 def harbor_name="tensquare" //harbor的憑證 def harbor_auth="e8b4bf42-2a87-4611-90f7-4b4a75479b5c" node { stage('pull code') { //切換成變數,字串符號使用雙引號 checkout([$class: 'GitSCM', branches: [[name: "*/${branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]]]) } stage('check code') { //定義SonarQubeScanner工具 def scannerHome = tool 'sonar-scanner' //引用SonarQube系統環境 withSonarQubeEnv('sonarqube') { sh """ cd ${project_name} ${scannerHome}/bin/sonar-scanner """ } } //新增公共子工程 stage('make install public sub project') { sh "mvn -f tensquare_common clean install" } //打包微服務,製作映象,上傳映象 stage('make package images,push images') { 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 映象上傳成功" } } }Jenkinsfile更改提交後,測試映象上傳 上傳成功!!! 微服務持續整合(6)-拉取映象和釋出應用 注意:192.168.66.103服務已經安裝Docker並啟動 安裝 Publish Over SSH 外掛 安裝以下外掛,可以實現遠端傳送Shell命令 配置遠端部署伺服器 1)拷貝公鑰從Jenkins伺服器拷貝到生產伺服器 cd /root/.ssh ssh-copy-id 192.168.153.50(生產伺服器) 2)系統配置->新增遠端伺服器 /root/.ssh/id_rsa master_server 修改Jenkinsfile構建指令碼生成遠端呼叫模板程式碼
/git的憑證 def git_auth="1be38991-873b-4a68-8eb6-312347fdc0a4" //git的URL def git_url="[email protected]:kgc_group/tensquare_back.git" //映象標籤 def tag="latest" //harbor的url地址 def harbor_url="192.168.195.183:85" //映象倉庫名 def harbor_name="tensquare" //harbor的憑證 def harbor_auth="e8b4bf42-2a87-4611-90f7-4b4a75479b5c" node { stage('pull code') { //切換成變數,字串符號使用雙引號 checkout([$class: 'GitSCM', branches: [[name: "*/${branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]]]) } stage('check code') { //定義SonarQubeScanner工具 def scannerHome = tool 'sonar-scanner' //引用SonarQube系統環境 withSonarQubeEnv('sonarqube') { sh """ cd ${project_name} ${scannerHome}/bin/sonar-scanner """ } } //新增公共子工程 stage('make install public sub project') { sh "mvn -f tensquare_common clean install" } //打包微服務,製作映象,上傳映象 stage('make package images,push images') { 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)]) } }新增埠新引數 部署指令碼deploy.sh中的內容
#! /bin/sh #接收外部引數 harbor_url=$1 harbor_project_name=$2 project_name=$3 tag=$4 port=$5 imageName=$harbor_url/$harbor_project_name/$project_name:$tag echo "$imageName" #查詢容器是否存在,存在則刪除 containerId=`docker ps -a | grep -w ${project_name}:${tag} | awk '{print $1}'` if [ "$containerId" != "" ] ; then #停掉容器 docker stop $containerId #刪除容器 docker rm $containerId echo "成功刪除容器" fi #查詢映象是否存在,存在則刪除 imageId=`docker images | grep -w $project_name | awk '{print $3}'` if [ "$imageId" != "" ] ; then #刪除映象 docker rmi -f $imageId echo "成功刪除映象" fi # 登入Harbor docker login -u tom -p Abcd1234 $harbor_url # 下載映象 docker pull $imageName # 啟動容器 docker run -di -p $port:$port $imageName echo "容器啟動成功"在生產伺服器上建立目錄,並放入指令碼 給予執行許可權 Jenkinsfile更改提交進行構建測試 構建成功 在生產伺服器上檢查結果 在瀏覽器中檢視服務 希望和悲傷,都是一縷光。總有一天,我們會再相遇。