保姆级教程,Linux服务器docker搭建jenkins持续集成一键部署SpringBoot项目(Gradle)

前言:

在后台项目开发过程从Java延伸到Kotlin开发,从maven pom到gradle,IDEA新项目SpringBoot init框架官方推荐kotlin+gradle,本章以此为jenkins持续集成做项目部署,服务器为Centos,JDK 17,SpringBoot 3.1.1(JDK 17以下无法运行SpringBoot 3.x)

1.docker安装

docker安装见docker安装教程

2.jenkins安装

在第一步安装完成Docker后,进行以下操作:

2.1 搜索jenkins镜像

[root@VM-0-14-centos /]# docker search jenkins搜索Jenkins镜像

2.2 拉取镜像

[root@VM-0-14-centos /]# docker pull jenkins/jenkins拉取镜像

查看本地是否有刚拉取的jenkins镜像
[root@VM-0-14-centos /]# docker images
image.png

2.3 运行jenkins容器

2.3.1 创建挂载目录并赋予权限

jenkins_home工作目录
[root@VM-0-14-centos /]# mkdir -p docker/jenkins_home && chown -R 1000 /docker/jenkins_home

2.3.2 运行jenkins容器并挂载目录

[root@VM-0-14-centos docker]# docker run -itd --name jenkins -p 8888:8080 -p 50000:50000 --privileged=true -v /usr/bin/docker:/usr/bin/docker -v /docker/jenkins_home:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock jenkins/jenkins
参数详情:
-i:交互式操作
-t:终端
-d:容器后台运行
–name:容器名称
-p:端口映射,将本地8888端口映射到容器内部8080端口,将本地50000端口映射到容器内50000端口,8080端口:jenkins服务器对外URL地址,50000端口:slave节点与jenkins的通讯端口
–privileged=true:赋予容器root权限,便于进入容器
-v:工作目录挂载
此处挂载了三个目录,分别是宿主机的docker及docker套接字,用于在jenkins容器中可以调用宿主机的docker命令,后续可以在jenkins容器中执行已构建好的jar的替换和restart等操作;然后就是jenkins工作目录
结尾的jenkins/jenkins代表镜像名称,也就是上一步骤中拉取的jenkins镜像

2.3.3查看容器运行状态

[root@VM-0-14-centos /]# docker ps
docker容器运行状态

3 配置jenkins

打开浏览器输入http://{server_ip}:8888访问jenkins网页,server_ip为你的服务器ip,本地部署的话,本地ip访问即可
注意:如果是云服务器部署,映射的端口需要外部访问的话,需开启云服务器的对应端口
jenkins主页

查看jenkins密码


1.查看jenkins的容器id
[root@VM-0-14-centos /]# docker ps
jenkins容器id


2.查看jenkins容器日志
[root@VM-0-14-centos /]# docker logs ee68ac1d13c6
jenkins密码
通过日志查看就能获取到jenkins的初始密码了,使用此密码登录jenkins网页即可

3.1 安装推荐的插件

推荐的插件

3.2 根据引导完成初始化即可

image.png
如果点击保存并完成卡住的话,刷新一下浏览器,再填一遍信息,再保存即可!

3.3 开启代理兼容

主页->Manage Jenkins->Security->跨站请求伪造保护
启用代理兼容

3.4 配置JDK

1.进入Jenkins容器(container_id通过docker ps命令查看)
[root@VM-0-14-centos /]# docker exec -it -u root {container_id} /bin/bash
2.进入var目录
root@ee68ac1d13c6:/# cd var
3.下载JDK 17
root@ee68ac1d13c6:/var# wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz
4.解压JDK文件
root@ee68ac1d13c6:/var# tar -xvf jdk-17_linux-x64_bin.tar.gz

配置JDK路径,主页->Manage Jenkins->Tools->JDK 安装
JDK配置

3.5 配置Gradle

因为项目框架是SpringBoot+Kotlin+Gradle,故需与项目一致的Gradle版本来构建任务
主页->Manage Jenkins->Tools->Gradle
image.png

4.创建jenkins任务

4.1 创建任务

