使用docker安装jenkins并实现自动发布springboot+maven多模块war包(码云)
1.安装docker
按照菜鸟教程装就行了:https://www.runoob.com/docker/centos-docker-install.html,
还有docker镜像加速也要配上,否则下载镜像速度会很慢
2.安装jenkins镜像并启动容器
2.1 进入docker hub搜索jenkins,选择第一个镜像,但是这个镜像其实是已经过时的jenkins镜像,我们需要点击jenkins/jenkins:lts
2.2 拉取镜像,这两个镜像都可以,但是文档里面是用的第一种,所以我们就用docker pull jenkins/jenkins:lts拉取镜像
2.3 启动容器
点击上图的documentation进入文档说明:
会发现这里有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项目
4.2 gitee插件
因为我用的码云托管代码,所以需要下载gitee插件
4.3 Publish Over SSH
该插件可以将war包项目发送至服务器
5. 安装全局工具
5.1 安装maven工具
5.1.1 手动安装,自定义maven位置
1. 先去官网手动下载maven(含有bin的tar.gz的压缩包),然后解压,将解压后的文件夹放在你指定的主机挂载目录:
冒号前面的是主机地址,冒号后面的是容器里面的地址,所以这里就是放在/usr/local/jenkins/jenkins_home目录下。
如果你用的官网的命令,即:
-v jenkins_home:/var/jenkins_home
那么他映射的主机地址是 /var/lib/docker/volumes/jenkins_home/_data
如果你直接就没使用-v映射,那你就需要自己进jenkins容器里面去搞了。
2.配置mavne:进入系统管理-> 全局工具配置
这两个地方的地址都是使用容器中的地址。
5.1.2 自动安装maven
然后保存
5.2 安装jdk,自动安装即可
6.添加凭据
6.1 登录码云的凭据(username with password类型)
6.2 gitee的api令牌
当你安装了gitee插件,应该就会有这个类型的凭据选项了,然后令牌的获取地址也标出来了,自己获取就可以了
7. 系统配置
7.1 gitee的配置
7.2 Publish over SSH的配置
上面的都不用填,直接点击新增ssh servers.
你会发现没有输密码的地方,所以你需要点击高级,然后就会出现,打上勾,输服务器登录密码即可。最后保存
8. 新建自动发布的项目
8.1 general
8.2 源码管理
8.3 构建触发器和环境,根据自己需求搞,我不需要,所以我没弄触发器
8.4 build
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.
我存放在码云上的项目的目录结构如下:
2.clean install 就是针对root pom所需要执行的maven命令
8.5 发送war包至服务器
通过8.4,我们已经可以自动打包了,那么打包后的war包就存放在/usr/local/jenkins/jenkins_home/workspace/test。现在我们需要将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 文件完成后需要在服务器执行的操作
源码:
#!/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"
然后保存。返回首页,进行构建
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的注释全部去掉,再提交代码到码云上,然后立即构建项目,这次就会成功了,之后就可以正常的提交代码,然后构建了。
上一篇: (学习笔记)机器学习:决策树
下一篇: 机器学习决策树笔记