当前位置: 首页 > news >正文

Jenkins 自动化部署实例讲解,另附安装教程!

【2023】Jenkins入门与安装_jenkins最新版本_丶重明的博客-CSDN博客

也可以结合这个互补看 

前言

你平常在做自己的项目时,是否有过部署项目太麻烦的想法?如果你是单体项目,可能没什么感触,但如果你是微服务项目,相信你应该是有过这种感触的。

这种情况下,我一般会劝你了解一下 Jenkins 这个玩意。怎么了解呢?我会建议你阅读本文 🤡。

本文分为两部分:

  • 第一部分为 Jenkins 安装教程,会教你如何在 Linux 上安装 Jenkins。

  • 第二部分为一个简单的 Jenkins 自动化构建部署实例讲解。

你可以根据自己的意愿,选择性的跳过第一部分,因为第二部分才是重点。(通过目录可以快速翻到第二部分)


当前环境

  • CentOS 7.8

  • Java 11(注意当前 jenkins 支持的 Java 版本最低为 Java11)

  • FinalShell 3.9(操作环境)

安装 Jenkins

PS:不建议使用 Docker 安装 Jenkins,因为使用 Jenkins 的时候一般会调用外部程序,比如 Maven、Docker、JDK、Nodejs 等,所以我们最好直接安装在本机上,以避免不必要的麻烦。

 

1. 添加 Jenkins 源

执行下面两条命令:

sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo --no-check-certificate
sudo rpm --import https://pkg.jenkins.io/redhat/jenkins.io.key因为Jenkins需要JAVA环境,所以安装JAVA环境
sudo yum install java-11-openjdk-devel

 

2. 通过 yum 安装 Jenkins

  • yum -y install jenkins

 

 

 

3. 修改 Jenkins 端口号

  1. Jenkins 默认端口号为 8080,输入vim /etc/sysconfig/jenkins进行编辑,将 JENKINS_PORT 修改为自己想要的端口号,前提得保证修改后的这个端口没有被其他的进程占用。

 

2.这里修改了可能还不能生效,还需要修改另一个地方,输入以下指令进行编辑

vim /usr/lib/systemd/system/jenkins.service
# 找到下面的文字
Environment="JENKINS_PORT=8080" # 修改为自己想要的端口号
# :wq退出

 

  1. 3.修改完成后,重新加载配置文件,随后再重启 Jenkins,此时的启动端口应该已经变成你修改的端口号了。

# 重新加载配置文件
systemctl daemon-reload
# 重启jenkins
systemctl restart jenkins

 

启动 Jenkins

Jenkins 可以单独指定 Java 路径,在/etc/init.d/jenkins文件内大概一百行左右的位置,在最上面加上你的 java 路径即可:

PS:当前 Jenkins 支持的最低 Java 版本为 11,如果机器上只有 Java8 的朋友需要先安装 Java11 或以上版本。Linux 下多版本 Java 建议通过系统自带的 alternatives 来管理,参考这篇文章外加自己琢磨搞定:
linux alternatives 命令详解:
https://www.cnblogs.com/lpfuture/p/4638425.html

  1. 输入service jenkins start,会弹出提示:Starting jenkins (via systemctl):,意思是正在启动,第一次启动比较耗时,此时耐心等待。如果提示超时失败,没关系,jenkins 仍然在启动,只是第一次启动比较耗时。

    如果提示内容不是超时失败,那大概率是你的 Java 没安装好或者版本不对。

  2. 放行刚刚配置的端口

# 放行15369端口
firewall-cmd --zone=public --add-port=15369/tcp --permanent
# 重新加载防火墙
firewall-cmd --reload
# 查看是否已经开启
firewall-cmd --list-ports

如果你是在阿里云腾讯云等类似服务器上的话,那你还需要去控制台防火墙或者安全组开放这个端口,像这样:

 

 

开放端口时记得设置授权 ip,建议你直接给自家 ip 地址授权全部端口号。

  1. 在浏览器输入 ip+port,可以进入到 Jenkins 的初始化界面,第一次启动要等的比较久:

