本文旨在帮助读者梳理如何从0开始利用Jenkins构建Maven项目(微服务)的自动发布任务
本文目录如下:
以下内容来源于:Jenkins安装并部署Java项目完整流程
首先是在本地安装三个jenkins自动配置相关的工具
由于我们使用docker来启动jenkins,其自带有jdk,因此不需要再下载JDK,查看其容器携带的config.v2.json可发现,jdk路径为:
/opt/java/openjdk
同JDK一致,docker容器中的jenkins自带有git,其路径为
/usr/bin/git
个人的Maven安装目录是/usr/bin/maven
mkdir /usr/bin/maven
cd /usr/bin/maven
wget http://mirror.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
tar xzvf apache-maven-3.6.3-bin.tar.gz
安装好后,处理一下settings.xml,配置国内镜像源:
vim /usr/bin/maven/apache-maven-3.6.3/conf/settings.xml
在内填充如下内容:
<mirror>
<id>aliyunmavenid>
<mirrorOf>*mirrorOf>
<name>阿里云公共仓库name>
<url>https://maven.aliyun.com/repository/publicurl>
mirror>
设置一下本地仓库地址,这里最好设置在maven安装目录下,以保证docker容器映射后,本地仓库可查,我的设置如下:
<localRepository>/usr/bin/maven/apache-maven-3.6.3/repolocalRepository>
最后配置环境变量,保证mvn可查:
vim /etc/profile
在末尾填充:
export M2_HOME=/usr/bin/maven/apache-maven-3.6.3
PATH=$M2_HOME/bin:$PATH
然后执行source /etc/profile
,mvn -v
能显示版本即配置成功
我们使用Docker快速安装Jenkins,需要注意的是,在docker hub直接搜索Jenkins,出来的最新版也只有2.4.0版本,其界面如下所示:
该版本是不友好的,由于其没有携带Localization Chinese插件,因此无法自动进行插件的安装与更新
使用以下命令在linux中安装最新版本的jenkins:
docker run \
-d --name jenkins -p 8081:8080 -p 50000:50000 \
-v /var/jenkins_home:/var/jenkins_home \
-v /usr/bin/maven/apache-maven-3.6.3:/usr/bin/maven/apache-maven-3.6.3 \
--restart=always \
jenkins/jenkins:2.404
-v /usr/bin/maven/apache-maven-3.6.3:/usr/bin/maven/apache-maven-3.6.3 这一句必须要保持一致:
使用以下命令允许jenkins可以访问映射路径/var/jenkins_home和/usr/bin/maven:
groupadd jenkins
useradd jenkins -g jenkins
chown -R jenkins:jenkins /var/jenkins_home
chown -R jenkins:jenkins /usr/bin/maven
安装成功后,访问服务器的8081端口即可进入jenkins登录页面,登录后的新版本界面应如下所示:
本部分参考文献:Jenkins常用插件汇总以及简单介绍原创
下面给出我在使用过程中认为必装的插件列表:
其他的插件选择性安装,安装插件的位置:系统管理–>系统配置–>插件管理–>Available Plugins
安装好后,新建任务时,你应该可以选择Maven任务,配置任务时,在源码配置部分你应该可以增加Git远程仓库,在全局设置管理你应该可以设置远程服务器连接
jenkins自动构建并发布Maven项目的流程梳理:
/var/jenkins_home/workspace/[project_name]
根据流程,我们可梳理出各个流程中需要配置的重要参数:
生成项目时,在Git的Credentials处点击添加以配置
在全局工具配置中,将第一部分安装好的maven路径配置过来(由于已经在生成容器时映射了该路径,因此该路径下的文件可查)
首先是配置maven配置文件路径:
然后配置maven路径:
由此,我们保证了jenkins调用mvn时,以下内容可查(均为映射路径):
此处顺带配置一下JDK和Git的地址,如第一部分所给出的:
jdk: /opt/java/openjdk
git: /usr/bin/git
在系统配置下,找到Publish over SSH
配置项,配置服务器的Name(自定义,如aliyun), Hostname(主机地址,如192.168.0.1),Username(用户名,如root),在高级配置中选择使用密码验证,并在Password输出密码。配置好后应如下图所示:
此时,在使用SSH发送指令时,即可指定该远程服务器(这也是在不同服务器部署不同微服务容器的基础)
以下内容来源于:Docker开启远程安全访问
简单总结一下步骤:
vim /usr/lib/systemd/system/docker.service
-H tcp://[Jenkins部署地址]:2375 --insecure-registry [Jenkins部署地址]:5000
,前者开放docker远程访问,允许Jenkins以tcp请求访问2375端口,后者允许Jenkins以http请求访问私服(必须注意docker远程连接一定不能允许任一ip访问,也就是写成0.0.0.0,否则将造成严重的服务器风险)systemctl daemon-reload && systemctl restart docker
运行成功后即配置成功
这里有一个特殊的示例,如果你准备在同一台服务器部署jenkins,并利用该台服务器创建私服并启动微服务,那么,这里的[Jenkins部署地址]可以直接填docker的虚拟网关172.17.0.1
以上就是建立项目前需要做好的配置工作,接下来我将以一个微服务部署的例子介绍如何编写自动部署项目的流程
以黑马程序员的学成在线项目为实例,挑选了其中五个微服务进行部署,分别是:system, gateway, auth, content, media(其余的则是打包时的依赖),项目结构如下
其中,system,content,media采用api–>service–>model三层架构,最终在父工程中打包并以api生成微服务,如下图所示:
正如之前所述,Pre Step要完成以下工作:
docker stop junxianghui-gateway
docker rm junxianghui-gateway
docker exec registry rm -rf /var/lib/registry/docker/registry/v2/repositories/junxianghui-gateway
docker stop junxianghui-user
docker rm junxianghui-user
docker exec registry rm -rf /var/lib/registry/docker/registry/v2/repositories/junxianghui-user
docker stop junxianghui-log
docker rm junxianghui-log
docker exec registry rm -rf /var/lib/registry/docker/registry/v2/repositories/junxianghui-log
docker stop junxianghui-pay
docker rm junxianghui-pay
docker exec registry rm -rf /var/lib/registry/docker/registry/v2/repositories/junxianghui-pay
docker stop junxianghui-cashback
docker rm junxianghui-cashback
docker exec registry rm -rf /var/lib/registry/docker/registry/v2/repositories/junxianghui-cashback
docker exec registry bin/registry garbage-collect /etc/docker/registry/config.yml
其中,命令行
docker exec registry rm -rf /var/lib/registry/docker/registry/v2/repositories/junxianghui-gateway
是为了清理私服的镜像目录
命令行
docker exec registry bin/registry garbage-collect /etc/docker/registry/config.yml
是为了清理私服的镜像文件,二者缺一不可,否则均会导致镜像无法更新
这里我们建议在宿主机中通过.sh文件的方式批量执行上述命令,放在jenkins中执行上述命令可能会导致服务器内存爆炸(亲身经历)
<build>
<finalName>${project.artifactId}-${project.version}finalName>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<version>${spring-boot.version}version>
<executions>
<execution>
<goals>
<goal>repackagegoal>
goals>
execution>
executions>
plugin>
<plugin>
<groupId>com.spotifygroupId>
<artifactId>docker-maven-pluginartifactId>
<version>1.2.2version>
<configuration>
<imageName>[请填入你的docker私服ip,示例:172.17.0.1]:5000/${project.artifactId}:${project.version}imageName>
<baseImage>java:8u20baseImage>
<maintainer>docker_maven [email protected]maintainer>
<workdir>/rootworkdir>
<cmd>["java", "-version"]cmd>
<dockerHost>http://[请填入你的docker私服ip,示例:172.17.0.1]:2375dockerHost>
<entryPoint>["java", "-Dfile.encoding=utf-8","-jar", "/root/${project.build.finalName}.jar"]entryPoint>
<pushImage>truepushImage>
<registryUrl>[请填入你的docker私服ip,示例:172.17.0.1]:5000registryUrl>
<resources>
<resource>
<targetPath>/roottargetPath>
<directory>${project.build.directory}directory>
<include>${project.build.finalName}.jarinclude>
resource>
resources>
configuration>
plugin>
plugins>
build>
至此,Pre Step已为我们准备好docker容器运行的镜像
Build只需要设置root pom即可,具体该设计的目的此处不明
Post Step只需通过SSH远程向服务器发送运行docker容器的命令即可
运行命令整理如下:
docker run -p 63070:63070 --name xuecheng-plus-auth -idt 172.21.74.125:5000/xuecheng-plus-auth:0.0.1-SNAPSHOT
docker run -p 63010:63010 --name xuecheng-plus-gateway -idt 172.21.74.125:5000/xuecheng-plus-gateway:0.0.1-SNAPSHOT
docker run -p 63110:63110 --name xuecheng-plus-system -idt 172.21.74.125:5000/xuecheng-plus-system-api:0.0.1-SNAPSHOT
docker run -p 63040:63040 --name xuecheng-plus-content -idt 172.21.74.125:5000/xuecheng-plus-content-api:0.0.1-SNAPSHOT
docker run -p 63050:63050 --name xuecheng-plus-media -idt 172.21.74.125:5000/xuecheng-plus-media-api:0.0.1-SNAPSHOT
本文从0开始,一步步介绍了如何利用Jenkins来构建Maven项目(微服务)并自动发布,其中有很多的细节需要读者耐心阅读,如有疑问欢迎留言!
最后,SSH远程指令的形式将是未来进行多机微服务部署的基础与关键,其为jenkins提供了丰富多彩的操作远程服务器的支持,需要读者花费精力去领悟它!