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依赖

<!--jbcrypt--><dependency>    <groupId>org.mindrot</groupId>    <artifactId>jbcrypt</artifactId>    <version>0.4</version></dependency>
  • 密文生成

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中<artifactId>值一致,因为我们所有的变量名都用的这一个,取值的时候可以直接根据 $JOB_NAME 取到值。

#  设置构建参数

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:80: 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 目录下。

写在最后

好了,本文到此就结束了,你们会了吗,是不是迫不及待的想照着步骤试一下了呢。

-------------------------------------------------------------------------------------------------------------------------

扫码二维码关注我的公众号,获取更多精彩

猜你喜欢

转载自blog.csdn.net/HXNLYW/article/details/108002931