Jenkins 多分支管道

如果您正在寻找一个基于拉取请求或分支的自动化 Jenkins 持续集成和交付 (CI/CD) 流水线,本指南将帮助您全面了解如何使用 Jenkins 多分支流水线实现它。

Jenkins 的多分支流水线是设计 CI/CD 工作流的最佳方式之一,因为它完全基于 git(源代码管理)的流水线即代码。本指南将讨论 Jenkins 多分支流水线设置中涉及的所有关键概念。

多分支流水线是如何工作的?


我将带您了解一个基于 git-flow 的基本构建和部署工作流程,以便更好地理解多分支流水线。本例中提供的分支策略仅供参考。

假设我想要一个 Jenkins 流水线来构建和部署一个应用程序,并满足以下条件。

  1. 应用程序仓库有两个分支(主分支和开发分支)。
  2. 开发从开发人员分叉应用程序仓库并在分叉的仓库中创建一个分支开始。开发人员将代码提交到功能分支。代码在本地测试完毕并准备好集成后,他们将从分叉的仓库向主仓库的开发分支提交一个 PR。
  3. 每当开发人员从分叉仓库的功能分支向开发分支提交 PR 时,Jenkins 流水线都会触发合并源分支和目标分支的操作​​,然后运行单元测试和静态代码分析。我们称之为 PR 构建。
  4. 代码通过 PR 构建中的测试后,开发人员或审阅者将 PR 合并到开发分支。
  5. 代码合并到开发分支后,应该触发一个流水线,该流水线将运行相关测试并将代码部署到相关环境(例如,开发、质量保证等)。
  6. 当代码准备好发布时,开发人员会从开发分支向主分支提交 PR。这将触发一个 PR 构建流水线,该流水线将合并源分支和目标分支、运行单元测试、执行代码分析、构建工件(Docker 镜像、jar 文件等)、进行漏洞测试等。
  7. 如果测试通过,PR 将被审核并合并到主分支。
  8. 合并完成后,Jenkins 应该触发一个构建,该构建将编译代码、创建发布工件并将其部署到暂存环境和预生产环境。

从以上情况可以看出,Jenkins 作业无需手动触发,每当有分支的拉取请求时,流水线都需要自动触发并运行该分支所需的步骤。

此工作流程为工程师构建了良好的反馈循环,避免了依赖 DevOps 团队在非生产环境中进行构建和部署。

开发人员可以在 Github 上查看构建状态,并决定下一步操作。

此工作流程可以通过 Jenkins 多分支流水线轻松实现。

下图展示了上述示例构建过程的多分支流水线工作流程。

多分支流水线的工作原理如下。

  1. 当开发者从 fork 仓库的功能分支创建 PR 以开发分支时,Github 会向 Jenkins 发送一个包含 PR 信息的 Webhook。
  2. Jenkins 接收 PR 并找到相关的多分支流水线,然后自动创建 PR 构建流水线。然后,它会按照 Jenkinsfile 中提到的步骤运行作业。在签出 (checkout) 期间,PR 中的源分支和目标分支会被合并。PR 合并将在 Github 上被阻止,直到 Jenkins 返回构建状态(如果已配置 Github 规则集)。
  3. 构建完成后,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 凭据,而不是用户名和密码。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

跨境电商管理转型:日事清通过目标管理、流程自动化助力智优美科技项目管理升级与目标落地复盘

1.客户背景介绍 深圳市智优美科技有限公司是一家专业从事外贸B2C的电子商务公司,公司总部位于深圳市宝安区,旗下拥有三家子公司。目前销售的品类有:家居用品、电子产品、电子配件产品等,在深圳外贸电商行业销售额稳居行业前10名。…

基于Docker+k8s集群的web应用部署与监控

项目架构图 server ip master 192.168.140.130 node1 192.168.140.131 node2 192.168.140.132 ansible 192.168.140.166 jumpserver 192.168.100.133 firewall 192.168.1.86 nfs 192.168.140.157 harbor 192.168.140.159 Promethethus 192.168.140.130 Jen…

量子计算与经典计算融合:开启计算新时代

一、引言 随着科技的飞速发展,计算技术正迎来一场前所未有的变革。量子计算作为前沿技术,以其强大的并行计算能力和对复杂问题的高效处理能力,吸引了全球科技界的关注。然而,量子计算并非要完全取代经典计算,而是与经典…

【HarmonyOS 5】makeObserved接口详解

【HarmonyOS 5】makeObserved接口详解 一、makeObserved接口是什么? makeObserved 接口(API version 12 起可用)用于将非观察数据转为可观察数据,适用于三方包类、Sendable 装饰的类、JSON.parse 返回的对象、collections.Array…

豆瓣图书数据采集与可视化分析(二)- 豆瓣图书数据清洗与处理

文章目录 前言一、查看数据基本信息二、拆分pub列三、日期列处理四、价格列处理五、出版社列处理六、评价人数列处理七、缺失值处理八、重复数据处理九、异常值处理十、完整代码十一、清洗与处理后的数据集展示 前言 豆瓣作为国内知名的文化社区,拥有庞大且丰富的图…

Wasm -WebAssembly简介

WebAssembly 是什么? WebAssembly/wasm WebAssembly 或者 wasm 是一个可移植、体积小、加载快并且兼容 Web 的全新格式 WebAssembly(简称 Wasm)是一种二进制指令格式,设计用于在现代 Web 浏览器中高效运行程序。它可以被认为是一…

驱动开发硬核特训 · Day 15:电源管理核心知识与实战解析

