Jenkins自动发布二,Jenkins+Docker+Maven发布springboot项目

谁借莪1个温暖的怀抱¢ 2022-11-27 07:24 257阅读 0赞

最近我一直在研究Jenkins自动发布,并且动手搭了一套,过程还算崎岖坎坷format_png,所以必须写此文来记录下,Jenkins+Maven+Docker来发布springboot项目的整体过程。正有需要搭建自动化部署的小伙伴有福啦,起码可以少踩几个坑。

format_png 1

虽然大家可能都知道它是个啥,但此时还是要官方的介绍下它format_png 2。Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。下面就开始介绍它的使用。

开始之前,需要先准备好Jenkins必需的环境,由于内容过多,所以专门整理成了一篇文章《Jenkins自动化发布,你需要准备这些》,小伙伴们一定要看哈,不然下面有些内容可能会有不理解,如果你正有搭建自动化部署需求,那就更需要看啦。

Jenkins安装

主机下载安装(我选择的这种方式,坑少点format_png 3

  1. 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

format_png 4

避坑:

如果是自己下载安装的jdk(不是使用yum install -y java命令安装的),需要将安装目录配置到jenkins配置中,编辑/etc/init.d/jenkins文件, 在如下指定位置添加jdk安装地址, 后缀附上/bin/java。否则启动报异常:

  1. Job for jenkins.service failed because the control process exited with error code. See "systemctl status jenkins.service" and "journalctl -xe" for details.

format_png 5

安装好后默认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。

format_png 6

另提供docker安装

  1. 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访问,会出现如下设置管理员密码页面:

format_png 7

管理员密码如页面中提示,在secrets 目录下的initialAdminPassword

# 安装插件

选择安装推荐插件即可。

format_png 8

等待安装结束即可,如果有插件安装失败,也不影响,后面可以在插件中心下载。

format_png 9

# 创建管理员

可以先创建管理员,或者直接以admin登录(密码就是initialAdminPassword中的密码,登陆后最好修改下密码),后面可在用户中心创建用户。

format_png 10

# 实例配置

此处默认即可

format_png 11

到此安装配置结束,我们可以开始愉快的玩耍啦。

format_png 12

format_png 13format_png 13format_png 13

等等,如果忘记密码了该咋办呢?

可以修改users目录下相应用户下的config.xml文件,新密码替换掉如下passwordHash。

format_png 14

密文需要通过代码生成,替换掉上图中的值,具体如下:

  • 增加jbcrypt依赖

    org.mindrot jbcrypt 0.4

  • 密文生成

    public class JenkinsPassUtil {

    1. /*** 明文*/ public static final String GOURD = "gourd"; public static void main(String[] args) {
    2. // 加密 String hashPassword = BCrypt.hashpw(GOURD, BCrypt.gensalt()); System.out.println("生成的密文:"+ hashPassword); // 验证匹配 if (BCrypt.checkpw(GOURD, hashPassword)) {
    3. System.out.println("匹配"); } else {
    4. System.out.println("不匹配"); } }}

发布所需插件安装

在插件安装中心搜索插件安装即可。

format_png 15

# Maven

format_png 16

# 汉化

需要安装两个插件:locale,Localization: Chinese (Simplified)

format_png 17

发布环境配置

# 配置默认语言

Manage Jenkins菜单 -> configure system选项 -> locale> 填写:zh_CN,

如下:

format_png 18

# 配置环境

Manage Jenkins菜单 -> Global Tool Configuration选项 中;

format_png 19

format_png 20

format_png 21

ok,万事俱备只欠发布了。

项目改造

# 项目改造

提供下我的测试项目,简单的springboot项目,含dockerfile文件和shell脚本:

https://gitee.com/gourd-hu/springboot-jenkins-demo.git

看下我的提交记录,就知道过程的艰辛format_png 22(不多说了,再说眼泪就要下来了)。

format_png 23

# pom.xml

在项目pom中增加dockerfile-maven-plugin插件,如果是多模块聚合项目需要在具体模块的pom中增加,如下。镜像地址,可以是阿里云镜像、也可以自己搭建Harbor镜像库,我使用的是自己搭的Harbor。demo项目中的地址可以直接使用,内容就不复制了,项目地址就在上面 ↑ 。

format_png 24

# Dockerfile

在根目录下增加Dockerfile文件。内容如下。

format_png 25

解释:

  • 此处的${WORK_DIR} ,${JAR_FILE} ,${CONTAINER_JAR}是dockerfile-maven-plugin中buildArgs中定义的值。
  • ENTRYPOINT java ${JAVA_OPTS} -jar ${CONTAINER_JAR} 中的动态参数,接收的是启动脚本 docker run -e 的环境参数。

# 启动shell脚本

脚本放到如下bin目录下

format_png 26

创建项目Job

# 创建Job

输入名称,名称尽量和pom中值一致,因为我们所有的变量名都用的这一个,取值的时候可以直接根据 $JOB_NAME 取到值。

format_png 27

format_png 28

# 设置构建参数

server_env此处指支持发布一个环境,如果需要发布多环境,每个环境发布到不同的机器,需要用到插件:Publish Over SSH ,具体使用,大家可以自己研究哈,此处就不做拓展了。

format_png 29

format_png 30

format_png 31

# 设置源码

设置项目的git地址,并设置账号密码凭证,如果是开源项目则无需设置凭证。

分支可以从上面定义的参数取值。

format_png 32

# Maven打包

如果项目是多模块聚合项目,需要把POM调整为,模块名下的pom文件,如下图。

构建命令:

  1. clean package -Dmaven.test.skip=true dockerfile:build dockerfile:tag dockerfile:push

如果不需要推送到镜像库,则无需加:dockerfile:push 。

format_png 33

如果项目没有使用nexus,又是模块项目,那么需要配置两个Maven,一个配置根pom文件,执行 clean package -Dmaven.test.skip=true,一个配置模块下的pom文件,执行 dockerfile:build dockerfile:tag 即可,如下示例:

format_png 34

format_png 35

# 发布脚本

配置脚本位置,并传递参数,将startup.sh、kill_tailf.sh脚本放到服务器上某个位置,此处写绝对路径即可。

format_png 36

脚本中通过$?接收参数,如下:

format_png 37

到此,一个Job就建好啦。

避坑:

给脚本赋权限,否则会报Permission denied错。

  1. 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

  1. 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配置:

  1. vim /etc/docker/daemon.json# 增加如下配置{"insecure-registries":["121.196.57.209:8080"]}# 重启daemonsystemctl daemon-reload

验证发布

下面就来验证下发布,大家是不是很期待,为了效果,我录了一个Gif。如果是第一次发布会比较慢,因为需要全量将代码拉到本地的 /var/lib/jenkins/workspace 目录下。

format_png 38

写在最后

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

-————————————————————————————————————————————————————————————

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

format_png 39

发表评论

表情:
评论列表 (有 0 条评论,257人围观)

还没有评论,来说两句吧...

相关阅读