Jenkins自动化部署docker

Jenkins自动化部署docker和普通方式构建

docker外挂目录

  1. 准备测试服务器docker环境
  2. 准备jdk环境
  3. 将上传jar包修改为app.jar
  4. 对外暴露1000端口
  5. 启动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项目,两种方式

  1. 普通构建方式
  2. 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 LastSuccessful 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><prestyle="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): <ahref="${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/dockerfilecd /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/dockerfilecd /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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/622093.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MobaXterm连接服务器步骤

双击该软件 选择Session 点击SSH 填写服务器的IP地址、服务器的用户名称、Port这个端口号一般都是这个&#xff0c;但有些可能例外&#xff0c;自己注意一下&#xff0c;最后点击OK就行 这个五角星点击一下&#xff0c;就可以看到您自己刚才的配置。 鼠标左键双击&…

第 12 章 多路查找树

文章目录 12.1 二叉树与B 树12.1.1 二叉树的问题分析12.1.2 多叉树12.1.3 B 树的基本介绍 12.2 2-3 树12.2.1 2-3 树是最简单的 B 树结构, 具有如下特点:12.2.2 2-3 树应用案例12.2.3 其它说明 12.3 B 树、B树和 B*树12.3.1 B 树的介绍12.3.2 B 树的介绍12.3.3 B树的介绍12.3.4…

深入理解 Spark(四)Spark 内存管理模型

Spark 中的内存管理和资源管理模型 Executor 进程作为一个 JVM 进程&#xff0c;其内存管理建立在 JVM 的内存管理之上&#xff0c;整个大致包含两种方式&#xff1a;堆内内存和堆外内存。 一个 Executor 当中的所有 Task 是共享堆内内存的。一个 Work 中的多个 Executor 中的…

如何简单的使用文心一言(高级版)(中国版ChatGPT)

文心一言API高级版使用 一、百度文心一言API(高级版)二、使用步骤1、接口2、请求参数3、请求参数示例4、接口 返回示例5、智能生成API代码 三、 如何获取appKey和uid1、申请appKey:2、获取appKey和uid 四、重要说明 一、百度文心一言API(高级版) 基于百度文心一言语言大模型的…

Elasticsearch 快速入门指南【总结记录】

本文将介绍一些基本概念&#xff0c;帮助您快速入门使用Elasticsearch。 一、概述 ES用来解决什么问题&#xff1f;Elasticsearch是解决海量数据&#xff08;已经存在的数据&#xff09;全文检索的不二只选。 Elasticsearch是一个基于Java语言开发&#xff0c;建立在开源搜索…

「Vue3面试系列」Vue 3.0中Treeshaking特性有哪些?举例说明一下?

文章目录 一、是什么二、如何做Vue2 项目Vue3 项目 三、作用参考文献 一、是什么 Tree shaking 是一种通过清除多余代码方式来优化项目打包体积的技术&#xff0c;专业术语叫 Dead code elimination 简单来讲&#xff0c;就是在保持代码运行结果不变的前提下&#xff0c;去除…

k8s的存储卷(数据卷)

1、存储卷&#xff1a;容器内的目录和宿主机的目录进行挂载 2、容器在系统上的生命周期是短暂的&#xff0c;delete&#xff0c;k8s用控制器创建的pod&#xff0c;delete相当于重启&#xff0c;容器的状态也会恢复到初始状态&#xff0c;一旦回到初始状态&#xff0c;所有的后…

SpringBoot从数据库读取数据数据源配置信息,动态切换数据源

准备多个数据库 首先准备多个数据库&#xff0c;主库smiling-datasource&#xff0c;其它库test1、test2、test3 接下来&#xff0c;我们在主库smiling-datasource中&#xff0c;创建表databasesource&#xff0c;用于存储多数据源相关信息。表结构设计如下 创建好表之后&#…

平面光波导_三层均匀平面光波导_射线分析法

平面光波导_三层均匀平面光波导_射线分析法 三层均匀平面光波导&#xff1a; 折射率沿 x x x 方向有变化&#xff0c;沿 y y y、 z z z 方向没有变化三层&#xff1a;芯区( n 1 n_1 n1​) > > > 衬底( n 2 n_2 n2​) ≥ \geq ≥ 包层( n 3 n_3 n3​)包层通常为空…

Docker容器进入的4种方式(推荐最后一种)

在使用Docker创建了容器之后&#xff0c;大家比较关心的就是如何进入该容器了&#xff0c;其实进入Docker容器有好几多种方式&#xff0c;这里我们就讲一下常用的几种进入Docker容器的方法。 进入Docker容器比较常见的几种做法如下&#xff1a; 使用docker attach使用SSH使用…

【已解决】C语言实现多线程检索数据

本博文源于笔者正在学习的c语言。学习如何用多线程进行检索数据。这里以检索一个数组的数据为例&#xff0c;给出代码&#xff0c;并分析如何进行线程通信&#xff0c;如果检索到&#xff0c;其余就别检索了。 文章目录 问题来源问题解决方案代码实现效果总结 问题来源 想要用…

这可能是最全面的Java集合面试八股文了

内容摘自我的学习网站&#xff1a;topjavaer.cn 常见的集合有哪些&#xff1f; Java集合类主要由两个接口Collection和Map派生出来的&#xff0c;Collection有三个子接口&#xff1a;List、Set、Queue。 Java集合框架图如下&#xff1a; List代表了有序可重复集合&#xff0c…

【VSCode,Python】一劳永逸的成功导入本地模组,PYTHONPATH的修改,与各种踩坑点

【VSCode&#xff0c;Python】一劳永逸的成功导入本地模组&#xff0c;PYTHONPATH的修改 起因查阅发现做法一 &#xff08;推荐做&#xff09;做法二 &#xff08;推荐必做&#xff09;踩坑点&#xff08;必看&#xff09; 起因 文件目录如下&#xff1a; my_project/ |-- pa…

【26 预处理详解】

目录 预定义符号#define定义常量#define定义宏带有副作用的宏参数宏替换的规则宏函数的对比#和##命名约定#undef命令行定义条件编译头文件的包含其他预处理指令 1. 预定义符号 c语言设置了一些预定义符号&#xff0c;可以直接使用&#xff0c;预定义符号也是在预处理期间处理…

LeetCode-1672/1572/54/73

1.最富有客户的资产总量&#xff08;1672&#xff09; 题目描述&#xff1a; 给你一个 m x n 的整数网格 accounts &#xff0c;其中 accounts[i][j] 是第 i​​​​​​​​​​​​ 位客户在第 j 家银行托管的资产数量。返回最富有客户所拥有的 资产总量 。 客户的 资产总…

Python自动化测试框架【生成测试报告】

如何才能让用例自动运行完之后&#xff0c;生成一张直观可看易懂的测试报告呢&#xff1f; 小编使用的是unittest的一个扩展HTMLTestRunner 环境准备 使用之前&#xff0c;我们需要下载HTMLTestRunner.py文件 点击HTMLTestRunner后进入的是一个写满代码的网页&#xff0c;小…

如何正确使用数据库读写分离

背景 在应用系统发展的初期&#xff0c;我们并不知道以后会发展成什么样的规模&#xff0c;所以一开始不会考虑复杂的系统架构&#xff0c;复杂的系统架构费时费力&#xff0c;开发周期长&#xff0c;与系统发展初期这样的一个定位是不吻合的。所以&#xff0c;我们都会采用简…

三菱FX系列PLC定长切割控制(线缆裁切)

三菱PLC绝对定位指令DDRVA实现往复运动控制详细介绍请查看下面文章链接&#xff1a; https://rxxw-control.blog.csdn.net/article/details/135570157https://rxxw-control.blog.csdn.net/article/details/135570157这篇博客我们介绍线缆行业的定长切割控制相关算法。 1、输送…

GSTAE

缺失数据的流量预测:一种多任务学习方法 摘要:基于真实交通数据的交通速度预测是智能交通系统(ITS)中的一个经典问题。大多数现有的交通速度预测模型都是基于交通数据完整或具有罕见缺失值的假设而提出的。然而,由于各种人为和自然因素,在现实场景中收集的此类数据往往是…

MySQl Mybatis

一、MySQL 1.1 概述 1.1.1 MySQL安装 1.1.2 数据模型 1.1.3 SQL简介 1.2 DDL 1.2.1 数据库操作 1.2.2 图形化工具 1.2.3 表结构操作 &#xff08;一&#xff09;创建 &#xff08;二&#xff09;数据类型 &#xff08;1&#xff09;数值类型 age tinyint unsigned——加上…