进入这个界面,说明你的 Jenkins 已经在启动中了。

 

 

初始化配置 Jenkins

  1. 系统启动完毕后,系统会提示你查看并输入管理员密码,根据中显示的密码位置,打开该文件并将密码复制粘贴即可:

# 在服务器查看密码文件
cat /var/lib/jenkins/secrets/initialAdminPassword

2、密码输入成功后,进入插件安装界面,如果你是新手,直接使用推荐安装的插件即可:

 

安装过程中可能会出现部分插件安装失败的情况,没关系,全部处理完毕后可以选择重试。

4、安装完毕后,系统会提示你创建第一个管理员账户:

 

 5、配置 Jenkins 访问地址,便于一些插件使用,一般会有默认值:

 

 

6、配置完成,点击开始使用 Jenkins:

 

 

 

随后就进入到 Jenkins 的管理界面了,不同版本的 Jenkins 界面可能会不一样:

 

至此,Jenkins 安装完毕。

扩展

如果你是使用 Jenkins 来对 Java 服务做持续集成的话,那么你还需要安装下面的插件:

  • Maven Integration:Maven 集成管理插件。

  • Docker plugin:Docker 集成插件。

  • Publish Over SSH:远程文件发布插件。

  • SSH: 远程脚本执行插件。

  • GitLab:拉取远程仓库代码插件。

安装插件在系统管理 -> 插件管理里面


实例讲解

接下来,我会拿出我的用户微服务构建任务的实际配置来向你进行解读,当你了解了 Jenkins 自动化构建部署的工作原理后,你便可以很快的上手这个玩意,因为你会发现它是如此的简单。

基本环境

在此之前,我需要介绍一下我的基本环境:

  • 我的操作环境为 Windows,但是我要把微服务部署到一台 Linux 服务器上去,包括 Jenkins 也是安装在这个上面的。

  • 服务器上安装了 Jenkins、Git、Docker、JDK、Maven、NodeJs,都是些拿来构建的东西,都是单独安装的,而不是跑在 Docker 上。

  • 而项目服务都是跑在 Docker 上的,还有 Redis 这种轻量的中间件也跑在 Docker 上。

  • 我的项目已经在 Git 仓库里放好了,放 github 或者 gitee 或者 gitlab 都行。

全局工具配置

在 Jenkins 上,我已经配置好了这些构建工具的路径,以便于 Jenkins 可以直接调用到他们,在系统管理 -> 全局工具配置 这个页面下,这张图有点长:

 

 

在这张图上,你可以看到其中有一部分的配置是有路径的,还有一部分配置是没有路径的,这是因为我把他们的命令路径加到了系统路径上,即使不添加完整路径,Jenkins 也可以调用到它们。

创建任务

好,现在我们已经准备好环境了,可以创建一个任务来试试水了,输入任务名称,然后选择构建一个自由风格的软件项目

别问我在哪新建任务,请你返回首页好好看看:

任务配置

源码管理

现在我们已经进入到任务配置界面了,往下划到源码管理的地方,选择 Git,然后填写仓库地址等信息:

添加 Credentials 的时候,如果你会使用 SSH 密钥的话,建议还是用这个,但你得在机器上进行格外的配置,这里我就不多说了,不会的话直接用账号密码也是可以的:

 

构建步骤(Build Steps)

第一步:调用 Maven

点击增加构建步骤,由于我们是 Maven 管理的项目,需要先使用 Maven 构建,所以第一步就用调用顶层Maven目标

选择 maven 版本,然后 target 根据项目的实际情况编写,我的命令是这样的:

  1. 先构建 jar 包,执行 install 的过程中会先执行 package 的,所以我直接 install。我的项目中单元测试是没怎么梳理的,所以我使用参数-Dmaven.test.skip=true跳过单元测试。

  2. 然后我得打包成 docker 镜像,我使用的是dockerfile-maven-plugin这个 Maven 插件,所以打包 docker 镜像的步骤就也放在 maven 里面了,构建 docker 镜像的信息都在项目的 pom 文件里面。

