Springboot项目在Jenkins+Docker中实现自动化部署

2023-11-18

一、环境准备

描述本文开发和部署的环境基础

1、项目开发环境

1.操作系统:Windows 7或以上版本
1.开发IDE:IntelliJ IDEA 2017.2.1 x64 或者 Eclipse Jee Oxygen
2.JDK:jdk1.8.0_181或者其他1.8版本以上的jdk
3.maven:maven3.5.3 或其他3.x.x其他版本
4.版本管理:SVN

以上软件和客户端安装这里就不描述了,准备好以上环境我们就可以开发一个简单的springboot项目。

2、Jenkins+docker运行环境

1.操作系统:Centos 7
2.Jenkins : Jenkins ver. 2.138.3
3.Docker : Docker version 18.09.0, build 4d60db4

以下会详细介绍Jenkins 和 Docker 的按照步骤。

二、Docker安装

Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上。
Docker从1.13版本之后采用时间线的方式作为版本号,分为社区版CE和企业版EE。社区版CE是免费的,这里我们安装CE版本的Docker。

通过 uname -r 命令查看你当前的内核版本:

uname -r

在这里插入图片描述

安装一些必要的系统工具:

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

添加软件源信息:

sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

更新 yum 缓存:

sudo yum makecache fast

安装 Docker-ce:

sudo yum -y install docker-ce

启动 Docker 后台服务:

sudo systemctl start docker

测试运行 hello-world:

docker run hello-world

在这里插入图片描述

创建Docker工作空间目录

mkdir -p /home/work/demo

创建备份目录

cd  /home/work/demo
mkdir backup

创建Dockerfile文件

cd /home/work/demo
vi Dockerfile

Dockerfile文件内容如下:

#基于openjdk:8
FROM openjdk:8

ADD demo-0.0.1-SNAPSHOT.jar demo.jar
RUN bash -c 'touch /demo.jar'

ENTRYPOINT ["java","-jar","/demo.jar"]

三、Jenkins安装

  1. 访问Jenkins官方网站:https://jenkins.io/
    点击"Download"在这里插入图片描述
    选择CentOS在这里插入图片描述
    按照官网的描述进行在线安装
    在这里插入图片描述

  2. 启动、关闭、重启jenkins服务:
    sudo service jenkins start/stop/restart

  3. 防火墙设置:
    firewall-cmd –zone=public –add-port=8080/tcp –permanent
    firewall-cmd –zone=public –add-service=http –permanent
    firewall-cmd –reload

  4. 访问jenkins:
    在浏览器中输入http://ip:8080即可
    6.
    根据提示查看/var/lib/jenkins/secrets/initialAdminPassword这个文件,将密码复制出来,粘贴,继续进入配置页面,如下图:
    在这里插入图片描述
    选择推荐的插件进行安装即可

  5. 注册新用户
    在这里插入图片描述
    使用新用户登录之后的页面如下图:
    在这里插入图片描述

  6. 设置用户权限

选择“系统管理”-“全局安全配置”在这里插入图片描述

按照如下图进行配置:将刚刚注册的用户给予最大权限任何用户(Anonymous Users)给予可读权限
在这里插入图片描述

  1. 全局工具配置:

配置maven,使用默认的设置即可。CentOS 安装maven请参照:https://www.cnblogs.com/HendSame-JMZ/p/6122188.html
在这里插入图片描述

在这里插入图片描述

配置JDK,使用CentOS 7中安装的JDK目录,CentOS安装JDK请参照:https://www.cnblogs.com/sxdcgaq8080/p/7492426.html
在这里插入图片描述

配置Docker :
在这里插入图片描述

配置邮件:
在“系统管理”-“系统管理”中找到如下图的配置
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

邮件默认内容如下:

<hr/>
(本邮件是程序自动下发的,请勿回复!)<br/><hr/>
项目名称:$PROJECT_NAME<br/><hr/>
构建编号:$BUILD_NUMBER<br/><hr/>
svn版本号:${SVN_REVISION}<br/><hr/>
构建状态:$BUILD_STATUS<br/><hr/>
触发原因:${CAUSE}<br/><hr/>
构建日志地址:<a href="${BUILD_URL}console">${BUILD_URL}console</a><br/><hr/>
构建地址:<a href="$BUILD_URL">$BUILD_URL</a><br/><hr/>
变更集:${JELLY_SCRIPT,template="html"}<br/><hr/>

