欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用docker安装jenkins并实现自动发布springboot+maven多模块war包(码云)

程序员文章站 2022-03-30 16:33:15
...

1.安装docker

按照菜鸟教程装就行了:https://www.runoob.com/docker/centos-docker-install.html

还有docker镜像加速也要配上,否则下载镜像速度会很慢

使用docker安装jenkins并实现自动发布springboot+maven多模块war包(码云)

2.安装jenkins镜像并启动容器

2.1 进入docker hub搜索jenkins,选择第一个镜像,但是这个镜像其实是已经过时的jenkins镜像,我们需要点击jenkins/jenkins:lts

使用docker安装jenkins并实现自动发布springboot+maven多模块war包(码云)

2.2 拉取镜像,这两个镜像都可以,但是文档里面是用的第一种,所以我们就用docker pull jenkins/jenkins:lts拉取镜像

使用docker安装jenkins并实现自动发布springboot+maven多模块war包(码云)

2.3 启动容器

点击上图的documentation进入文档说明:

使用docker安装jenkins并实现自动发布springboot+maven多模块war包(码云)

会发现这里有3条启动语句,如果你图方便,直接使用第一个就行,第二个多了-v参数,即挂载目录到本地,第三个又比第二个多了-d参数,即可后台运行。我选择的是第三种,那这里会有两个问题:

第一就像NOTE写的,如果你挂载了目录,但是容器里面的用户并没有权限去访问你的主机,那么这时候启动就会报错,所以需要使用给予你挂载的目录权限,我挂载的本机目录是:/usr/local/jenkins/jenkins_home

chown -R 1000  /usr/local/jenkins/jenkins_home

第二个是端口映射,8080端口一般是会被tomcat占用,所以最好映射主机的其他端口,别忘了映射后还要打开端口

那我的整个命令就是:

docker run -d -v /usr/local/jenkins/jenkins_home:/var/jenkins_home -p 9000:8080 -p 50000:50000 jenkins/jenkins:lts

注意,你一开始run的时候最好不要加-d参数,否则启动报错了你都不知道。

3.访问jenkins

3.1 当你启动容器,并打开对应端口后,就可以直接访问了,访问方式http://ip+端口

3.2 访问成功后,会让你输一次密码,获取密码:

sudo docker exec 2b0f45f1c634 cat /var/jenkins_home/secrets/initialAdminPassword

 

2b0f45f1c634是指容器id,可以通过docker ps查看到。

3.3 配置插件,选择推荐的就行了,如果有实例关闭的问题,就先不安装插件,之后再安装

3.4 插件装完后,就会让你登录admin账号,密码是jenkins的默认密码

4. 下载必要插件

4.1 maven插件

系统管理 -> 插件管理 -> 点击 “可选插件”,找到如下maven插件的版本,直接安装即可。该插件作用是可以在创建新项目时选择创建maven项目

使用docker安装jenkins并实现自动发布springboot+maven多模块war包(码云)

 

 4.2 gitee插件

因为我用的码云托管代码,所以需要下载gitee插件

使用docker安装jenkins并实现自动发布springboot+maven多模块war包(码云)

 4.3 Publish Over SSH

该插件可以将war包项目发送至服务器

5. 安装全局工具

5.1 安装maven工具

5.1.1 手动安装,自定义maven位置

1. 先去官网手动下载maven(含有bin的tar.gz的压缩包),然后解压,将解压后的文件夹放在你指定的主机挂载目录:

使用docker安装jenkins并实现自动发布springboot+maven多模块war包(码云)

冒号前面的是主机地址,冒号后面的是容器里面的地址,所以这里就是放在/usr/local/jenkins/jenkins_home目录下。

如果你用的官网的命令,即:

-v jenkins_home:/var/jenkins_home

那么他映射的主机地址是 /var/lib/docker/volumes/jenkins_home/_data

如果你直接就没使用-v映射,那你就需要自己进jenkins容器里面去搞了。

2.配置mavne:进入系统管理-> 全局工具配置

使用docker安装jenkins并实现自动发布springboot+maven多模块war包(码云)

使用docker安装jenkins并实现自动发布springboot+maven多模块war包(码云)

这两个地方的地址都是使用容器中的地址。

5.1.2 自动安装maven

使用docker安装jenkins并实现自动发布springboot+maven多模块war包(码云)

然后保存

5.2 安装jdk,自动安装即可

使用docker安装jenkins并实现自动发布springboot+maven多模块war包(码云)

6.添加凭据 

使用docker安装jenkins并实现自动发布springboot+maven多模块war包(码云)

6.1 登录码云的凭据(username with password类型)

使用docker安装jenkins并实现自动发布springboot+maven多模块war包(码云)

6.2 gitee的api令牌

使用docker安装jenkins并实现自动发布springboot+maven多模块war包(码云)

当你安装了gitee插件,应该就会有这个类型的凭据选项了,然后令牌的获取地址也标出来了,自己获取就可以了

7. 系统配置

使用docker安装jenkins并实现自动发布springboot+maven多模块war包(码云)