install -Dmaven.test.skip=true
dockerfile:build -f user-service/user-server/pom.xml

 

构建完镜像了,接下来我们直接使用这个镜像创建容器然后运行就完事了。

第二步:执行 shell 启动容器

再添加一个构建步骤,正常情况下我们调用 docker 通过命令行调用就可以了,所以我们现在也添加一个执行shell的步骤即可。

具体的命令也很简单,就这么几步:

  1. 清理之前的旧镜像。由于我们刚刚构建了一个新的镜像,新镜像和旧镜像的名称和版本我们是没有改的,所以旧的镜像就会自动变成<none>,使用命令docker image prune -f 就可以清理掉这部分镜像。

  2. 停止旧容器运行并删除旧容器。当然我们得先判断一下是否存在旧容器,使用容器名称来进行判断,这部分指令涉及到shelldocker的命令知识,看不懂没关系,可以直接 cv,注意修改容器名称就好。

  3. 调用 docker 启动容器,根据项目实际情况来设定不同的参数,我这里设置了网络模式为 host,并且映射了一个容器卷,用于读取 nacos 的地址,再指定容器名称为user-service,最后指定使用的镜像名称。

大功告成!具体命令如下:

 # 清理镜像
docker image prune -f# 清理容器
if [ -n  "$(docker ps -a -f  name=user-service  --format '{{.ID}}' )" ] then#停止容器运行docker stop $(docker ps -a -f  name=user-service  --format '{{.ID}}' )#删除之前的容器docker rm $(docker ps -a -f  name=user-service  --format '{{.ID}}' )
fi# 启动容器
docker run -d  --net=host  -v scblogs-config:/config -e PARAMS="$params"  --name  user-service  scblogs/user-server

最后别忘了点击保存!

后记

经过上面这些步骤,我不仅安装好了 Jenkins,还完成了一个基本的自动化构建脚本,这个脚本会调用 maven 把我的项目打包,然后构建成一个 docker 镜像,再通过一段 shell 命令去启动这个程序。

如果你想尝试启动这个构建任务的话,你可以回到主页点击右边的绿色符号。

当然,你大概率是会构建失败的 😯。因为我的这份实例讲解并没有完全的讲清楚,甚至里面有很多步骤你都看不懂,是不是?

其实我并没有想写一份手把手的 Jenkins 使用教程,因为这要写的内容实在是太多了,我甚至可以因此写一本小册了!

还记得我在实例讲解的最开始写的吗?写这个构建案例的目的是让你了解 Jenkins 自动化构建的原理,如果你看到这里已经发现了,这自动化构建,其实就跟我们手动构建部署差不多!只不过是把手动操作的东西设定成了脚本,那你就已经有能力去自己摸索它了。

用用插件、写写脚本,就可以搞定自己项目的自动化部署啦。

实际情况是,我有一台服务器专门用于 Jenkins 自动化部署,还有一台服务器专门用于生产环境,这两台服务器都可以连接到外网,也可以互相访问到彼此。这是由于 Jenkins 构建时是会比较吃 CPU 的,为了不影响生产环境,所以我把它们分开了。当然,这种情况下,脚本也会稍微复杂一点,具体流程大概是下面这样的:

 

 

 

 

 

 

相关文章:

Jenkins 自动化部署实例讲解,另附安装教程!

【2023】Jenkins入门与安装_jenkins最新版本_丶重明的博客-CSDN博客 也可以结合这个互补看 前言 你平常在做自己的项目时&#xff0c;是否有过部署项目太麻烦的想法&#xff1f;如果你是单体项目&#xff0c;可能没什么感触&#xff0c;但如果你是微服务项目&#xff0c;相…...

arcgis字段计算器

1、两字段叠加。要求待叠加的字段类型为文本或字符串类型。如下&#xff1a; 2、字符串部分提取。...

数据结构: 线性表(无哨兵位单链表实现)

