前言
本文章示例jenkins版本为 - 2.346.3 , springboot版本 - 2.1.6 RELEASE , cloud的version-Greenwich.SR1
服务器环境需求 :
需要有maven环境
需要有git环境
需要有java环境
需要安装jenkins服务 - jenkins安装可以看我这篇文章 : 安装jenkins的三种方法
关于jenkins的配置上一篇文章如何使用jenkins+docker自动化部署spring-boot项目那一片文章已经叙述过,这一章就把他复制过来不重复造轮子了,都是一样的唯独不一样的就是后续创建项目的时候,如果大家已经配置好jenkins可以直接跳到配置项目进行阅读!
配置jenkins
将jenkins用户加入docker用户组
查看是否有docker用户组
cat /etc/group
没有的话新建一个
sudo groupadd docker
查看是否有jenkins用户,一般war包方式启动jenkins的需要自建一个jenkins
cat /etc/passwd
没有的话新建一个
adduser jenkins
添加jenkins用户到docker用户组
newgrp docker
查看jenkins所在的用户组
groups jenkins
重启jenkins
#yum安装的重启方式
systemctl restart jenkins
#war包的重启方式
ps aux |grep jenkins #找见jenkins的pid
kill -9 [jenkins的pid]
然后再启动jenkins
开启docker远程访问权限,修改docker.service配置文件
vim /usr/lib/systemd/system/docker.service
添加以下内容
ExecStart=
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
重新读取配置
systemctl daemon-reload
重启docker
systemctl restart docker
如果开启的防火墙需要放行2375端口以及开启
iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 2375 -j ACCEPT
jenkins环境配置
进入jenkins首页点击侧边栏Manage Jenkins -> Global Tool Configuration
jenkins配置jdk环境
jenkins配置git环境
没有git服务,可以使用以下命令进行安装git
sudo yum install -y git
whereis git #查看git安装目录,一般默认是/usr/bin/git
jenkins配置maven环境
保存环境配置,然后进入插件管理中心
点击已安装,搜索maven看看maven插件是否安装,有的话就不需要重复安装了
没有的话,点击可选插件,然后搜索maven,进行安装maven插件
配置项目
因为我们是要将项目打包成docekr镜像然后发布启动,所以我们可以在项目的pom中使用dockerfile-maven-plugin插件让我们的项目在进行maven打包的同时生成docker镜像,具体操作就是首先需要在我们每一个微服务的根目录去编辑一个dockerFile
FROM registry.cn-hangzhou.aliyuncs.com/sangmuen/java:8 #基于java8创建镜像
MAINTAINER jy1997 4044092@qq.com #作者信息,随意填
ARG JAR_FILE #JAR_FILE会对应pom中maven打包哪里的一个变量,maven打完包会把包名赋到这个变量上
COPY ${JAR_FILE} /eureka.jar #同上,就是将打完的jar包复制到容器中并重命名为eureka.jar
CMD ["--server.port=6868"] #修改springboot启动端口为当前项目的端口号
EXPOSE 6868 #暴露该端口,要不会无权限访问
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone #修改docekr镜像时差
ENTRYPOINT ["java","-jar","/eureka.jar"] #启动docekr中的jar包 ,后面启动jar包名就是你copy到容器中的jar包
这是其中一个dockerfile , 其他微服务的docekrfile只需要将上面的端口号还有jar包名改一下就可以了,每一个可启动的微服务都需要有一个dockerfile在根目录
接下来就是需要在可启动的微服务的pom中声明在maven打包的时候生成docker镜像,具体就是在你的pom中新增以下片段,注意 : 只需要在可启动的微服务的pom中新增即可
<build>
<plugins>
<plugin>
<!-- maven打包 -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<!-- 入口函数不在根目录下进行如下配置,你入口函数的路径 -->
<configuration>
<mainClass>com.amall.UserApplication</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<version>1.2.5.RELEASE</version>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.18.1</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
<!--docker 打包,这里就是声明在maven打包时会根据根目录的dockerfile进行docker镜像生成-->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.4.7</version>
<configuration>
<repository>${project.artifactId}</repository>
<buildArgs>
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
</plugins>
</build>
${project.build.finalName}.jar
是jar包路径,这里使用了最终生成的jar包的文件名
我们项目中除了一些可启动的微服务以外,还有一些服务就是会存放一下公共的东西比如共用的pojo包或者工具类什么的,这些服务并不需要启动,而是会打成一个jar包供其他服务器调用即可,那这些微服务就不需要生成dockerfile文件,pom中也不需要声明docker打包片段,具体pom片段如下
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.12.4</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
编辑成功以后,我们在将项目提交到git上
jenkins创建项目
然后我们在登录jenkins进行项目创建 , 首页 -> 新建item -> 选择流水线 -> 输入项目名称然后点击确定
然后我们选择General中的This project is parameterize,然后点击添加参数
选择Choice Parameter参数添加,名称就随便填一下即可,要在下面的流水线脚本中引用该变量名,选项填你每一个可启动的微服务名称
然后最下面点击流水线语法
选择片段生成器 - > check out
然后先添加凭证
然后输入自己git仓库的账号密码进行保存
然后再输入自己项目的git地址,下面凭证就选择自己刚才添加的凭证
然后点击生成流水线脚本
然后返回jenkins配置,在最下面的流水线哪里添加以下脚本
pipeline {
agent any
environment {
def imageName = "${service}"
def tag="latest"
def publish_server= "docker_client"
}
tools {
//这里对应着你jenkins中maven配置的别名
maven "apache-maven-3.6.3"
}
stages {
stage('check out') {
steps {
//这里填刚才生成的流水线脚本
checkout([$class: 'GitSCM', branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: '49bdadbc-c174-4943-ba74-dc645e87b42b', url: 'https://gitee.com/i-moon/cloud-demo.git']]])
}
}
stage('building dependency') {
steps {
//这里根据父项目的pom进行打包,就是把父项目下的所有项目都打包生成jar包,防止微服务数据不一致,所有直接在每一次微服务发布都会进行一次全项目数据更新
sh '''
mvn -f pom.xml clean install -Dautoconfig.skip=true -Dmaven.test.skip=false -Dmaven.test.failure.ignore=true
'''
}
}
stage('building selected project') {
steps {
sh '''
containerStr=`docker ps -a | grep -w ${imageName} | awk '{print $1}'`
imageStr=`docker images | grep -w $imageName | awk '{print $3}'`
echo "container id:$containerStr"
echo "image id:$imageStr"
if [ "$imageStr" != "" ] ; then
if [ "$containerStr" != "" ] ; then
#停掉容器
docker stop `docker ps -a | grep -w ${imageName} | awk '{print $1}'`
#删除容器
docker rm `docker ps -a | grep -w ${imageName} | awk '{print $1}'`
#删除镜像
docker rmi --force ${imageName}
else
#删除镜像
docker rmi --force ${imageName}
fi
fi
# eureka , 以下就是根据选项进行maven打包并生成docker镜像到本地
if [ "$imageName" == 'eureka' ] ; then
mvn -f cloud-demo/${service} clean install dockerfile:build -Dautoconfig.skip=true -Dmaven.test.skip=false -Dmaven.test.failure.ignore=true
fi
# goods
if [ "$imageName" == 'goods' ] ; then
mvn -f cloud-demo/${service} clean install dockerfile:build -Dautoconfig.skip=true -Dmaven.test.skip=false -Dmaven.test.failure.ignore=true
fi
# order
if [ "$imageName" == 'order' ] ; then
mvn -f cloud-demo/${service} clean install dockerfile:build -Dautoconfig.skip=true -Dmaven.test.skip=false -Dmaven.test.failure.ignore=true
fi
# user
if [ "$imageName" == 'user' ] ; then
mvn -f cloud-demo/${service} clean install dockerfile:build -Dautoconfig.skip=true -Dmaven.test.skip=false -Dmaven.test.failure.ignore=true
fi
'''
}
}
stage('docker images start') {
steps {
sh '''
# eureka , 以下就是启动上一步生成的docker镜像
if [ "$imageName" == "eureka" ] ; then
docker run -d -p 6868:6868 -v /dockerVolume/mount/:/mount/ --net my_net --ip 192.168.200.200 --name ${imageName} ${imageName}
fi
# goods
if [ "$imageName" == "goods" ] ; then
docker run -d -p 10001:10001 -v /dockerVolume/mount/:/mount/ --net my_net --name ${imageName} ${imageName}
fi
# order
if [ "$imageName" == "order" ] ; then
docker run -d -p 10002:10002 -v /dockerVolume/mount/:/mount/ --net my_net --name ${imageName} ${imageName}
fi
# user
if [ "$imageName" == "user" ] ; then
docker run -d -p 10003:10003 -v /dockerVolume/mount/:/mount/ --net my_net --name ${imageName} ${imageName}
fi
'''
}
}
}
}
如果你git上第一级目录为单个目录没有pom文件那就是你提交了父项目文件夹,如果你第一级目录中有父项目的pom文件那就是你没有提交父项目文件夹,根据自身情况修改上述流水线脚本!
然后点击保存,然后点击Build with parameters 就可以看见你新增的微服务列表了
最后一步我们在生成一下以上脚本中声明的docker网络 my_net , 网关为 192.168.200.1,这一步是确保我们这个项目在docker容器中的网络隔离性
#创建docker网络
docker network create --driver bridge --subnet 192.168.200.0/24 --gateway 192.168.200.1 my_net
#查看docker网络
docker network ls
然后我们就可以去选择一个微服务进行构建了,第一次构建可能会很慢,因为要下载依赖,后续就会很快了
第一次失败是因为我git上提交的项目,把父项目文件夹给提交上去了,到时mvn打包找不见pom文件,大家可以忽略,后续就都打包成功了,那后续我们只需要将代码更新到git上,然后根据情况去进行微服务构建即可
测试
查看docker容器
docker ps
测试接口
小结
如何使用docker + jenkins一键式部署springcloud项目教程就到这里完成了,毕竟每个人的服务器环境都不一样,或多或少会有一个坑,如果大家有问题或者需要帮助的可以加我qq或者评论区留言.网上关于这jenkins集成微服务的教程还是很少的,大多数都是集成springboot.