Jenkins自动化部署docker和普通方式构建
docker外挂目录
- 准备测试服务器docker环境
- 准备jdk环境
- 将上传jar包修改为
app.jar
- 对外暴露
1000
端口 - 启动jar
FROM openjdk:8-jdk-alpine
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
EXPOSE 1000
ENTRYPOINT ["java","-jar", "/app.jar"]
制作镜像
将上传的镜像先测试,我的jar包叫sky-server-1.0-SNAPSHOT.jar
先将这个做成镜像
docker build --build-arg JAR_FILE=app.jar -t sky .
创建容器
将之前做的镜像运行
docker run -di -p 1000:8080 sky:v1
环境搭建
环境准备
前提需要Jenkins和Gitea这个要提前准备好。
1、配置Jenkins的Maven目录
下载Maven
下载地址在这:https://maven.apache.org/download.cgi
下载二进制文件就行,不要下载源码。
配置maven环境
因为墙的原因,所以部分内容改成国内镜像,还要设置包下载目录
我在公用目录中创建一个新的文件夹,因为那个目录中文件太多了不好操作
[root@bunny jenkins_home]# mkdir plugin
[root@bunny jenkins_home]# cd plugin
[root@bunny plugin]# pwd
/data/jenkins_home/plugin
之后将下载好的Maven拖到这个目录下等会去解压,我下的是版本是3.9.6
解压Maven
解压安装包,并重命名,本来的名字有点长
# 解压
tar -xzf apache-maven-3.9.6-bin.tar.gz
# 重命名
mv apache-maven-3.9.6 maven
配置国内镜像
进入到/data/jenkins_home/plugin/maven/conf/
目录
cd /data/jenkins_home/plugin/maven/conf/
找到settings.xml
编辑
将镜像改为阿里云
<mirror>
<id>alimaven</id>
<name>Aliyun Maven</name>
<url>https://maven.aliyun.com/repository/public</url>
<mirrorOf>central</mirrorOf>
</mirror>
下载目录就放在/data/jenkins_home/plugin/maven/maven_reo
<localRepository>/data/jenkins_home/plugin/maven/maven_reo</localRepository>
全部的配置参考
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.3.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.3.0 https://maven.apache.org/xsd/settings-1.3.0.xsd">
<localRepository>/data/jenkins_home/plugin/maven/maven_reo</localRepository>
<mirrors>
<mirror>
<id>alimaven</id>
<name>Aliyun Maven</name>
<url>https://maven.aliyun.com/repository/public</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
<repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</settings>
安装Jenkins
在配置Jenkins时我将目录映射到了本机和容器中/data/jenkins_home
如果之前你也下载过了,找到对应位置即可
docker run -u root -d --name myjenkins \
-p 8040:8080 -p 50000:50000 \
-v /data/jenkins_home:/var/jenkins_home \
--restart=always jenkinsci/blueocean
配置Jenkins中Maven目录
/data/jenkins_home/plugin/maven/conf/settings.xml
在本机将Maven配置到全局,这个看自己需求,如果之后打算在本机使用Maven就是在docker使用就不用这样了
ln -s /data/jenkins_home/plugin/maven/bin/mvn /usr/local/bin/mvn
因为之前配置的本地环境映射到docker容器中的,当时我们的目录是/data/jenkins_home
但是在docker中是/var/jenkins_home
需要非常的注意!!!需要非常的注意!!!需要非常的注意!!!
之后配置/var/jenkins_home/plugin/maven
目录是这个不是/data
开头的了!!!
验证安装
在本地环境:
ln -s /data/jenkins_home/plugin/maven/bin/mvn /usr/local/bin/mvn mvn --version
在docker环境:
ln -s /var/jenkins_home/plugin/maven/bin/mvn /usr/local/bin/mvn mvn --version
2、配置邮箱发送
点击这个
这里填写你的邮箱
设置Extended E-mail Notification
点击高级,添加用户
密码填写授权码,因为QQ是用授权码的。
之后将授权码填到密码中
点击下拉框选择即可,需要勾选Use SSL
因为QQ是使用SSL
登录的
配置邮件通知,在下面选择发送人的邮箱。
3、安装web钩子
安装web钩子插件,如果后期需要使用git推送时触发,需要安装web钩子
4、安装邮件发送
名称为:Email Extension
实战案例
使用Jenkins部署SpringBoot项目,两种方式
- 普通构建方式
- docker构建方式
这里使用的是gitea托管,使用web钩子的方式,当代码提交时自动打包并运行(使用Jenkins),我的Jenkins和gitea都是装在docker中的。
普通方式构建
环境初始化
将写好的SpringBoot项目自动化部署到Jenkins。
构建Maven项目
添加用户
构建环境建议勾选这个
token可以随便填,按自己需要
之后点击保存
开始构建
先看下是否可以构建成功,成功后再做运行相关操作。
控制台输出,看到这个基本可以放心一半这样了。
构建成功
配置邮件发送相关
邮件模板,在映射目录下也就是本机创建目录,
[root@bunny conf]# mkdir -p /data/jenkins_home/email-templates
[root@bunny conf]# cd /data/jenkins_home/email-templates/
将下面的命名为eamil.html
具体名字你自己定义。
这个模板可以自定义的,这是第一种模板
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志</title>
</head>
<body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4"
offset="0">
<table width="95%" cellpadding="0" cellspacing="0"
style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">
<tr>
<td>(本邮件是程序自动下发的,请勿回复!)</td>
</tr>
<tr>
<td><h2>
<font color="#0000FF">构建结果 - ${BUILD_STATUS}</font>
</h2></td>
</tr>
<tr>
<td><br />
<b><font color="#0B610B">构建信息</font></b>
<hr size="2" width="100%" align="center" /></td>
</tr>
<tr>
<td>
<ul>
<li>项目名称 : ${PROJECT_NAME}</li>
<li>构建编号 : 第${BUILD_NUMBER}次构建</li>
<li>SVN 版本: ${SVN_REVISION}</li>
<li>触发原因: ${CAUSE}</li>
<li>构建日志: <a href="${BUILD_URL}console">${BUILD_URL}console</a></li>
<li>构建 Url : <a href="${BUILD_URL}">${BUILD_URL}</a></li>
<li>工作目录 : <a href="${PROJECT_URL}ws">${PROJECT_URL}ws</a></li>
<li>项目 Url : <a href="${PROJECT_URL}">${PROJECT_URL}</a></li>
</ul>
</td>
</tr>
<tr>
<td><b><font color="#0B610B">Changes Since Last
Successful Build:</font></b>
<hr size="2" width="100%" align="center" /></td>
</tr>
<tr>
<td>
<ul>
<li>历史变更记录 : <a href="${PROJECT_URL}changes">${PROJECT_URL}changes</a></li>
</ul> ${CHANGES_SINCE_LAST_SUCCESS,reverse=true, format="Changes for Build #%n:<br />%c<br />",showPaths=true,changesFormat="<pre>[%a]<br />%m</pre>",pathFormat=" %p"}
</td>
</tr>
<tr>
<td><b>Failed Test Results</b>
<hr size="2" width="100%" align="center" /></td>
</tr>
<tr>
<td><pre
style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">$FAILED_TESTS</pre>
<br /></td>
</tr>
<tr>
<td><b><font color="#0B610B">构建日志 (最后 100行):</font></b>
<hr size="2" width="100%" align="center" /></td>
</tr>
<!-- <tr>
<td>Test Logs (if test has ran): <a
href="${PROJECT_URL}ws/TestResult/archive_logs/Log-Build-${BUILD_NUMBER}.zip">${PROJECT_URL}/ws/TestResult/archive_logs/Log-Build-${BUILD_NUMBER}.zip</a>
<br />
<br />
</td>
</tr> -->
<tr>
<td><textarea cols="80" rows="30" readonly="readonly"
style="font-family: Courier New">${BUILD_LOG, maxLines=100}</textarea>
</td>
</tr>
</table>
</body>
</html>
这是第二种模板
<hr/>(自动化构建邮件,无需回复!)<br/><hr/>
项目名称:$PROJECT_NAME<br/><br/>
项目描述:$JOB_DESCRIPTION<br/><br/>
运行编号:$BUILD_NUMBER<br/><br/>
运行结果:$BUILD_STATUS<br/><br/>
触发原因:${CAUSE}<br/><br/>
构建日志地址:<a href="${BUILD_URL}console">${BUILD_URL}console</a><br/><br/>
构建地址:<a href="$BUILD_URL">$BUILD_URL</a><br/><br/>
详情:${JELLY_SCRIPT,template="html"}<br/>
<hr/>
之后点击测试,名称目录就是你取得到名字,我就不一一测试了。
如果上述觉得这个格式可以将代码可以将这个代码粘贴到邮件发送的这里面
在构建中添加邮件构建
因为上面填写的是HTML模板
在这填写的是这个
当然也可以发送附件,这个附件内容需要在工作空间中的,也就是在这里
为了测试附件我就随便选一个。
设置接受邮件人和回复邮件人,使用逗号分隔,如果选择的html模板发送的在下面还需要勾选Content Type
为html格式。
点击立即构建,会发送邮件
构建成功运行项目
构建完成后执行脚本
查看本地的文件
之后构建完成后执行这个目录的jar包
cd /data/jenkins_home/workspace/sky-take-out/sky-server/target
mkdir -p /data/jenkins_home/workspace/sky-take-out/logs
nohup java -jar app.jar --server.port=1000 > /data/jenkins_home/workspace/sky-take-out/logs/app.log 2>&1 &
需要再全局配置中添加
在gitea中点击设置,添加web钩子
推送失败
解决方式
之后重启gitea
修改 /data/gitea/conf/app.ini 配置文件
[webhook]
ALLOWED_HOST_LIST = 你的IP
可以了
访问页面,可以访问只是路径不对
使用docker方式构建
docker相关指令
停止指定所有容器
docker stop sky
docker rm sky
删除指定所有镜像
docker stop $(docker ps -a | grep "Exited" | awk '{print $1 }') #停止容器
docker rm $(docker ps -a | grep "Exited" | awk '{print $1 }') #删除容器
docker rmi $(docker images | grep "none" | awk '{print $3}') #删除镜像
开始构建
基础步骤
和上面构建方式差不多,只是要在目录下新建dockerfile
在之前的gitea中新增一个钩子
新建一个Maven项目
配置和之前都差不多只是web钩子改成这个sky-take-out-docker
如果还想使用发送邮件配置还是和上面一样。
区别步骤
dockerfile内容
FROM openjdk:8-jdk-alpine
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
EXPOSE 1000
ENTRYPOINT ["java","-jar", "/app.jar"]
构建前操作
因为是使用docker构建需要删除之前的镜像和容器所以在构建时需要添加构建前操作
执行脚本,和上面的一样,因为是在容器中需要向容器外的本机发送指令
docker stop sky_jar
docker rm sky_jar
docker rmi $(docker images | grep "sky" | awk '{print $3}')
cp /data/jenkins_home/workspace/sky-take-out-docker/dockerfile /data/jenkins_home/workspace/sky-take-out-docker/sky-server/target/dockerfile
cd /data/jenkins_home/workspace/sky-take-out-docker/sky-server/target
docker build --build-arg JAR_FILE=app.jar -t sky .
docker run -di -p 2000:8080 --name sky_jar sky
为了和上面的区分将端口改为2000
INT [“java”,“-jar”, “/app.jar”]
##### 构建前操作
因为是使用docker构建需要删除之前的镜像和容器所以在构建时需要添加构建前操作
执行脚本,和上面的一样,因为是在容器中需要向容器外的本机发送指令
```sh
docker stop sky_jar
docker rm sky_jar
docker rmi $(docker images | grep "sky" | awk '{print $3}')
cp /data/jenkins_home/workspace/sky-take-out-docker/dockerfile /data/jenkins_home/workspace/sky-take-out-docker/sky-server/target/dockerfile
cd /data/jenkins_home/workspace/sky-take-out-docker/sky-server/target
docker build --build-arg JAR_FILE=app.jar -t sky .
docker run -di -p 2000:8080 --name sky_jar sky
为了和上面的区分将端口改为2000