1. 程式人生 > 其它 >微服務持續整合-使用Dockerfile編譯、生成映象(人在很悲傷的時候,很容易笑,搞得悲傷之外,還多了內疚)

微服務持續整合-使用Dockerfile編譯、生成映象(人在很悲傷的時候,很容易笑,搞得悲傷之外,還多了內疚)

微服務持續整合(4)-使用Dockerfile編譯、生成映象
//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>
 
tensquare_common中pom配置 其他微服務pom中的配置部分 把整個專案目錄再次提交 再次構建 公共子工程被安裝到的路徑是/root/repo/com/tensquare/tensquare_common/1.0-SNAPSHOT/tensquare_common-1.0-SNAPSHOT.pom 開始編譯打包所有微服務專案 在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"
    }
    //打包微服務專案
    stage('make package') {
            sh  "mvn -f ${project_name} clean package"
    }
 
}
 
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"
    }
    //打包微服務,製作映象
    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更改提交進行構建測試 構建成功 在生產伺服器上檢查結果 在瀏覽器中檢視服務 希望和悲傷,都是一縷光。總有一天,我們會再相遇。