Jenkins自动发布二,Jenkins+Docker+Maven发布springboot项目
最近我一直在研究Jenkins自动发布,并且动手搭了一套,过程还算崎岖坎坷,所以必须写此文来记录下,Jenkins+Maven+Docker来发布springboot项目的整体过程。正有需要搭建自动化部署的小伙伴有福啦,起码可以少踩几个坑。
虽然大家可能都知道它是个啥,但此时还是要官方的介绍下它。Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。下面就开始介绍它的使用。
开始之前,需要先准备好Jenkins必需的环境,由于内容过多,所以专门整理成了一篇文章《Jenkins自动化发布,你需要准备这些》,小伙伴们一定要看哈,不然下面有些内容可能会有不理解,如果你正有搭建自动化部署需求,那就更需要看啦。
Jenkins安装
主机下载安装(我选择的这种方式,坑少点)
wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.reporpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.keyyum install -y jenkins --nogpgcheck# 启动、停止、重启service jenkins start/stop/restart
避坑:
如果是自己下载安装的jdk(不是使用yum install -y java命令安装的),需要将安装目录配置到jenkins配置中,编辑/etc/init.d/jenkins文件, 在如下指定位置添加jdk安装地址, 后缀附上/bin/java。否则启动报异常:
Job for jenkins.service failed because the control process exited with error code. See "systemctl status jenkins.service" and "journalctl -xe" for details.
安装好后默认jenkins文件目录如下:
jenkins安装目录:/var/lib/jenkins
jenkins日志目录:/var/log/jenkins/jenkins.log
jenkins配置目录:/etc/sysconfig/jenkins
如果启动失败,需要去/var/log/jenkins/jenkins.log 看具体原因。
一般因为端口占用问题,修改端口(默认8080)即可:修改 /etc/sysconfig/jenkins 的JENKINS_PORT。
另提供docker安装
docker run \--name jenkins-blueocean \-d \-p 8080:8080 \-p 50000:50000 \--restart=always \--privileged=true \-v jenkins-data:/var/jenkins_home \-v /var/run/docker.sock:/var/run/docker.sock \jenkinsci/blueocean
Jenkins配置
# 管理员密码
安装好之后,使用服务器ip+port访问,会出现如下设置管理员密码页面:
管理员密码如页面中提示,在secrets 目录下的initialAdminPassword
# 安装插件
选择安装推荐插件即可。
等待安装结束即可,如果有插件安装失败,也不影响,后面可以在插件中心下载。
# 创建管理员
可以先创建管理员,或者直接以admin登录(密码就是initialAdminPassword中的密码,登陆后最好修改下密码),后面可在用户中心创建用户。
# 实例配置
此处默认即可
到此安装配置结束,我们可以开始愉快的玩耍啦。
等等,如果忘记密码了该咋办呢?
可以修改users目录下相应用户下的config.xml文件,新密码替换掉如下passwordHash。
密文需要通过代码生成,替换掉上图中的值,具体如下:
增加jbcrypt依赖
org.mindrot jbcrypt 0.4 密文生成
public class JenkinsPassUtil {
/*** 明文*/ public static final String GOURD = "gourd"; public static void main(String[] args) {
// 加密 String hashPassword = BCrypt.hashpw(GOURD, BCrypt.gensalt()); System.out.println("生成的密文:"+ hashPassword); // 验证匹配 if (BCrypt.checkpw(GOURD, hashPassword)) {
System.out.println("匹配"); } else {
System.out.println("不匹配"); } }}
发布所需插件安装
在插件安装中心搜索插件安装即可。
# Maven
# 汉化
需要安装两个插件:locale,Localization: Chinese (Simplified)
发布环境配置
# 配置默认语言
Manage Jenkins菜单 -> configure system选项 -> locale> 填写:zh_CN,
如下:
# 配置环境
Manage Jenkins菜单 -> Global Tool Configuration选项 中;
ok,万事俱备只欠发布了。
项目改造
# 项目改造
提供下我的测试项目,简单的springboot项目,含dockerfile文件和shell脚本:
https://gitee.com/gourd-hu/springboot-jenkins-demo.git
看下我的提交记录,就知道过程的艰辛(不多说了,再说眼泪就要下来了)。
# pom.xml
在项目pom中增加dockerfile-maven-plugin插件,如果是多模块聚合项目需要在具体模块的pom中增加,如下。镜像地址,可以是阿里云镜像、也可以自己搭建Harbor镜像库,我使用的是自己搭的Harbor。demo项目中的地址可以直接使用,内容就不复制了,项目地址就在上面 ↑ 。
# Dockerfile
在根目录下增加Dockerfile文件。内容如下。
解释:
- 此处的${WORK_DIR} ,${JAR_FILE} ,${CONTAINER_JAR}是dockerfile-maven-plugin中buildArgs中定义的值。
- ENTRYPOINT java ${JAVA_OPTS} -jar ${CONTAINER_JAR} 中的动态参数,接收的是启动脚本 docker run -e 的环境参数。
# 启动shell脚本
脚本放到如下bin目录下
创建项目Job
# 创建Job
输入名称,名称尽量和pom中
# 设置构建参数
server_env此处指支持发布一个环境,如果需要发布多环境,每个环境发布到不同的机器,需要用到插件:Publish Over SSH ,具体使用,大家可以自己研究哈,此处就不做拓展了。
# 设置源码
设置项目的git地址,并设置账号密码凭证,如果是开源项目则无需设置凭证。
分支可以从上面定义的参数取值。
# Maven打包
如果项目是多模块聚合项目,需要把POM调整为,模块名下的pom文件,如下图。
构建命令:
clean package -Dmaven.test.skip=true dockerfile:build dockerfile:tag dockerfile:push
如果不需要推送到镜像库,则无需加:dockerfile:push 。
如果项目没有使用nexus,又是模块项目,那么需要配置两个Maven,一个配置根pom文件,执行 clean package -Dmaven.test.skip=true,一个配置模块下的pom文件,执行 dockerfile:build dockerfile:tag 即可,如下示例:
# 发布脚本
配置脚本位置,并传递参数,将startup.sh、kill_tailf.sh脚本放到服务器上某个位置,此处写绝对路径即可。
脚本中通过$?接收参数,如下:
到此,一个Job就建好啦。
避坑:
给脚本赋权限,否则会报Permission denied错。
chmod -R 777 /usr/gourd/bin
设置docker访问权限,否则报错:
I/O exception (java.io.IOException) caught when processing request to {}->unix://localhost
Permission denied Caused by: java.util.concurrent.ExecutionException: com.spotify.docker.client.shaded.javax.ws.rs.ProcessingException: java.io.IOException: Permission denied
chmod 7777 /var/run/docker.sock
如果你用了Harbor为镜像库,可能会报错:
Could not push image: Get https://121.196.57.209:8080/v2/: http: server gave HTTP response to HTTPS
需要调整docker配置:
vim /etc/docker/daemon.json# 增加如下配置{"insecure-registries":["121.196.57.209:8080"]}# 重启daemonsystemctl daemon-reload
验证发布
下面就来验证下发布,大家是不是很期待,为了效果,我录了一个Gif。如果是第一次发布会比较慢,因为需要全量将代码拉到本地的 /var/lib/jenkins/workspace 目录下。
写在最后
好了,本文到此就结束了,你们会了吗,是不是迫不及待的想照着步骤试一下了呢。
-————————————————————————————————————————————————————————————
扫码二维码关注我的公众号,获取更多精彩
还没有评论,来说两句吧...