在嵌入式系统中,电源管理(Power Management)并不是“可选项”,而是实际部署中影响系统稳定性、功耗、安全性的重要一环。今天我们将以 Linux 电源管理框架 为基础,从理论结构、内核架构,再到典型驱动实战&a…

【SpringBoot】99、SpringBoot中整合RabbitMQ实现重试功能

最近在做一个项目,需要使用 MQ 实现重试功能,在这里给各位分享一下。 1、整合 RabbitMQ <!-- rabbitmq消息队列 --> <dependency><groupId>org.springframework.boot</groupId><

AI 中的 CoT 是什么?一文详解思维链

文章目录 CoT 的组成CoT 的作用CoT 的推理结构变体CoT 的特点CoT 的适用场景总结 在人工智能领域&#xff0c;尤其是自然语言处理和机器学习中&#xff0c;有一种名为思维链&#xff08;Chain of Thought&#xff0c;CoT&#xff09;的技术&#xff0c;它正逐渐改变着我们对 AI…

Vue3集成Element Plus完整指南:从安装到主题定制上

一、Element Plus简介 Element Plus是一套基于Vue 3.0的桌面端组件库&#xff0c;由饿了么前端团队开源维护。它提供了丰富的UI组件&#xff0c;能够帮助开发者快速构建企业级中后台产品。 1. 安装与卸载 bash 复制 下载 # 安装最新版本 npm install element-plus -S# 卸…

Java29:Spring MVC

一&#xff1a;Springmvc简介 1.简介&#xff1a; Spring Web MVC 是基于Servlet API构建的原始Web框架&#xff0c;从一开始就包含在Spring Framework中。正式名称“Spring Web MVC” 来自其源模块名称&#xff08;spring-webmvc&#xff09;但它通常被称为“Spring Mvc” …

VLC搭建本机的rtsp直播推流和拉流

媒体---流---捕获设备&#xff0c;选择摄像头&#xff0c;点击串流 x下一步 选择rtsp&#xff0c;点击添加 看到了端口&#xff0c;并设置路径&#xff1a; 选择Video -H 264 mp3(TS) 点击下一个&#xff0c; 点击流&#xff0c;就开始推流了 拉流&#xff0c;观看端&#x…

云点数据读写

一、常见点云数据格式 LAS/LAZ格式 LAS是点云数据的行业标准格式 LAZ是LAS的压缩版本 支持地理参考信息、颜色、强度等属性 PCD格式(Point Cloud Data) PCL(Point Cloud Library)开发的格式 支持ASCII和二进制存储 包含头部信息和数据部分 PLY格式(Polygon File Format…

[RHEL8] 指定rpm软件包的更高版本模块流

背景&#xff1a;挂载RHEL ISO使用kickstart安装操作系统&#xff0c;安装包未指定安装perl&#xff0c;但是安装完可以查到其版本&#xff0c;且安装的是ISO中多个版本中的最低版本。 原因&#xff1a;&#xff08;1&#xff09;为什么没有装perl&#xff0c;perl -v可以看到版…

Spring 事务管理核心机制与传播行为应用

Spring 事务详解 一、Spring 事务简介 Spring 事务管理基于 AOP&#xff08;面向切面编程&#xff09;实现&#xff0c;通过 声明式事务&#xff08;注解或 XML 配置&#xff09;统一管理数据库操作&#xff0c;确保数据一致性。核心目标&#xff1a;保证多个数据库操作的原子…

JavaScript解密实战指南:从基础到进阶技巧

JavaScript加密技术广泛应用于数据保护、反爬虫和代码混淆&#xff0c;但掌握解密方法能帮助开发者突破技术壁垒。本文结合爬虫实战与安全分析场景&#xff0c;系统梳理JS解密的核心方法与工具。 一、基础解密方法 1. Base64解码 适用于简单编码场景&#xff0c;如Cookie加密…

WEMOS LOLIN32

ESP32是結合Wi-Fi和藍牙的32位元系統單晶片&#xff08;SoC&#xff09;與外接快閃記憶體的模組。許多廠商生產採用ESP32模組的控制板&#xff0c;最基本的ESP控制板包含ESP32模組、直流電壓轉換器和USB序列通訊介面IC。一款名為WEMOS LOLIN32的ESP32控制板具備3.7V鋰電池插座。…

俄罗斯方块-简单开发版

一、需求分析 实现了一个经典的俄罗斯方块小游戏&#xff0c;主要满足以下需求&#xff1a; 1.图形界面 使用 pygame 库创建一个可视化的游戏窗口&#xff0c;展示游戏的各种元素&#xff0c;如游戏区域、方块、分数等信息。 2.游戏逻辑 实现方块的生成、移动、旋转、下落和锁…

使用安全继电器的急停电路设计

使用安全继电器的急停电路设计 一&#xff0c;急停回路的设计1&#xff0c;如何将急停接到线路当中&#xff1f;2&#xff0c;急停开关 如何接到安全继电器中 一&#xff0c;急停回路的设计 急停是每一个设备必不可少的部分&#xff0c;因为关乎安全&#xff0c;所以说所以说他…

【读书笔记·VLSI电路设计方法解密】问题64:什么是芯片的功耗分析

低功耗设计是一种针对VLSI芯片功耗持续攀升问题的设计策略。随着工艺尺寸微缩&#xff0c;单颗芯片可集成更多元件&#xff0c;导致功耗相应增长。更严峻的是&#xff0c;现代芯片工作频率较二十年前大幅提升&#xff0c;而功耗与频率呈正比关系。因此&#xff0c;芯片功耗突破…