文章目录 1. 线性表的链式表示: 链表1.1 顺序表的优缺点1.2 链表的概念1.3 链表的优缺点1.4 链表的结构 2. 单链表的定义2.1 单链表的结构体2.2 接口函数 3. 接口函数的实现3.1 动态申请一个结点 (BuySListNode)3.2 单链表打印 (SListPrint)3.3 单链表尾插 (SListPushBack)3.4 …...

Exploring the Underlying Architecture of CSS3

引言 在现代的网页设计中&#xff0c;CSS&#xff08;层叠样式表&#xff09;起着至关重要的作用。CSS3作为最新的CSS标准&#xff0c;引入了许多令人兴奋的功能和特性。但是&#xff0c;要真正理解CSS3的底层架构实现原理&#xff0c;对于前端开发者来说&#xff0c;是非常重…...

方差分析||判断数据是否符合正态分布

方差分析练习题 练习学习笔记&#xff1a; &#xff08;1&#xff09; 标准差和标准偏差、均方差是一个东西。标准误差和标准误是一个东西。这两个东西有区别。 &#xff08;2&#xff09;单因素方差分析&#xff08;MATLAB求解&#xff09; &#xff08;3&#xff09;使用an…...

java linq多字段排序时间比较

public static void main(String[] args) {//100万条数据List<CrmInvestSaleUserCount> waitAssignUserList new ArrayList<>();for (int i 0; i < 1000000; i) {waitAssignUserList.add(new CrmInvestSaleUserCount().setSales_username("test" i…...

【c++】rand()随机函数的应用(二)——舒尔特方格数字的生成

目录 一、舒尔特方格简介 二、如何生成舒尔特方格 &#xff08;一&#xff09;线性同余法 1、利用线性同余法生成随机数序列的规律 (1) 当a和c选取合适的数时&#xff0c;可以生成周期为m的随机数序列 (2) 种子seed取值也是有周期的 2、利用线性同余法生成5阶舒尔特方格…...

“深入剖析JVM内部机制:探索Java虚拟机的运行原理“

标题&#xff1a;深入剖析JVM内部机制&#xff1a;探索Java虚拟机的运行原理 摘要&#xff1a;本文将深入探讨Java虚拟机&#xff08;JVM&#xff09;的内部机制&#xff0c;包括类加载、内存管理、垃圾回收、即时编译等关键概念和原理&#xff0c;帮助开发者更好地理解JVM的运…...

pandas 新增数据列的几种方式

准备数据 将下面的数据存到csv中 ymd,bWendu,yWendu,tianqi,fengxiang,fengli,aqi,aqiInfo,aqiLevel 2018-01-01,3℃,-6℃,晴~多云,东北风,1-2级,59,良,2 2018-01-02,2℃,-5℃,阴~多云,东北风,1-2级,49,优,1 2018-01-03,2℃,-5℃,多云,北风,1-2级,28,优,1 2018-01-04,0℃,-8℃…...

linux_驱动_iic总线获取si7006温湿度

应用层si7006.c #include<stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <sys/ioctl.h> #include <arpa/inet.h>…...

虚拟机网络图标不见了

有3台虚拟机之前正常运行的&#xff0c;有一天打开虚拟机发现2台虚拟机的网络连接图标不见了&#xff0c;也ping不通另外两台。 解决&#xff1a;在终端执行以下命令&#xff0c;即可ping通 [roothadoop103 ~]# sudo nmcli network off [roothadoop103 ~]# sudo nmcli network…...

CTF:信息泄露.(CTFHub靶场环境)

CTF&#xff1a;信息泄露.&#xff08;CTFHub靶场环境&#xff09; “ 信息泄露 ” 是指网站无意间向用户泄露敏感信息&#xff0c;泄露了有关于其他用户的数据&#xff0c;例如&#xff1a;另一个用户名的财务信息&#xff0c;敏感的商业 或 商业数据 &#xff0c;还有一些有…...

Redis学习总结

Redis学习总结 文章目录 Redis学习总结Radis基本介绍docker的安装基本数据结构通用命令字符型key的层次结构Hash类型Listset sortedset集合redis的java客户端jedis的使用jedis连接池的配置 SpringDataRedis自定义redistemplate的序列化与反序列化方式stringtemplate的使用 redi…...

云原生全栈体系(二)

Kubernetes实战入门 第一章 Kubernetes基础概念 一、是什么 我们急需一个大规模容器编排系统kubernetes具有以下特性&#xff1a; 服务发现和负载均衡 Kubernetes 可以使用 DNS 名称或自己的 IP 地址公开容器&#xff0c;如果进入容器的流量很大&#xff0c;Kubernetes 可以负…...

C++设计模式之建造者设计模式

C建造者设计模式 什么是建造者设计模式 建造者设计模式是一种创建型设计模式&#xff0c;它是一种将复杂对象的分解为多个独立部分的模式&#xff0c;以便于构建对象的过程可以被抽象出来并独立变化。 该模式有什么优缺点 优点 灵活性&#xff1a;建造者设计模式允许对象的…...

HDFS Erasure coding-纠删码介绍和原理

HDFS Erasure coding-纠删码介绍和原理 三副本策略弊端Erasure Coding&#xff08;EC&#xff09;简介Reed- Solomon&#xff08;RS&#xff09;码 EC架构 三副本策略弊端 为了提供容错能力&#xff0c;hdfs回根据replication factor&#xff08;复制因子&#xff09;在不同的…...

STM32 DHT11

DHT11 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。 使用单总线通信 该传感器包括一个电容式感湿元件和一个NTC测温元件&#xff0c;并于一个高性能8位单片机相连&#xff08;模数转换&#xff09;。 DHT11引脚说明 开漏模式下没有输出高电平的能…...

词法分析器

词法分析器 在早期编译1.0时代&#xff0c;我们的目标是完成程序语言到机器语言的翻译&#xff0c;所以重点在编译器前端&#xff0c;于是我们花费大量时间研究词法分析、语法分析、语义分析等内容。如今的本科编译原理课程&#xff0c;基本上也就到这一层面吧。 在编译2.0时…...

【Spring】Spring之启动过程源码解析

概述 我们说的Spring启动&#xff0c;就是构造ApplicationContext对象以及调用refresh()方法的过程。 Spring启动过程主要做了这么几件事情&#xff1a; 构造一个BeanFactory对象解析配置类&#xff0c;得到BeanDefinition&#xff0c;并注册到BeanFactory中 解析ComponentS…...

状态模式(State)

状态模式是一种行为设计模式&#xff0c;允许一个对象在其内部状态改变时改变它的行为&#xff0c;使其看起来修改了自身所属的类。其别名为状态对象(Objects for States)。 State is a behavior design pattern that allows an object to change its behavior when its inter…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...

[USACO23FEB] Bakery S

题目描述 Bessie 开了一家面包店! 在她的面包店里&#xff0c;Bessie 有一个烤箱&#xff0c;可以在 t C t_C tC​ 的时间内生产一块饼干或在 t M t_M tM​ 单位时间内生产一块松糕。 ( 1 ≤ t C , t M ≤ 10 9 ) (1 \le t_C,t_M \le 10^9) (1≤tC​,tM​≤109)。由于空间…...

从零开始了解数据采集(二十八)——制造业数字孪生

近年来&#xff0c;我国的工业领域正经历一场前所未有的数字化变革&#xff0c;从“双碳目标”到工业互联网平台的推广&#xff0c;国家政策和市场需求共同推动了制造业的升级。在这场变革中&#xff0c;数字孪生技术成为备受关注的关键工具&#xff0c;它不仅让企业“看见”设…...

【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅!

【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅! 🌱 前言:一棵树的浪漫,从数组开始说起 程序员的世界里,数组是最常见的基本结构之一,几乎每种语言、每种算法都少不了它。可你有没有想过,一组看似“线性排列”的有序数组,竟然可以**“长”成一棵平衡的二…...