微服务持续集成-使用Dockerfile编译、生成镜像(人在很悲伤的时候,很容易笑,搞得悲伤之外,还多了内疚)

微服务持续集成(4)-使用Dockerfile编译、生成镜像
//git的凭证
def git_auth="1be38991-873b-4a68-8eb6-312347fdc0a4"
//git的URL
def git_url="git@192.168.195.180: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="git@192.168.195.180: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文件
 #FROM java:8
FROM openjdk:8-jdk-alpine
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
EXPOSE 10086
ENTRYPOINT ["java","-jar","/app.jar"]
 
注意:每个项目公开的端口不一样
3) 修改Jenkinsfile构建脚本
//git的凭证
def git_auth="1be38991-873b-4a68-8eb6-312347fdc0a4"
//git的URL
def git_url="git@192.168.195.180: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="git@192.168.195.180: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="git@192.168.195.180: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="git@192.168.195.180: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更改提交进行构建测试

 

 

 

构建成功

 

 

 
在生产服务器上检查结果

 

 

 
在浏览器中查看服务

 

posted @ 2022-03-03 22:08  十一没有撤退可言!  阅读(118)  评论(0编辑  收藏  举报