四、创建一个Springboot项目

1、使用IDE创建一个简单的springboot项目,用于实现自动编译部署流程。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
一路Next到:
在这里插入图片描述

点击Finish,在pom.xml中加入了webmvc的依赖

	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
	</dependency>

在启动类中加入hello方法

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class DemoApplication {

	public static void main(String[] args) {
    	SpringApplication.run( DemoApplication.class, args );
	}

	@RequestMapping(value = "/hello", method = RequestMethod.GET)
 	public String hello() {
    	return "hello world";
	}
}

2、将项目上传到SVN版本库

通过SVN客户端创建文件夹demo:
在这里插入图片描述
分享项目到SVN:

在这里插入图片描述

添加SVN项目路径:
在这里插入图片描述

选择添加的SVN路径,选择一个默认路径后点击“Share”,分享到SVN后项目中的文件名变成绿色的,此时进行提交操作,将整个项目提交到SVN:

在这里插入图片描述

我们可以看到SVN版本库中代码已经全部提交上来了
在这里插入图片描述

五、Jenkins添加任务

1、新建任务

选择“新建任务”
在这里插入图片描述
输入任务名称,现在“构建一个自由风格的软件项目”点击“确定”
在这里插入图片描述

2、配置任务

General

在这里插入图片描述

源码管理

选择上面项目的SVN版本库路径,增加登陆凭证
在这里插入图片描述
点击“Add”添加SVN版本库登陆凭证
在这里插入图片描述

构建触发器

配置每次 SCM 版本变更,构建
在这里插入图片描述

构建环境

配置每次构建前,删除工作空间
在这里插入图片描述

构建

配置Maven,通过Maven进行构建,编写构建完成执行的Shell脚本:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

Shell 脚本(run.sh):

#操作/项目路径(Dockerfile存放的路劲)
BASE_PATH=/home/work/demo
# 源jar路径  
SOURCE_PATH=/var/lib/jenkins/workspace/demo/target 
#容器id
CID=$(docker ps | grep "demo" | awk '{print $1}')
 
DATE=`date +%Y%m%d%H%M`
 
# 最新构建代码 移动到项目环境
function transfer(){
    echo "最新构建代码 $SOURCE_PATH/demo-0.0.1-SNAPSHOT.jar 迁移至 $BASE_PATH ...."
        sudo cp $SOURCE_PATH/demo-0.0.1-SNAPSHOT.jar $BASE_PATH
    echo "迁移完成"
}
 
# 备份
function backup(){
	if [ -f "$BASE_PATH/demo-0.0.1-SNAPSHOT.jar" ]; then
    	echo "demo-0.0.1-SNAPSHOT.jar 备份..."
        	sudo cp $BASE_PATH/demo-0.0.1-SNAPSHOT.jar $BASE_PATH/backup/demo-$DATE.jar
			sleep 3
			sudo rm -rf $BASE_PATH/demo-0.0.1-SNAPSHOT.jar
        echo "备份 demo-0.0.1-SNAPSHOT.jar 完成"
    else
    	echo "$BASE_PATH/demo-0.0.1-SNAPSHOT.jar不存在,跳过备份"
    fi
}
 
# 构建docker镜像
function build(){
	echo "开始构建镜像..."
	cd $BASE_PATH
	sudo docker build -t demo .
}
 
# 运行docker容器
function run(){
	backup
	transfer
	build
	if [ -n "$CID" ]; then
		echo "存在demo容器,CID=$CID,重启docker容器 ..."
			sudo docker stop $CID
			sudo docker rm $CID	
			sudo docker run -d -p 9120:9120 demo
		echo "demo容器重启完成"
	else
		echo "不存在demo容器,docker run创建容器..."
			sudo docker run -d -p 9120:9120 demo 
		echo "demo容器创建完成"
	fi
}
 
#入口
run 

构建后操作

邮件通知
在这里插入图片描述

在一下红框部分加入想要通知的成员邮箱,多个邮箱以“,”或空格进行分割
在这里插入图片描述

六、自动化构建部署

修改代码,提交SVN

