Jenkins 多分支管道
如果您正在寻找一个基于拉取请求或分支的自动化 Jenkins 持续集成和交付 (CI/CD) 流水线,本指南将帮助您全面了解如何使用 Jenkins 多分支流水线实现它。
Jenkins 的多分支流水线是设计 CI/CD 工作流的最佳方式之一,因为它完全基于 git(源代码管理)的流水线即代码。本指南将讨论 Jenkins 多分支流水线设置中涉及的所有关键概念。
多分支流水线是如何工作的?
我将带您了解一个基于 git-flow 的基本构建和部署工作流程,以便更好地理解多分支流水线。本例中提供的分支策略仅供参考。
假设我想要一个 Jenkins 流水线来构建和部署一个应用程序,并满足以下条件。
- 应用程序仓库有两个分支(主分支和开发分支)。
- 开发从开发人员分叉应用程序仓库并在分叉的仓库中创建一个分支开始。开发人员将代码提交到功能分支。代码在本地测试完毕并准备好集成后,他们将从分叉的仓库向主仓库的开发分支提交一个 PR。
- 每当开发人员从分叉仓库的功能分支向开发分支提交 PR 时,Jenkins 流水线都会触发合并源分支和目标分支的操作,然后运行单元测试和静态代码分析。我们称之为 PR 构建。
- 代码通过 PR 构建中的测试后,开发人员或审阅者将 PR 合并到开发分支。
- 代码合并到开发分支后,应该触发一个流水线,该流水线将运行相关测试并将代码部署到相关环境(例如,开发、质量保证等)。
- 当代码准备好发布时,开发人员会从开发分支向主分支提交 PR。这将触发一个 PR 构建流水线,该流水线将合并源分支和目标分支、运行单元测试、执行代码分析、构建工件(Docker 镜像、jar 文件等)、进行漏洞测试等。
- 如果测试通过,PR 将被审核并合并到主分支。
- 合并完成后,Jenkins 应该触发一个构建,该构建将编译代码、创建发布工件并将其部署到暂存环境和预生产环境。
从以上情况可以看出,Jenkins 作业无需手动触发,每当有分支的拉取请求时,流水线都需要自动触发并运行该分支所需的步骤。
此工作流程为工程师构建了良好的反馈循环,避免了依赖 DevOps 团队在非生产环境中进行构建和部署。
开发人员可以在 Github 上查看构建状态,并决定下一步操作。
此工作流程可以通过 Jenkins 多分支流水线轻松实现。
下图展示了上述示例构建过程的多分支流水线工作流程。