创建任务
创建任务

4.2 任务配置

4.2.1 进入任务配置

配置

4.2.2 配置git源码,代码推送到git(这里以Gitee(码云)为例)

这里示例demo项目是在本地创建的一个初始SpringBoot项目(SpringBoot+Kotlin+Gradle),然后代码推到gitee
gitee配置
Gitee凭证配置
Gitee凭证配置
gitee配置

4.2.3 配置构建

配置JDK(构建所需的JDK)
配置JDK

配置构建步骤(Build Steps)
Build Steps
Build Steps

5.构建任务

1.进入任务主页,点击立即构建,然后在下方可以查看构建进度,点击进度可以查看构建详情
2.初次构建,会拉取git源码到工作空间,后续的构建只是更新git代码
3.初次构建的时长比较久(几分钟到十几分钟不等),因为要拉取项目的各种三方包来进行构建,后续构建就非常迅速
构建任务
构建成功


构建成功后可以在工作空间中查看构建完成的jar包

工作空间

6.项目镜像制作

在jenkins容器的工作目录下的项目内创建镜像制作文件Dockerfile
root@ee68ac1d13c6:/# cd /var/jenkins_home/workspace/demo
root@ee68ac1d13c6:/var/jenkins_home/workspace/demo# vim Dockerfile

PS:docker build构建Dockerfile镜像时的上下文仅限Dockerfile所在目录,故需要把Dockerfile文件放置在jenkins容器的根目录或者jenkins工作空间的项目目录内

Dockerfile

# 基础镜像
FROM openjdk:17
# 拷贝已构建好的项目jar到容器目录下,此时的Dockerfile文件在jenkins工作空间的项目目录下
COPY ./build/libs/demo-0.0.1-SNAPSHOT.jar /app.jar
# 执行命令启动jar
ENTRYPOINT ["java","-Xms256m","-Xmx512m","-jar","app.jar"]
# 时区
ENV TZ="Asia/Shanghai"

构建镜像(注意命令结尾有个点)
root@ee68ac1d13c6:/var/demo# docker build -t demo .
参数详情:
-t: 镜像名称
.: 表示Dockerfile文件在当前目录,也可以写绝对路径

镜像构建成功

查看已构建完成的镜像
root@ee68ac1d13c6:/var/jenkins_home/workspace/demo# docker images
镜像列表
运行镜像(因为我们的jenkins容器挂载了宿主机的docker和docker.sock套接字,所以在jenkins容器中运行docker命令和宿主机运行是一样的)
root@ee68ac1d13c6:/var/jenkins_home/workspace/demo# docker run -itd --name demo -p 8000:8080 demo
参数详情:
-i: 交互式操作
-t: 终端
-d: 设置容器在在后台一直运行
-p 8000:8080 端口进行映射,将本地 8000 端口映射到容器内部的 8080 端口(SpringBoot项目默认8080端口,如果项目自定义了端口,就需要更改这里的映射端口)
结尾的demo: 镜像名称


查看容器是否成功运行
root@ee68ac1d13c6:/var/jenkins_home/workspace/demo# docker ps
容器运行状态

浏览器访问 http://{server_ip}:8000/demo
地址后面的demo为demo项目中的测试controller接口
DemoController


访问结果

7.Jenkins持续集成

以上步骤基本完成jenkins的项目部署步骤,但只是初步部署,如果需要自动化流程,那就需要增加后续的构建步骤。
上述流程在完成项目构建后,还需要手动构建镜像、手动启动容器,一旦涉及代码变更后,构建后的手动操作步骤还需要走一遍,这个时候就需要将构建后的后续手动操作转换为自动化,真正实现一键构建及部署更新操作。

上述步骤已经完成了对项目镜像的制作,现在这里可以执行命令将构建好的jar 复制到容器内,再重启容器即可完成部署更新

增加构建步骤,项目主页->配置->Build Steps->增加构建步骤->执行 shell
增加构建步骤


填入shell命令(请不要将注释也一起填进去了)