修改返回“hello world”为“hello world1”,提交SVN

	@RequestMapping(value = "/hello", method = RequestMethod.GET)
    public String hello() {
        return "hello world1";
    }

可以看到已经开始构建了
在这里插入图片描述

在服务器Docker工作路径下可以看见赋值过来的jar包
在这里插入图片描述

通过Docker命令可以查看到demo容器已经运行起来啦
在这里插入图片描述
可以看到端口的映射9120,这是我们在Jenkins任务构建配置的Shell脚本中指定的
在这里插入图片描述

现在让我们来访问一下hello接口
在这里插入图片描述

到此 完成

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Springboot项目在Jenkins+Docker中实现自动化部署 的相关文章

  • 设置 SWT Shell 的默认字体

    有没有办法为整个 Shell 设置默认字体 以便任何新控件都将使用相同的字体 看来现在我必须为我创建的每个控件设置字体 这导致了太多的冗余 默认使用的字体由平台选择 请参阅中的其他信息 类字体 SWT 标准小部件工具包 http book
  • 在Java中清空数组/处理

    除了循环遍历数组中的每个元素并将每个元素设置为 null 之外 Java 处理中是否有一个本机函数可以简单地清空数组 或销毁它 以便能够将其重新声明为新数组 There s Arrays fill myArray null 并不是说它执行的
  • 线程“main”java.lang.UnsatisfiedLinkError中出现异常:java.library.path中没有opencv_java249

    我目前正在尝试在我的 32 位笔记本电脑上设置 OpenCV 但我不断收到一条令我困惑的错误消息 Exception in thread main java lang UnsatisfiedLinkError no opencv java2
  • firebase推送通知错误Spring Boot服务器端

    我正在尝试从 Spring Boot 服务器端发送通知到客户端 android 服务器运行良好 一切都很好 2020 09 01 08 13 07 691 INFO 18941 restartedMain e DevToolsPropert
  • 初级 Java 计数器代码

    我的教授希望我这样做 使用下面的 Counter 接口写入多个可互换计数器 public interface Counter Current value of this counter int value Increment this co
  • 如果基于 Spring 注解的控制器位于 jar 文件内,则该控制器无法工作

    我的子模块中有一些基于注释的控制器 这些模块作为 jar 文件部署 jar 文件中基于注释的控制器未加载到 spring 配置中 我使用 Eclipse 中的导出实用程序手动导出 jar 文件 有人遇到过这个问题吗 当您使用 Eclipse
  • 要打乱的键值(整数、字符串)列表的最佳结构

    我需要在 Java 中实现一个结构 它是一个键值列表 类型为整数 字符串 并且我想对其进行洗牌 基本上 我想做类似的事情 public LinkedHashMap
  • 在 Hibernate 中创建 UPDATE RETURNING 查询

    在 Oracle 中 我们可以创建一个更新查询 该查询将使用 RETURNING 子句返回更新的记录 Hibernate中有类似的功能吗 除了数据库生成的值之外 Hibernate 显然不需要返回更新的实例 因为对象传递给Session s
  • 正确使用 JDBC 连接池 (Glassfish)

    我需要在 Java Web 服务中作为会话 bean 实现数据库连接 但我不确定我这样做是否正确 我创建了一个类 public final class SQLUtils private static DataSource m ds null
  • 如何制作无限的jscrollpane?

    我之前已经实现过拖动滚动 但是创建无限滚动窗格的最佳方法是什么 当然不会有任何滚动条 我将实现拖动滚动 我想做的是在无限表面上实现动态加载 EDIT 当然 它实际上不会是无限的 我想问如何伪造它 您可以执行以下操作 AdjustmentCl
  • 不要模拟值对象:过于通用的规则,没有解释

    以下是 Mockito 单元测试框架的引用 不要模拟值对象 为什么有人会想要这样做呢 因为实例化对象太痛苦了 gt 无效 原因 如果创造新的装置太困难 那就是一个迹象 代码可能需要一些认真的重构 另一种方法是创建 价值对象的构建者 有一些工
  • 在 eclipse 之外将 Spring MVC 应用程序部署到 tomcat 的幕后会发生什么?

    我猜想使用像 eclipse 这样很棒的 IDE 的一个缺点是你会忽略应用程序幕后发生的事情 我是一名 Ruby 开发人员 所以不是一名 Java 老手 所以我一直在用 java 编写一个项目 并使用 spring 框架进行 IOC 和 M
  • 为什么现在()? (客观化)

    为什么我想要异步加载 Objectify 实体 异步加载到底意味着什么 根据客观化有关加载的文档 https code google com p objectify appengine wiki BasicOperations Loadin
  • 找不到符号assertEquals

    我正在尝试为计算器编写第一个单元测试 但 NetBeans 说它找不到该符号assertEquals和注释 Test 我应该包括一些东西吗 我正在使用 NetBeans 7 3 1 和 W7 package calculator impor
  • 从命令行运行 Maven 插件的语法是什么。

    我看到这里已经有人问过这个问题 如何从命令行执行maven插件 https stackoverflow com questions 12930656 how to execute maven plugin from command line
  • Selenium - 等待网络流量

    我们将 Selenium 与 Java API 和一些 Javascript 用户扩展一起使用 我们在应用程序中使用了大量 AJAX 调用 我们的许多测试随机失败 因为有时 AJAX 调用完成得比其他时候慢 因此页面未完全加载 我们通过等待
  • Google Cloud Messaging - 立即收到或长时间延迟收到的消息

    我在大学最后一年的项目中使用谷歌云消息传递 一切正常 但我在使用 GCM 时遇到了一些麻烦 通常 消息要么几乎立即传递 要么有很大的延迟 我读过这篇文章 但我真的认为它不适用于这种情况 GCM 通常会在消息发送后立即传送消息 然而 这并不总
  • 方法签名中带或不带synchronized关键字的方法具有相同的字节码

    对于以下 2 个类 获得相同的 Java 字节码 java版本 java 版本 1 8 0 181 Java TM SE 运行时环境 构建 1 8 0 181 b13 Java HotSpot TM 64 位服务器 VM 内部版本 25 1
  • JMockit - 初始化问题

    当我使用以下测试时 我收到警告 警告 JMockit 是按需初始化的 这可能会导致某些测试失败 请检查文档以获取更好的初始化方法 这是我的测试实现 package test import static mockit Mockit impor
  • java.io.EOFException:没有更多可用数据 - 预期结束标记 关闭开始标记

    我正在使用 xmpp 开发一个聊天应用程序 根据我们的要求 我们有三台服务器 Apache Tomcat 7 ejabbered 2 1 11 和 mysql 5 5 to run xmppbot on tomcat used below