多分支流水线的工作原理如下。
- 当开发者从 fork 仓库的功能分支创建 PR 以开发分支时,Github 会向 Jenkins 发送一个包含 PR 信息的 Webhook。
- Jenkins 接收 PR 并找到相关的多分支流水线,然后自动创建 PR 构建流水线。然后,它会按照 Jenkinsfile 中提到的步骤运行作业。在签出 (checkout) 期间,PR 中的源分支和目标分支会被合并。PR 合并将在 Github 上被阻止,直到 Jenkins 返回构建状态(如果已配置 Github 规则集)。
- 构建完成后,Jenkins 会将状态更新为 Github PR。现在,您可以合并代码了。如果您想查看 Jenkins 构建日志,可以在 PR 状态中找到 Jenkins 构建状态和日志链接(如果已配置 Github App forJenkins)
首先,在使用多分支流水线之前,我使用了一个简单的流水线,并结合了 GitHub Webhook。
我遇到的问题是,我团队的项目使用 Git 工作流作为开发分支,当我或我的团队推送或合并 PR 时,Webhook 会向我的 Jenkins 流水线发送请求,无论哪个分支,该请求都会立即启动工作。因此,多分支流水线可以帮助解决这个问题。
多分支流水线 Jenkinsfile
在开始实现之前,让我们先看一下可以在流水线中使用的多分支流水线 Jenkins 示例 Jenkinsfile。
要使多分支流水线正常工作,您需要在 SCM 仓库中拥有 Jenkinsfile。
如果您正在学习/测试,可以使用下面提供的多分支流水线 Jenkinsfile。它包含一个检出阶段和其他虚拟阶段,用于回显消息。
注意:将代理标签 agent-01 替换为您的 Jenkins 代理名称。
pipeline {agent {node {label 'agent-01'}}options {buildDiscarder logRotator( daysToKeepStr: '16', numToKeepStr: '10')}stages {stage('Cleanup Workspace') {steps {cleanWs()sh """echo "Cleaned Up Workspace For Project""""}}stage('Code Checkout') {steps {checkout([$class: 'GitSCM', branches: [[name: '*/main']], userRemoteConfigs: [[url: 'https://github.com/spring-projects/spring-petclinic.git']]])}}stage('Unit Testing') {steps {sh """echo "Running Unit Tests""""}}stage('Code Analysis') {steps {sh """echo "Running Code Analysis""""}}stage('Deploy To Dev & QA') {when {branch 'develop'}steps {sh """echo "Building Artifact for Dev Environment""""sh """echo "Deploying to Dev Environment""""sh """echo "Deploying to QA Environment""""}}stage('Deploy To Staging and Pre-Prod Code') {when {branch 'master'}steps {sh """echo "Building Artifact for Staging and Pre-Prod Environments""""sh """echo "Deploying to Staging Environment""""sh """echo "Deploying to Pre-Prod Environment""""}}}
}
创建多分支流水线
步骤 1:在 Jenkins 主页创建一个“新项目”。

Jenkins 新项目 - 多分支

步骤 2:从选项中选择“多分支流水线”,然后点击“确定”。
步骤 3:点击“添加源”,然后选择 Github。

步骤 4:在“凭据”字段下,选择 Jenkins,并使用您的 Github 用户名和密码创建凭据。

步骤 5:选择已创建的凭据,并提供您的 Github 仓库以验证凭据,如下所示。验证多分支流水线凭据

步骤 6:在“行为”下,选择符合您需求的选项。您可以选择发现仓库中的所有分支,也可以仅发现包含拉取请求的分支。

您可以从“添加”按钮中选择其他行为。
例如,如果您选择不发现代码库中的所有分支,则可以选择正则表达式或通配符方法来发现代码库中的分支,如下所示。

步骤 7:如果您选择为 Jenkinsfile 设置不同的名称,可以在构建配置中指定。
在“脚本路径”选项中,您可以提供所需的名称。请确保 Jenkinsfile 存在于代码库中,并且名称与您在流水线配置中提供的名称相同。

另外,启用“丢弃旧构建”以仅保留所需的构建日志,如下所示。

步骤 8:保存所有作业配置。
Jenkins 会根据我们的配置扫描已配置的 Github 仓库,查找所有分支和 PR 请求。
下图展示了扫描三个分支的作业。由于我尚未发起任何拉取请求,因此 Jenkins 不会创建任何基于分支的流水线。我将演示如何在设置 Webhook 后测试自动创建流水线。
步骤1: 登录github, 找到repo,点击设置,添加webhook,输入你的jenkins 的URL

您应该会在成功的 Webhook 配置上看到一个绿色勾号,如下所示。Jenkins - Github Webhook 交付成功

如果您没有看到绿色勾号或警告标志,请点击 Webhook 链接,向下滚动到“最近交付”,然后点击最后一个 Webhook。您应该能够通过状态代码查看 Webhook 交付失败的原因。

现在,我们已经完成了多分支流水线所需的所有配置。下一步是测试多分支流水线工作流触发器。
测试多分支流水线
我使用的这个仓库有两个分支:main 和 develop。
更新 develop分支中 README 文件的部分内容,并向 main 提交 PR。您也可以从 fork 的仓库中执行此操作。
它会向 Jenkins 发送一个 Webhook,并为提交的 PR 创建流水线并开始构建。
现在,如果您检查 Jenkins,您会在 Jenkins 中找到一个用于 PR 的流水线,如下所示。


如果构建失败,您可以将更改提交到开发分支,只要 PR 处于打开状态,它就会触发 PR 流水线。
我在 Jenkinfile 中添加了一个条件:如果分支是开发分支,则跳过部署阶段;如果是 PR 构建分支,则跳过主分支。您可以在 Jenkins 构建阶段中检查这一点。如果您检查这些阶段,可以清楚地看到跳过的部署阶段,如下所示。
启用拉取请求状态检查
在多分支流水线中,您可以启用状态检查。这意味着 Jenkins 会将结果以状态检查的形式报告给 GitHub。它会显示在 PR 页面上,如下所示。

例如,开发人员可能需要进行以下状态检查。
常见的状态检查可能包括:
- 构建验证
- 单元测试
- 代码风格检查
- 安全扫描
要在 Github PR 中启用这些状态检查,您需要创建一个适用于 Jenkins 的 Github App。
您可以按照 Github App for Jenkins 详细指南进行创建。
然后在多分支流水线配置中,您需要使用 Github App 凭据,而不是用户名和密码。
相关文章:
Jenkins 多分支管道
如果您正在寻找一个基于拉取请求或分支的自动化 Jenkins 持续集成和交付 (CI/CD) 流水线,本指南将帮助您全面了解如何使用 Jenkins 多分支流水线实现它。 Jenkins 的多分支流水线是设计 CI/CD 工作流的最佳方式之一,因为它完全基于 git(源代…...
精益数据分析(9/126):如何筛选创业路上的关键数据指标
精益数据分析(9/126):如何筛选创业路上的关键数据指标 大家好!在创业的漫漫长路中,数据就像一盏明灯,指引着我们前行的方向。但要让这盏灯发挥作用,关键在于找到那些真正有价值的数据指标。今天…...
C语言之图像文件的属性
🌟 嗨,我是LucianaiB! 🌍 总有人间一两风,填我十万八千梦。 🚀 路漫漫其修远兮,吾将上下而求索。 图像文件属性提取系统设计与实现 目录 设计题目设计内容系统分析总体设计详细设计程序实现…...
LeetCode hot 100—分割等和子集
题目 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 示例 示例 1: 输入:nums [1,5,11,5] 输出:true 解释:数组可以分割成 [1, 5, 5] 和 [11] 。…...
高等数学同步测试卷 同济7版 试卷部分 上 做题记录 上册期中同步测试卷 B卷
上册期中同步测试卷 B卷 一、单项选择题(本大题共5小题,每小题3分,总计15分) 1. 2. 3. 4. 5. 由f(2/n), n→∞可知 2/n→0, 即x→0. 二、填空题(本大题共5小题,每小题3分,总计15分) 6. 7. 8. 9. 10. 三、求解下列各题(本大题共5小…...
【算法】快速排序、归并排序(非递归版)
目录 一、快速排序(非递归) 1.原理 2.实现 2.1 stack 2.2 partition(array,left,right) 2.3 pivot - 1 > left 二、归并排序(非递归) 1.原理 2.实现 2.1 gap 2.1.1 i 2*gap 2.1.2 gap * 2 2.1.3 gap < array.…...
python-将文本生成音频
将文本生成音频通常需要结合 文本转语音(TTS,Text-to-Speech) 工具或库来实现,比如 Google TTS (gtts)、Amazon Polly、Microsoft Azure TTS 等。 一、使用 Google TTS (gtts) 将文本生成音频 gtts 是一个简单易用的 Python 库&a…...
[王阳明代数讲义]语言模型核心代码调研
语言模型核心代码调研 基于Consciciteation的才气张量持续思考综述将文本生成建模为才气张量网络扩散过程,实现非自回归推理通过才气张量的群-拓扑流形交叉注意力实现多模态推理,将输入压缩到低维空间持续迭代提出「条件计算提前终止」机制,…...
4月19日记(补)算了和周日一块写了 4月20日日记
周六啊 昨天晚上又玩的太嗨了。睡觉的时候有点晚了,眼睛疼就没写日记。现在补上 实际上现在是20号晚上八点半了。理论上来说应该写今天的日记。 周六上午打比赛啦,和研究生,输了,我是替补没上场。没关系再练一练明天就可以变强…...
trivy开源安全漏洞扫描器——筑梦之路
开源地址:https://github.com/aquasecurity/trivy.git 可扫描的对象 容器镜像文件系统Git存储库(远程)虚拟机镜像Kubernetes 在容器镜像安全方面使用广泛,其他使用相对较少。 能够发现的问题 正在使用的操作系统包和软件依赖项…...
【实战中提升自己】内网安全部署之dot1x部署 本地与集成AD域的主流方式(附带MAC认证)
1 dot1x部署【用户名密码认证,也可以解决私接无线AP等功能】 说明:如果一个网络需要通过用户名认证才能访问内网,而认证失败只能访问外网与服务器,可以部署dot1x功能。它能实现的效果是,当内部用户输入正常的…...
[matlab]南海地形眩晕图代码
[matlab]南海地形眩晕图代码 请ChatGPT帮写个南海地形眩晕图代码 图片 图片 代码 .rtcContent { padding: 30px; } .lineNode {font-size: 12pt; font-family: "Times New Roman", Menlo, Monaco, Consolas, "Courier New", monospace; font-style: n…...
Web安全和渗透测试--day6--sql注入--part 1
场景: win11家庭版,edge浏览器 , sqlin靶场 定义: SQL 注入(SQL Injection)是一种常见的网络安全攻击方式,攻击者通过在 Web 应用程序中输入恶意的 SQL 代码,绕过应用程序的安全机…...
大模型在胆管结石(无胆管炎或胆囊炎)预测及治疗方案制定中的应用研究
目录 一、引言 1.1 研究背景与意义 1.2 研究目的 1.3 国内外研究现状 二、胆管结石相关理论基础 2.1 胆管结石概述 2.2 临床表现与诊断方法 2.3 传统治疗方法 三、大模型技术原理与应用优势 3.1 大模型基本原理 3.2 在医疗领域的应用潜力 3.3 用于胆管结石预测的可…...
MIT6.S081-lab4
MIT6.S081-lab4 注:本篇lab的前置知识在《MIT6.S081-lab3前置》 1. RISC-V assembly 第一个问题 Which registers contain arguments to functions? For example, which register holds 13 in main’s call to printf? 我们先来看看main干了什么: …...
精通 Spring Cache + Redis:避坑指南与最佳实践
Spring Cache 以其优雅的注解方式,极大地简化了 Java 应用中缓存逻辑的实现。结合高性能的内存数据库 Redis,我们可以轻松构建出响应迅速、扩展性强的应用程序。然而,在享受便捷的同时,一些常见的“坑”和被忽视的最佳实践可能会悄…...
[SpringBoot]快速入门搭建springboot
默认有spring基础,不会一行代码一行代码那么细致地讲。 SpringBoot的作用 Spring Boot是为了简化Spring应用的创建、运行、调试、部署等而出现的。就像我们整个SSM框架时,就常常会碰到版本导致包名对不上、Bean非法参数类型的一系列问题(原出…...
理解.NET Core中的配置Configuration
什么是配置 .NET中的配置,本质上就是key-value键值对,并且key和value都是字符串类型。 在.NET中提供了多种配置提供程序来对不同的配置进行读取、写入、重载等操作,这里我们以为.NET 的源码项目为例,来看下.NET中的配置主要是有…...
C++面试八股文:智能指针
一、了解哪些智能指针? 回答:智能指针是用于管理动态分配的内存,行为类似于指针,但又具有自动管理内存的能力,所以称为智能指针。 首先说一下 auto_ptr和unique_ptr,它们都是独占式指针,同一时…...
nohup命令使用说明
文章目录 如何在后台运行程序呢?如何正常运行代码重定向呢?nohup: ignoring input 如何在后台运行程序呢? 使用nohup命令即可, nohup python dataset/ReferESpatialDataset.py >>dataset_20250417.log 2>&1 &n…...
MYSQL “Too Many Connections“ 错误解决
1.查询当前连接数 show status like "Threads_connected"; 2.查询数据库最大连接数 show variables like "max_connections" 3.查询所有活动连接 show processlist; 4.根据查询结果观察是否有长时间未被释放的连接 参数解释 : 字段说明id连接的唯一…...
Linux `init 6` 相关命令的完整使用指南
Linux init 6 相关命令的完整使用指南—目录 一、init 系统简介二、init 6 的含义与作用三、不同 Init 系统下的 init 6 行为1. SysVinit(如 CentOS 6、Debian 7)2. systemd(如 CentOS 7、Ubuntu 16.04)3. Upstart(如 …...
【外研在线-注册/登录安全分析报告】
前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…...
【NLP 63、大模型应用 —— Agent】
人与人最大的差距就是勇气和执行力,也是唯一的差距 —— 25.4.16 一、Agent 相关工作 二、Agent 特点 核心特征: 1.专有场景(针对某个垂直领域) 2.保留记忆(以一个特定顺序做一些特定任务,记忆当前任务的前…...
React 打包
路由懒加载 原本的加载方式 #使用lazy()函数声明的路由页面 使用Suspense组件进行加载 使用CDN优化...
2025.4.14-2025.4.20学习周报
目录 摘要Abstract1. 文献阅读1.1 模型架构1.2 实验分析1.3 代码实践 总结 摘要 在本周阅读的论文中,作者提出了一种名为MGSFformer的空气质量预测模型。模型通过残差去冗余模块可以有效解耦多粒度数据间的信息重叠;时空注意力模块采用并行建模策略&…...
Spring 微服务解决了单体架构的哪些痛点?
1. 部署困难 (Deployment Difficulty & Risk) 单体痛点: 整体部署: 对单体应用的任何微小修改(哪怕只是一行代码),都需要重新构建、测试和部署整个庞大的应用程序。部署频率低: 由于部署过程复杂且风险高,发布周期通常很长&a…...
【1】云原生,kubernetes 与 Docker 的关系
Kubernetes?K8s? Kubernetes经常被写作K8s。其中的数字8替代了K和s中的8个字母——这一点倒是方便了发推,也方便了像我这样懒惰的人。 什么是云原生? 云原生: 它是一种构建和运行应用程序的方法,它包含&am…...
Kubernetes控制平面组件:APIServer 限流机制详解
云原生学习路线导航页(持续更新中) kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计(一)Kubernetes架构原则和对象设计(二)Kubernetes架构原则和对象设计(三)Kubernetes控…...
springboot全局异常捕获处理
一、需求 实际项目中,经常抛出各种异常,不能直接抛出异常给前端,这样用户体验相当不好,用户看不懂你的Exception,对于一些sql异常,直接抛到页面上也不安全。所以有没有好的办法解决这些问题呢,当然有了&am…...