# 将构建好的jar复制到容器内,更名为app.jar demo为容器别名,也可以使用容器id
docker cp /var/jenkins_home/workspace/demo/build/libs/demo-0.0.1-SNAPSHOT.jar demo:/app.jar
# 重启项目容器
docker restart demo

Shell 命令

验证

修改项目源码(修改后记得推代码QAQ)
修改项目代码


jenkins构建

构建项目
构建结果


验证修改结果,浏览器刷新看看数据是否发生变化 浏览器访问

验证成功,修改的代码已成功更新


jenkins持续集成已大功告成!!!

标签:CentOs、docker、jenkins、SpringBoot、Kotlin、Gradle、JDK17、shell

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++】文件操作(囊括特殊情况:读文件遇到的空格被跳过、“文件只读一次“)

author:&Carlton tag:C topic:【C】文件操作(囊括特殊情况:读文件遇到的空格被跳过、“文件只读一次”) website:黑马程序员C date:2023年7月31日 目录 文本文件 写文件 源…

如何在面试IT公司时展现出色的表现

在面试IT技术岗位的过程中,展现出色的表现是至关重要的。下面我将分享一些我个人的经验和观察,希望对大家有所帮助。 首先,提前准备是非常重要的。在面试前,你应该充分了解目标公司的业务和技术需求。这样你就能更好地回答面试官…

基于Java+SpringBoot+Vue前后端分离电商项目

晚间lucky为友友们送福利啦~🎁 Tips:有需要毕业设计指导的童鞋一定要认真看哦,文末有彩蛋。 一.项目介绍 该电商项目是一个简单、入门级的电商项目,是基于JavaSpringBootVue前后端分离项目。前端采用两套独立的系统分别完成项目…

手机的python怎么运行文件,python在手机上怎么运行

大家好,小编来为大家解答以下问题,手机上的python怎么运行程序,手机的python怎么运行文件,今天让我们一起来看看吧! 1、python程序怎么在手机上运行 python语言应用很广泛,自己也很喜欢使用它,其…

【机器学习】Cost Function for Logistic Regression

Cost Function for Logistic Regression 1. 平方差能否用于逻辑回归?2. 逻辑损失函数loss3. 损失函数cost附录 导入所需的库 import numpy as np %matplotlib widget import matplotlib.pyplot as plt from plt_logistic_loss import plt_logistic_cost, plt_two_…

【自动化剧本】Role角色

目录 一、Roles模块1.1roles的目录结构1.2roles 内各目录含义解释1.3在一个 playbook 中使用 roles 的步骤 二、使用Role编写LNMP剧本2.1 搭建Nginx角色2.2搭建Mysql角色2.3搭建php角色2.4lnmp剧本 一、Roles模块 roles用于层次性、结构化地组织playbook。roles能够根据层次型结…

vue基础-虚拟dom

vue基础-虚拟dom 1、真实dom目标2、虚拟dom目标 1、真实dom目标 在真实的document对象上,渲染到浏览器上显示的标签。 2、虚拟dom目标 本质是保存节点信息、属性和内容的一个JS对象 更新会监听变化的部分 给真实的DOM打补丁

vue 表单form-item模板(编辑,查看,新建)

