文章目录
一、Jenkins+Docker+SpringCloud持续集成流程
文字流程
开发人员每天把代码提交到 Gitlab 代码仓库。
Jenkins 从 Gitlab 中拉取项目源码,编译并打成 jar 包,然后构建成 Docker 镜像,将镜像上传到 Harbor 私有仓库。
Jenkins 发送 SSH 远程命令,让生产部署服务器到 Harbor 私有仓库拉取镜像到本地,然后创建容器。
最后,用户可以访问到容器
二、利用Jenkins打包微服务项目
1、生成公共子工程 pom 文件
1.1、修改 Jenkinsfile
def git_auth="e6ede7de-abef-449e-be67-a9a72feb5fb2"
def git_url="git@192.168.199.141:major/tensquare_back_New.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"
}
}
1.2、修改各个pom.xml
把 parent 父工程 pom.xml 中的 maven 插件代码移至除了 tensquare_common 以外每个子工程 pom.xml 中
修改tensquare_parent的pom.xm
<build>
<plugins>
<plugin>
<!--提供打包(将应用打包成可执行的jar包)-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
common不是运行的微服务,所以不需要添加springboot-maven插件
其他微服务配置
整理完后提交到gitlab中
Jenkins再次构建,先构建eureka服务
2、开始编译打包所有微服务项目
2.1、修改Jenkinsfile并提交
def git_auth="e6ede7de-abef-449e-be67-a9a72feb5fb2"
def git_url="git@192.168.199.141:major/tensquare_back_New.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"
}
}
再次构建项目,先构建eureka服务
继续构建tensquare_zuul服务网关
原因:Jenkins服务器中并没有tensquare_paren工程,而zuul需要依赖这个工程解决方法:传递父工程进Jenkins仓库
[root@jenkins target]# cd /root/repo/
[root@jenkins repo]# ls
[root@jenkins repo]# cd com
[root@jenkins com]# cd tensquare/
此时把父工程目录传递进去
继续打包zuul服务网关
继续打包权限中心服务
最后打包活动微服务
三、利用docker-maven-plugin插件化构建docker镜像
1、在每个微服务项目的pom.xml加入dockerfile-maven-plugin插件
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin
</artifactId>
<version>1.3.6</version>
<configuration>
<repository>${project.artifactId}</repository>
<buildArgs>
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</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构建脚本
def git_auth="e6ede7de-abef-449e-be67-a9a72feb5fb2"
def git_url="git@192.168.199.141:major/tensquare_back_New.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"
}
}
提交Jenkinsfile
构建eureka服务,把四个全部构建
4、上传harbor仓库
4.1、修改Jenkinsfile
添加打标签步骤,用于上传镜像到harbor仓库
def git_auth="e6ede7de-abef-449e-be67-a9a72feb5fb2"
def git_url="git@192.168.199.141:major/tensquare_back_New.git"
/镜像标签
def tag="latest"
//harbor的url地址
def harbor_url="192.168.199.139: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') {
sh "mvn -f ${project_name} clean package dockerfile:build"
//定义镜像名称
def imageName="${project_name}:${tag}"
//对镜像打标签
sh "docker tag ${imageName} ${harbor_url}/${harbor_name}/${imageName}"
}
}
提交Jenkinsfile,通过euareka测试结果
4.2、使用凭证管理Harbor私服账号和密码
def git_auth="e6ede7de-abef-449e-be67-a9a72feb5fb2"
def git_url="git@192.168.199.141:major/tensquare_back_New.git"
def tag="latest"
//harbor的url地址
def harbor_url="192.168.199.139:85"
//镜像仓库名
def harbor_name="tensquare"
//harbor的凭证
def harbor_auth="4fafa4e1-46ad-4c24-824b-15ba0bacbf03"
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 镜像上传成功"
}
}
}
Jenkins提交,测试镜像,四个微服务都需上传
四、安装publish Over SSH插件
记得重启
配置远程部署服务器
拷贝公钥从 Jenkins 服务器拷贝到生产服务器
ssh-copy-id 192.168.199.140
def git_auth="e6ede7de-abef-449e-be67-a9a72feb5fb2"
def git_url="git@192.168.199.141:major/tensquare_back_New.git"
def tag="latest"
//harbor的url地址
def harbor_url="192.168.199.139:85"
//镜像仓库名
def harbor_name="tensquare"
//harbor的凭证
def harbor_auth="4fafa4e1-46ad-4c24-824b-15ba0bacbf03"
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 admin -p Harbor12345 $harbor_url
# 下载镜像
docker pull $imageName
# 启动容器
docker run -di -p $port:$port $imageName
echo "容器启动成功"
在生产服务器上创建目录,并放入脚本
jenkinsfile构建
在生产服务器上检查结果
查看服务