随机推荐

  • 设计模式的 C++ 实现---原型模式

    前文回顾 单例模式 一 单例模式 二 观察者模式 简单工厂模式 工厂方法模式 一 工厂方法模式 二 抽象工厂模式 一 抽象工厂模式 二 前言 原型模式指直接用一个已经存在的对象来创建一个新的对象 然后对新对象进行稍微修改即可 类似复制的操作
  • 动手学CV-目标检测入门教程4:模型结构

    3 4 模型结构 本文来自开源组织 DataWhale CV小组创作的目标检测入门教程 对应开源项目 动手学CV Pytorch 的第3章的内容 教程中涉及的代码也可以在项目中找到 后续会持续更新更多的优质内容 欢迎 如果使用我们教程的内容
  • 在单链表中删除指定值的节点

    在单链表中删除指定值的节点 题目 给定一个单链表和一个数val 删除链表中所有值为val的节点 例如 1 gt 2 gt 3 gt 4 删除3 结果为 1 gt 2 gt 4 思路1 用栈 def remove node with val1
  • Java中如何设置注释模板呢?

    转自 Java中如何设置注释模板呢 下文笔者讲述在日常开发IDE工具中设置注释模板的方法分享 如下所示 Eclipse中设置Java注释模板 Eclipse设置注释模板的菜单 Window gt Preference gt Java gt
  • 实时音频编解码之八 频带扩展

    本文谢绝任何形式转载 谢谢 1 4 8 频带扩展 在线性预测应用中 由于极点过于靠近单位圆 合成滤波器可能处于临界稳定的状态 在定点实现中这一问题更加严重 定点的量化和计算中的精度损失可能使得临界稳定的滤波器变得不稳定 极点位于单位圆外 这
  • maven 配置篇 之 settings.xml 整理中...

    maven 配置 settings xml maven2比起maven1 来说 需要配置的文件少多了 主要集中在pom xml和settings xml中 先来说说settings xml settings xml对于maven 来说相 当
  • 【JS】jsx/tsx是什么?为什么 Vue3 的组件库都在使用 jsx/tsx?如何在Vue3中使用 jsx/tsx?

    前几天得到一个疑问 为什么 React 要用 JSX 语法 这样显得代码好像 很耦合 按照传统应推荐 html js css 模版分离 这样设计的优越性到底在哪里 一 jsx是什么 JSX 即 javascript Xml的缩写 是Face
  • Springboot 封装ssh 服务

    前提条件 Linux 已经启动SSH 服务或Windows 启动SSH 服务 整体项目结构 第一步 BuleSky 的pom xml 文件
  • CMake——cmake_minimum_required

    命令简介 cmake minimum required用于设定cmake的最低版本 cmake minimum required VERSION
  • 入门强化学习(Q-learning→DQN→DDQN)

    基础 只要具备CNN分类算法的基本认识 讲解内容 内容主要通过 飞翔小鸟 游戏为例 探究如下2个问题 强化学习原理 以Q learning算法为例 深度强化学习原理 以DQN DDQN算法为例 然后大概讲下DDQN算法 如何在更复杂的解锁任
  • OLED透明屏厚度:引领未来显示技术的革命

    OLED透明屏作为一种未来显示技术 其薄度在整个行业中具有重要意义 在这篇文章中 尼伽将详细介绍OLED透明屏厚度的优势 技术挑战以及应用案例 旨在为读者全面了解OLED透明屏的发展前景 一 OLED透明屏厚度的优势 OLED透明屏采用柔性
  • springboot项目中对文件夹进行监控

    需要的依赖
  • Quartz 基本使用

    Quartz 基本使用 一 Quartz的核心概念 二 Quartz的几个常用API 三 Quartz的使用 四 Quartz核心详解 五 JobListener 六 TriggerListener 七 SchedulerListener
  • 更改:为硬件保留的内存

    电脑 联想thinkbook16P 系统 win11 内存 16G 更改前 2 3G 更改后 827MB 一 关机 不同的型号电脑进入boss模式的按键不同 我的是按F1 自己去找进入boss模式的方式 二 进入boss模式 进入boss模
  • ARM运行可执行文件出现/usr/lib/libstdc++.so.6: version `CXXABI_ARM_1.3.3' not found解决

    1 关于Linux PC上出现这种问题容易解决 直接下载个高版本的libstdc so 6 0 x复制到 usr lib中 软连接一下就好了 ln s libstdc so 6 0 x libstdc so 6 2 但是在ARM板上执行可执
  • 1 映射与函数

    文章目录 集合 集合表示法 区间与领域 两个逻辑量词 映射 函数 函数的图形 反函数 集合 集合表示法 区间与领域 两个逻辑量词 映射 函数 函数的图形 反函数
  • JavaScript一种将数据库记录建立层级关系的处理方法

    JavaScript一种将数据库记录建立层级关系的处理方法 背景 方案 提示 背景 项目开展中 有些数据往往具有层级关系 在数据中用ID Parent来标示 那么在前端如何有效的还原这种层级关系 而其是很多层级的情况 方便的将数据加载的树
  • c#处理3种json数据的实例介绍

    这篇文章主要介绍了c 处理包含数组 对象的复杂json数据的方法 需要的朋友可以参考下 网络中数据传输经常是xml或者json 现在做的一个项目之前调其他系统接口都是返回的xml格式 刚刚遇到一个返回json格式数据的接口 通过例子由易到难
  • Linux安装iptables 替换firewall

    1 查看当前防火墙状态 systemctl status firewalld service 2 关闭防火墙 并查看防火墙状态 systemctl stop firewalld service 停止firewall 3 禁止防火墙开机启动
  • Springboot项目在Jenkins+Docker中实现自动化部署

    Springboot项目在Jenkins Docker中实现自动化部署 一 环境准备 1 项目开发环境 2 Jenkins docker运行环境 二 Docker安装 三 Jenkins安装 四 创建一个Springboot项目 1 使用I