7.1 gitee的配置

使用docker安装jenkins并实现自动发布springboot+maven多模块war包(码云)

7.2 Publish over SSH的配置

使用docker安装jenkins并实现自动发布springboot+maven多模块war包(码云)上面的都不用填,直接点击新增ssh servers.

使用docker安装jenkins并实现自动发布springboot+maven多模块war包(码云)你会发现没有输密码的地方,所以你需要点击高级,然后就会出现,打上勾,输服务器登录密码即可。最后保存

使用docker安装jenkins并实现自动发布springboot+maven多模块war包(码云)

8. 新建自动发布的项目

使用docker安装jenkins并实现自动发布springboot+maven多模块war包(码云)

使用docker安装jenkins并实现自动发布springboot+maven多模块war包(码云)

8.1 general

使用docker安装jenkins并实现自动发布springboot+maven多模块war包(码云)

8.2 源码管理

使用docker安装jenkins并实现自动发布springboot+maven多模块war包(码云)

8.3 构建触发器和环境,根据自己需求搞,我不需要,所以我没弄触发器

使用docker安装jenkins并实现自动发布springboot+maven多模块war包(码云)

8.4 build

使用docker安装jenkins并实现自动发布springboot+maven多模块war包(码云)

1.这里的结构是这样的,首先你在jenkins里面创建了的这个项目,我假设他的名字是test,那么在你挂载的主机目录下的workspace下就会自动创建一个test文件夹,那由于我的主机挂载目录是:/usr/local/jenkins/jenkins_home,那么在/usr/local/jenkins/jenkins_home/workspace 目录下就会存在一个test文件夹,用来存放他从码云上下载的代码。那么这里的root pom的路径就是/usr/local/jenkins/jenkins_home/workspace/test,由于我码云上代码的目录结构pom文件就是在最上级,所以我这里root pom就可以直接写pom.xml.

我存放在码云上的项目的目录结构如下:

使用docker安装jenkins并实现自动发布springboot+maven多模块war包(码云)

2.clean install 就是针对root pom所需要执行的maven命令

8.5 发送war包至服务器

通过8.4,我们已经可以自动打包了,那么打包后的war包就存放在/usr/local/jenkins/jenkins_home/workspace/test。现在我们需要将war包发送到我们服务器。

使用docker安装jenkins并实现自动发布springboot+maven多模块war包(码云)

 Name属性就是我们在全局配置里面配置的那个ssh

source files: 他指向的绝对路径就是/usr/local/jenkins/jenkins_home/workspace/test,由于我的项目是maven多模块的项目,我的api模块才是web项目,所以打包也是打包api模块。即我项目打包完成后,war包是在api/target下的

remove prefix:是指除去除去前面没用的层级,使得发送war包时可以直接发送文件,而不是连着前面没用的api/target层级一起创建

remote directory: 是指要把source files文件发送到服务器的哪个目录。

exec command: 表示在发送source files 文件完成后需要在服务器执行的操作

使用docker安装jenkins并实现自动发布springboot+maven多模块war包(码云)

源码:

#!/bin/bash
BUILD_ID=DONTKILLME

export JAVA_HOME=/usr/java/jdk1.8.0_231
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib
export PATH=$JAVA_HOME/bin:/usr/local/nginx/sbin:/usr/local/mysql/bin:$PATH

tomcatPid=$(lsof -i:8080|tail -1|awk '"$1"!=""{print $2}')
if [ -n "$tomcatPid" ]
then
echo "kill tomcat"
kill -9 "$tomcatPid"
fi
echo "kill tomcat success"

# 将war包放到指定位置

cd /usr/local/tomcat/bin
echo "start tomcat"
./startup.sh
echo "start tomcat success"

 然后保存。返回首页,进行构建

使用docker安装jenkins并实现自动发布springboot+maven多模块war包(码云)

9 会遇到的问题

当你构建一个maven多模块项目,第一次是不会成功的。即你第一次构建test项目会失败,并且报错应该是什么pom文件找不到。第一次install 父pom文件并不会成功。这个你可以在本地自己测试。原因就是你的maven仓库中还没有父pom的结构。当然有些人自己本地测试时发现是可以成功install父pom文件的,那你把你的maven仓库中该项目的所有子模块的打的包全部删除再试下。由于我们jenkins的maven都是刚刚创建的,maven仓库更是啥都没有,所以第一次构建项目肯定会失败的。

本地操作时正确的操作应该是这样的:

1.先去父pom文件中将modules全部注释掉,然后使用maven工具的clean install,这时你会发现install成功了

2.再将modules的注释全部去掉,再执行一次clean install,你就会发现install 成功了

那在jenkins上面是一样的:

1.先去父pom文件中将modules全部注释掉,然后提交到码云上,然后立即构建项目,构建成功后,我们的maven仓库就会有我们项目的父pom结构了。

2.再将modules的注释全部去掉,再提交代码到码云上,然后立即构建项目,这次就会成功了,之后就可以正常的提交代码,然后构建了。