Jenkins Pipline流水线
提到 CI 工具,首先想到的就是“CI 界”的大佬--]enkjns,虽然在云原生爆发的年代,蹦出来了很多云原生的 CI 工具,但是都不足以撼动 Jenkins 的地位。在企业中对于持续集成、持续部署的需求非常多,并且也会经常有-些比较复杂的需求,此时新生的 CI 工具不足以支撑这些很复杂的需求。但是 Jenkins丰富的插件基本上可以满足任何场景。
一、流水线概念
1.什么是流水线
Jenkins 流水线是一套插件,它支持在 Jenkins 中实现和集成持续交付流水线(continuousDeliveryPipeline)。流水线提供了一组可扩展的工具,用于通过 Pipeline Dsl(DomainSpecific Language)将简单到复杂的交付流水线以代码的形势展现,类似于基础设施即代码。
持续交付流水线会经历一个复杂的过程:从版本控制、向用户和客户提交软件、软件的每次变更(提交代码到仓库)到软件发布(Release)。这个过程包括以一种可靠并可重复的方式构建软件,以及通过多个测试和部署阶段来开发构建好的软件(称为 Build)。
Jenkins 流水线的定义被写在一个文本文件中(一般为 Jenkinshle),该文件“定制”了整个构建软件的过程。Jenkinsfile 也可以被提交到项目的代码仓库中,在 Jenkjns 中可以直接引用。将持续交付流水线作为应用程序的一部分,像其他代码一样进行版本化和审查,这是流水线即代码的基础。
创建 Jenkinsfile 并提交到代码仓库中的好处如下:
- 自动为所有分支创建流水线构建过程。
- 在流水线上进行代码复查/迭代。
- 对流水线进行审计跟踪。
- 流水线的代码可以被项目的多个成员查看和编辑。
- 可以对 Jenkinsfile 进行版本控制。
2.Jenkins 流水线组成
Jenkins 流水线主要分为声明式分和脚本式两种,包含 pipline(流水线)、node(节点)、stage(阶段)、step(步骤)等区块。
(1)pipeline
pipeline 是用户定义的一个持续交付(CD)流水线模型。流水线的代码定义了整个构建过程,包括构建、测试和交付应用程序的阶段。另外,pipeline 块是声明式流水线语法的关键部分。
(2)node
node 是一个机器,它是 Jenkins 环境的-部分,另外,node 块是脚本化流水线语法的关键部分。
(3)stage
stage 块定义了在整个流水线的执行任务中概念不同的子集(比如 Bujld、Test、Deploy 阶段)它被许多插件用于可视化 Jenkins 流水线当前的状态/进展。
(4)step
本质上是指通过一个单一的任务告诉 Jenkins 在特定的时间点需要做什么,比如要执行 shel1 命令,可以使用 Sh SHELL_COMMAND。其运行流程如下图所示:
从上文可以了解,Jenkins 流水线分为脚本式和声明式,而声明式是“新一代”的流水线,比脚本式更加灵活,可读性更强,并且声明式流水线支持以图形化的方式进行编辑,所以声明式流水线是着重学习的对象。
3.创建一个简单的流水线
(1)创建Pipeline项目
(2)选择模板
在流水线的定义中选择“Pipline script",模板使用“Hello World"
(3)生成代码
- agent:用于声明流水线的执行环境
- stages:代表整个流水线的所有执行阶段。通常 stages 只有1个,里面包含多个 stage
- stage:代表流水线中的某个阶段,可能出现n个。一般分为拉取代码,编译构建,部署等阶段。
- steps:代表一个阶段内需要执行的逻辑。steps 里面是 shell脚本,git 拉取代码,ssh 远程发布等任意内容。
(4)修改模板代码
编写一个简单声明式 Pipeline:
pipeline {agent anystages {stage('拉取代码') {steps {echo '拉取代码'}}stage('编译构建') {steps {echo '编译构建'}}stage('项目部署') {steps {echo '项目部署'}}}
}
(5)保存后点击构建
可以看到阶段视图
二、pipeline代码生成器
1.设备清单
2.实验环境设置
(1)在web01 主机上安装 httpd
[root@localhost ~]# hostnamectl set-hostname web01
[root@localhost ~]# bash
[root@web01 ~]# yum -y install httpd
[root@web01 ~]# setenforce 0
[root@web01 ~]# systemctl stop firewalld
[root@web01 ~]# systemctl start httpd
(2)在Jenkins 中添加 SSH server
“Manage Jenkins”-->“system”,添加“Publish over SSH”,
点击 SSH Servers 的新增按钮,添加一个 SSH 的主机。参数如下图所示,并保存设置
2.添加 gitlab 项目
(1)导入项目
导入 gitee 中的项目:https://gitee.com/kgc-wjq/qqmusic.git
(2)复制仓库 URL
复制出该项目的 URL:http://192.168.10.105/root/qqmusic.git
3.编辑pipeline 代码
(1)修改配置
进入刚才创建的 pipeline 项目,点击“配置”选项
(2)在流水线页面点击“流水线语法”
(3)生成拉取代码
在片段生成器中选择示例步骤为“git:Git”并填写仓库 URL
将生成的代码复制出来,填写在第一个阶段的 steps 中,如下所示。
(4)生成项目部署代码
设置参数如下:
在片段生成器中的示例步骤中选择“step:General Build step”
Build Step 选择“Send build artifacts over SSH”
SSH Server 部分的Name:web1
Transfer set 部分的“Source files”填写“**/*”
Remote directory填写“//var/www/html"
点击“生成流水线脚本”,将得到的代码填写到项目部署部分的 steps 中,如下所示:
(5)此部分完整pipeline 代码
4.部署项目
(1)将代码填写到流水线代码区域
(2)保存后点击构建按钮
通过阶段视图观察构建流程和结果。
(3)浏览器查看构建结果
5.也可以将 pipeline 放在 git 仓库
(1)创建一个文件“Jenkinsfile”,将刚在的 pipline 代码填写到此文件
注意:Jenkinsfile 首字母要大写
(2)将这个文件上传到代码仓库的根目录下
(3)设置流水线
在定义中选择“Pipline script from ScM”,SCM 使用“Git”,填写好仓库 URL,然后保存。
备注:SCM 叫做源代码控制。
(4)点击构建按钮,查看结果
三、pipeline 语法说明
1.声明式 pipeline
声明式 Pipeline 是最近添加到 Jenkins 流水线的,它在流水线子系统之上提供了一种更简单,更有主见的语法。所有的声明式 Pipeline 都必须包含一个 pipeline 块中,比如:
pipeline {
//run
}
在声明式 Pipeline 中的基本语句和表达式遵循 Groovy 的语法。但是有以下例外:
- 流水线顶层必须是一个块,特别是 pipeline{}。
- 不需要分号作为分割符,是按照行分割的。
- 语句块只能由阶段、指令、步骤、赋值语句组成。例如:input 被视为 input()。
(1)agent(代理)
agent 指定了流水线的执行节点。
参数:
any 在任何可用的节点上执行 pipeline。
none 没有指定 agent 的时候默认。
label 在指定标签上的节点上运行 Pipeline。
node 允许额外的选项。
这两种是一样的
agent { node { label 'labelname' }}
aget { label'labelname '}
(2)post
根据流水线或阶段的完成情况而运行(取决于流水线中post 部分的位置)。 post 支持以下post-condition 块中的其中之-:always,changed,failure,success,unstable,和 aborted.这些条件块允许在 post 部分的步骤的执行取决于流水线或阶段的完成状态。
always 无论流水线或者阶段的完成状态。
changed 只有当流水线或者阶段完成状态与之前不同时。
failure 只有当流水线或者阶段状态为”failure”运行。
success 只有当流水线或者阶段状态为”success”运行。
unstable 只有当流水线或者阶段状态为”unstable”运行。例如:测试失败。
aborted 只有当流水线或者阶段状态为”aborted“运行。例如:手动取消。
代码举例:
(3)stages(阶段)
包含一系列一个或多个 stage 指令,建议 stages 至少包含一个 stage 指令用于连续交付过程的每个离散部分,比如构建,测试,和部署。
pipeline {agent anystages {stage('Example') {steps {echo 'Hello World'}}}}
(4)steps(步骤)
step 是每个阶段中要执行的每个步骤。
四、pipeline构建Maven项目
1.设备清单
2.环境设置
(1)生成密钥对并将公钥同步到 web 主机
[root@jenkins ~]# ssh-keygen
[root@jenkins ~]# ssh-copy-id 192.168.10.101
(2)在 gitlab 中导入 maven 项目
导入项目:https://gitee.com/kgc-wjq/mall.git
(3)修改项目 pom 文件代码
在本案例中,需要让 jenkins 对 maven 项目制作镜像,退推送到 harbor,因此,需要修改 pom 文件,将 docker 主机的地址修改为 jenkins 自己的地址,这样就可以在 jenkins 主机上生成镜像了。需要提前在 jenkins 主机上安装 docker 环境。
(4)复制该项目的 gitlab 仓库 URL
将仓库 URL 复制出来:
http://192.168.10.105/root/mall.git
(5)设置 docker 环境的私有仓库地址
jenkins 主机打包好的镜像需要推送到 Harbor,远程 docker 主机需要拉取此镜像,因此,需要在所有的 Docker 主机上设置好私有经常仓库。
vim /etc/docker/daemon.json
{
"registry-mirrors":["http://registry.docker-cn.com"l,
"exec-opts":[native.cgroupdriver=systemd"],
"insecure-registries":["192.168.10.106"]
}
[root@mall ~]# systemctl daemon-reload
[root@mall ~]# systemctl restart docker
3.生成 pipline 代码
(1)在jenkins 中创建一个 pipline 项目,名称为“mall”
(2)生成拉取代码
在片段生成器中选择示例步骤为“git:Git”并填写仓库 URL
将生成的代码填写到 steps 区域,如下所示:
stage('拉取代码'){steps {git 'http://192.168.10.105/root/mall.git'}
}
(3)编辑maven 构建代码
(4)生成项目部署代码
设置参数如下:
在片段生成器中的示例步骤中选择“sshPublisher:Send build artifacts over SSH”
SSH Server 部分的Name:mall
Transfer Set 部分的“Source files”填写“tartget/dist/*.tar.gz其他为空
点击“生成流水脚本”,生成项目部署部分的代码,代码如下:
stage('项目部署'){
steps {
sshPublisher(publishers:sshPublisherDesc(configName:'mal1transfers:sshTransfer(cleanRemote:false,excludes:execCommand :execTimeout:120000flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator:,+',remoteDirectory:'',remoteDirectorySDF:false,removePrefix:'',sourceFiles:tartget/dist/*.tar.gz')],false,usePromotionTimestamp:useWorkspaceInPromotion:false,verbose:false)])
echo'项目部署结束'
}
}
(5)编写推送镜像代码
此部分代码的作用是利用 jenkins 登录 harbor,并将生成的镜像 push 到 harbor 上,注意需要提前在 harbor 主机上创建一个名称为“kubernetes”的项目,用于接收镜像。
(6)编写脚本同步与执行代码
利用 jenkins 将容器的启动脚本推送到远程 docker 主机,注意需要在 jenkins 和 docker 主机设置ssh 免密环境。
4.编辑容器启动脚本
在 jenkins 主机的 root 家目录下创建一个目录“mall-sh-harbor”将编写的容器启动脚本放置在此目录中。
(1)编辑mall-admin 启动脚本
vim /root/mall-sh-harbor/mall-admin.sh
#!/usr/bin/env bash
image name='192.168.10.106/kubernetes/mal1-admin:1.0-SNAPSHOT
docker push ${image name}
app_name='mall-admin
docker stop ${app_name}
echo'----stop container----'
docker rm ${app name}
echo'----rm container----'
docker rmi`docker imagesgrep noneawk '{print $3}
echo'----rm none images---'
docker run -p8080:8080--name ${app_name}
--link mysql:db
-e TZ="Asia/Shanghai"
-v /etc/localtime:/etc/localtime
-v /mydata/app/${app_name}/logs:/var/logs
-d ${image name}
echo '----start container----'
(2)编辑mall-search.sh 启动脚本
(3)编辑mall-portal 启动脚本
5.运行pipeline
(1)将编辑好的pipeline 代码填写到流水线中
(2)保存后点击构建并查看阶段视图
(3)查看 docker 主机的容器运行状态
(4)查看mall 商城后台管理系统
http://192.168.10.101:8080/swagger-ui/
相关文章:

Jenkins Pipline流水线
提到 CI 工具,首先想到的就是“CI 界”的大佬--]enkjns,虽然在云原生爆发的年代,蹦出来了很多云原生的 CI 工具,但是都不足以撼动 Jenkins 的地位。在企业中对于持续集成、持续部署的需求非常多,并且也会经常有-些比较复杂的需求,此时新生的 CI 工具不足以支撑这些很…...

鸿蒙harmonyos next flutter混合开发之开发FFI plugin
创建FFI plugin summation,默认创建的FFI plugin是求两个数的和 flutter create --templateplugin_ffi summation --platformsandroid,ios,ohos 创建my_application flutter create --org com.example my_application 在my_application项目中文件pubspec.yaml引…...
oracle数据库安装和配置
Oracle数据库安装 一、安装前的准备 系统要求: 硬件:内存至少1GB(推荐2GB以上),硬盘至少10GB的可用空间,CPU至少2核心。 操作系统:支持Oracle版本的Windows(如Windows 10或更高版本…...
猫玖破密啦
题目: 终究还是猫哥:3d5a3a0cfff7fb2e29194c0b7a89f284ff19a8 玖离:收到消息Oh,what_is_the_flag 玖离:7468655f666c61675f69735f666c13556d2cf2faec1e2d0f330b7dcceea1c62cb2 终究还是猫哥:收到消息************************************ 已…...
SpringBoot框架:服装生产管理的现代化工具
摘 要 本协力服装厂服装生产管理系统设计目标是实现协力服装厂服装生产的信息化管理,提高管理效率,使得协力服装厂服装生产管理作规范化、科学化、高效化。 本文重点阐述了协力服装厂服装生产管理系统的开发过程,以实际运用为开发背景&#…...

Android Preference的使用以及解析
简单使用 values.arrays.xml <?xml version"1.0" encoding"utf-8"?> <resources><string-array name"list_entries"><item>Option 1</item><item>Option 2</item><item>Option 3</item&…...

HCIP——GRE和MGRE
目录 VPN GRE GRE环境的搭建 GRE的报文结构 GRE封装和解封装报文的过程 GRE配置编辑 R1 R2 GRE实验编辑 MGRE 原理 MGRE的配置 R1 R2 R3 R4 查看映射表 抓包 MGRE环境下的RIP网络 综合练习编辑 VPN 说到GRE,我们先来说个大…...

微信小程序——音乐播放器
一、界面设计 播放页面: 显示当前播放歌曲的封面图片、歌曲名称、歌手名称。有播放 / 暂停按钮、上一首、下一首按钮。进度条显示播放进度,可以拖动进度条调整播放位置。音量调节滑块。 歌曲列表页面: 展示歌曲列表,包括歌曲名称、…...

OceanBase 4.x 部署实践:如何从单机扩展至分布式部署
OceanBase 4.x 版本支持2种部署模式:单机部署与分布式部署,同时支持从单机平滑扩展至分布式架构。这样,可以有效解决小型业务向大型业务转型时面临的扩展难题,降低了机器资源的成本。 以下将详述如何通过命令行,实现集…...

大数据新视界 --大数据大厂之TeZ 大数据计算框架实战:高效处理大规模数据
💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...
docker详解介绍+基础操作 (三)
1.docker 存储引擎 Overlay: 一种Union FS文件系统,Linux 内核3.18后支持 Overlay2:Overlay的升级版,docker的默认存储引擎,需要磁盘分区支持d-type功能,因此需要系统磁盘的额外支持。 关于 d-type 传送…...

【大语言模型-论文精读】谷歌-BERT:用于语言理解的预训练深度双向Transformers
【大语言模型-论文精读】谷歌-BERT:用于语言理解的预训练深度双向Transformers 目录 文章目录 【大语言模型-论文精读】谷歌-BERT:用于语言理解的预训练深度双向Transformers目录0. 引言1. 简介2 相关工作2.1 基于特征的无监督方法2.2 无监督微调方法2.3…...

【Java】集合中单列集合详解(一):Collection与List
目录 引言 一、Collection接口 1.1 主要方法 1.1.1 添加元素 1.1.2 删除元素 1.1.3 清空元素 1.1.4 判断元素是否存在 1.1.5 判断是否为空 1.1.6 求取元素个数 1.2 遍历方法 1.2.1 迭代器遍历 1.2.2 增强for遍历 1.2.3 Lambda表达式遍历 1.2.4 应用场景 二、…...

【Fine-Tuning】大模型微调理论及方法, PytorchHuggingFace微调实战
Fine-Tuning: 大模型微调理论及方法, Pytorch&HuggingFace微调实战 文章目录 Fine-Tuning: 大模型微调理论及方法, Pytorch&HuggingFace微调实战1. 什么是微调(1) 为什么要进行微调(2) 经典简单例子:情感分析任务背景微调 (3) 为什么微调work, 理论解释下 2…...

清华系“仓颉”来袭:图形起源:用AI颠覆字体设计,推动大模型商业化落地
大模型如何落地?又该如何实现商业化?这一议题已成为今年科技领域的焦点话题。 在一个鲜为人知的字体设计赛道上,清华创业公司“图形起源”悄然实现了商业变现:他们帮助字体公司将成本降低了80%,生产速度提升了10倍以上…...
分布式一致性协议的深度解析:Paxos与Raft
分布式系统的复杂性源于节点失效、网络分区、消息丢失等诸多不确定性。在这种背景下,分布式一致性问题应运而生,成为解决这些问题的核心。本文将从理论到实践,深入探讨两种经典的一致性协议:Paxos与Raft。文章适合有一定分布式系统…...

ai写作,五款软件助你快速写作!
在这个信息爆炸的时代,内容创作成为了连接用户、传递价值的桥梁。然而,面对日益增长的创作需求,如何在保证质量的同时提升效率,成为了每位创作者面临的难题。幸运的是,随着人工智能技术的飞速发展,AI写作软…...
解决JavaScript 数学运算精度丢失的问题
JavaScript 中执行浮点数运算时可能会遇到精度丢失的问题。这通常是因为浮点数的表示遵循IEEE 754标准,而这种表示法只能精确地表示有限的数字。对于大多数程序员来说,这不是一个问题,因为它允许计算机处理超出精度范围之外的数字。然而&…...
mysql学习教程,从入门到精通,SQL窗口函数(38)
1、SQL窗口函数 SQL窗口函数(Window Functions)是一种强大的数据分析工具,它们允许你在结果集的行上执行计算,而不需要将这些行分组到单独的输出行中。窗口函数通常与OVER()子句一起使用,该子句定义了窗口或分区&…...
gbase8s数据库实现黑白名单的几种方案
1、借用操作系统的黑白名单 2、使用数据库 TRUSTED CONTEXT 机制 CREATE TRUSTED CONTEXT tcx1USER rootATTRIBUTES (ADDRESS 172.16.39.162)ATTRIBUTES (ADDRESS 172.16.39.163)ENABLEWITH USE FOR wangyx WITHOUT AUTHENTICATION; 如上创建 可信任上下文对象 tcx1 在 jdb…...

业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...