目录
1.每个微服务项目加入dockerfile-maven-plugin插件
一、打包编译服务
1.配置Jenkinsfile
添加下面代码到Jenkinsfile文件中
stage('make install public sub project') {
sh "mvn -f tensquare_common clean install"
}
构建项目将进行测试:
错误是缺少Maven插件
解决方法:
把父工程的pom中的maven插件移出,除了tensquare_common以外的每个子工程都添加maven插件代码如下
<build>
<plugins>
<plugin>
<!--提供打包(将应用打包成可执行的jar包)-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
其他微服务pom中的配置部分
tensquare_common中的pom配置
根目录的pom
提交项目,重新构建
构建成功
2.构建其他项目
Jenkinsfile添加代码,构建其他项目
stage('打包其他子服务') {
sh "mvn -f ${project_name} clean package"
}
提交推送,再次构建,构建到zuul服务的时候发现错误
原因:Jenkins服务器中并没有tensquare_paren工程,而zuul需要依赖这个工程
解决办法:传递父工程进Jenkins仓库
cd /root/repo/com/tensquare
把父工程目录传递进去,并解压,再把解压包删除
再次打包zuul服务
成功,依次打包其他服务
二、使用Dockerfile构建镜像并打包
利用dockerfile-maven-plugin插件构建Docker镜像
1.每个微服务项目加入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构建脚本
stage('make package') {
sh "mvn -f ${project_name} clean package dockerfile:build"
}
写好之后,推送,测试构建,这边就不演示了,构建完成之后,使用docker查看是否有镜像
三、上传到Harbor镜像仓库
1.修改Jenkinsfile构架脚本
添加下面代码
//镜像标签
def tag="latest"
//harbor的url地址
def harbor_url="192.168.72.16:85"
//镜像仓库名
def harbor_name="tensquare"
//定义镜像名称
def imageName="${project_name}:${tag}"
//对镜像打标签
sh "docker tag ${imageName} ${harbor_url}/${harbor_name}/${imageName}"
2.添加Harbor凭证
①生成凭证
Jenkins上操作
②编写Jenkinsfile
返回Jenkinsfile添加变量
找到流水线语法,找到withCredentials
复制到Jenkinsfile中,并在里面添加下面代码
//登录harbor
sh "docker login -u ${username} -p ${password} ${harbor_url}"
//镜像上传
sh "docker push ${harbor_url}/${harbor_name}/${imageName}"
sh "echo 镜像上传成功"
推送Jenkinsfile并测试
三、拉取镜像和发布应用
1.安装Publish Over SSH 插件
我这边已经安装过了
2.配置远程部署服务器
①从Jenkins服务器拷贝公钥到生产服务器
ssh-copy-id 192.168.72.17
在72.17服务器上查看
②系统配置中添加远程服务器
2.修改Jenkinsfile
① 生成构建脚本
生成远程调用模板代码
sshPublisher(publishers: [sshPublisherDesc(configName: 'master_server', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
在execCommand后面添加代码如下:
“/opt/jenkins_shell/deploy.sh ${harbor_url} ${harbor_name} ${project_name} ${tag} ${port}”
每个变量之间有空格(切记)
这边添加的是脚本文件位置和参数
3.添加端口参数
在Jenkins项目配置中添加
4.部署脚本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 "容器启动成功"
为脚本传建目录,并给予执行权限,必须跟上一步里填写的代码一致
5.测试
提交Jenkinsfile进行构建测试
访问成功
注意注意注意注意:docker除了harbor仓库的服务器不需要添加har仓库地址,其他的想要拉取或者上传到harbor仓库的服务器都需要填写harbor仓库地址。