目录 formatFormData 后端数据格式​编辑 JSON解析和生成 加载(请求前,await后) formComp formatFormData 后端数据格式 为空的,可以直接不提交/提交null/undefined JSON解析和生成 var str {"name": "…

容斥原理 训练笔记

​ 容斥原理 设S是一个有限集&#xff0c;A_1,A_2…A_n是S的n个子集&#xff0c;则 ∣ S − ⋃ i 1 n A i ∣ ∑ i 0 n ( − 1 ) i ∑ 1 ≤ j 1 < j 2 . . . < j i ≤ n ∣ ⋂ k 1 i A j k ∣ |S-\bigcup_{i1}^{n}A_i|\sum_{i0}^{n}(-1)^i\sum_{1\leq j_1< j_2.…

windows如何上架ios应用到app store

Application Uploader iOS App上架工具是一款非常好用的针对iOS苹果应用程序软件开发的实用编程工具&#xff0c;它的主要作用是帮助用户进行快速的程序应用设计和程序应用调试&#xff0c;节省用户进行软件开发耗费的不必要时间&#xff01; ​ 编辑切换为居中 添加图片注释&…

Minecraft 1.20.x Forge模组开发 05.矿石生成

我们本次尝试在主世界生成模组中自定义的矿石 效果演示 效果演示 效果演示 1.由于1.20的版本出现了深板岩层的矿石,我们要在BlockInit类中声明一个矿石的两种岩层形态: BlockInit.java package com.joy187.re8joymod.init;import java.util.function.Function;import java…

数据可视化(5)热力图及箱型图

1.热力图 #基本热力图 #imshow&#xff08;x&#xff09; #x&#xff0c;数据 x[[1,2],[3,4],[5,6],[7,8],[9,10]] plt.imshow(x) plt.show() #使用热力图分析学生的成绩 dfpd.read_excel(学生成绩表.xlsx) #:表示行号 截取数学到英语的列数 xdf.loc[:,"数学":英语].…

操作系统专栏2-文件系统from小林coding

文件系统 文件系统构成虚拟文件系统文件的使用文件的存储连续存储非连续空间存放方式链表方式索引方式 Linux文件的实现方式 空闲分区的管理文件系统结构目录的存储软链接和硬链接 文件系统构成 Linux的设计哲学有一点很重要:一切皆文件,不仅仅是普通的文件和目录,就连块设备,…

六、代理模式

文章目录 一、代理模式1、代理模式的好处和缺点1.1 代理模式理解加深 一、代理模式 为什么要学习代理模式&#xff1f; 代理模式是Spring AOP 以及 Spring MVC 的底层&#xff01;&#xff01;并且还是 JAVA 的23种设计模式之一&#xff01;&#xff01; 代理模式的分类&#…

C++ | 哈希表的实现与unordered_set/unordered_map的封装

目录 前言 一、哈希 1、哈希的概念 2、哈希函数 &#xff08;1&#xff09;直接定址法 &#xff08;2&#xff09;除留余数法 &#xff08;3&#xff09;平方取中法&#xff08;了解&#xff09; &#xff08;4&#xff09;随机数法&#xff08;了解&#xff09; 3、哈…

Nginx解决文件服务器文件名显示不全的问题

Nginx可以搭建Http文件服务器&#xff0c;但默认的搭建会长文件名显示不全&#xff0c;比如如下&#xff1a; 问题&#xff1a;显示不全&#xff0c;出现...&#xff0c;需要进行解决 这里使用重新编绎nginx的方式&#xff0c;见此文&#xff1a; https://unix.stackexchange…

刷题笔记 day4

力扣 611 有效三角形的个数 首先需要知道如何判断 三个数是否能构成三角形。 假如 存在三个数 a < b < c&#xff0c;如果要构成三角形&#xff0c;需要满足&#xff1a; ab > c ; a c > b ; b c > a ; 任意两个数大于第三个数就可构成三角形。 其实不难…

网络编程 IO多路复用 [select版] (TCP网络聊天室)

//head.h 头文件 //TcpGrpSer.c 服务器端 //TcpGrpUsr.c 客户端 select函数 功能&#xff1a;阻塞函数&#xff0c;让内核去监测集合中的文件描述符是否准备就绪&#xff0c;若准备就绪则解除阻塞。 原型&#xff1a; #include <sys/select.…

Codeforces Round 889 (Div. 2)(视频讲解A——D)

文章目录 A Dalton the TeacherB Longest Divisors IntervalC2 Dual (hard Version)D Earn or Unlock Codeforces Round 889 (Div. 2)&#xff08;视频讲解A——D&#xff09; A Dalton the Teacher #include<bits/stdc.h> #define endl \n #define INF 0x3f3f3f3f us…

设计模式大白话——装饰者模式

装饰者模式 文章目录 装饰者模式一、概述二、应用场景三、代码示例四、小结 一、概述 ​ 装饰者模式&#xff0c;此模式最核心之处在于装饰二字&#xff0c;之所以需要装饰&#xff0c;是因为基础的功能无法满足需求&#xff0c;并且装饰是临时的&#xff0c;并不是永久的&…