在Jenkins Pipeline中获取自上次成功构建后的文件变更

在Jenkins Pipeline中获取自上次成功构建后的文件变更

背景

最近调整了一下项目的流水线,希望可以根据代码文件的变更自动识别修改的模块,从而进行相应服务的构建打包部署,简单记录一下。

具体实现

我们的项目是基于Maven多模块的,随着业务的发展,微服务模块的数量也从几个扩展到了十几个,以前无脑构建所有服务的情况可能效率就会非常低了,所以需要获取文件变更动态构建修改的微服务模块。

一开始,我使用的是Git命令,获取上次成功构建的GIT_COMMIT,然后进行比较获取对应的文件变更,但是这种情况对于Merge Request的场景好像不适用,因为原分支多次push之后再MR,Git命令也就只能获取最后的一次提交,之前的变更就捞不到,所以结果不是很准确。当然肯定有其他Git命令可以实现,我对于Git本身也不是那么熟练,后面就尝试去找其他的方式。我这边也贴一下具体的Pipeline脚本

pipeline {agent anyenvironment {// 定义其他环境变量}stages {stage('Detect Changes') {steps {script {// 获取上次成功构建的GIT_COMMIT,这里假设你的Jenkins配置了Gitdef lastSuccessfulCommit = sh(script: "git rev-parse HEAD^1",returnStdout: true).trim()// 获取自上次成功构建以来发生变动的文件列表def changedFiles = sh(script: "git diff --name-only $lastSuccessfulCommit HEAD",returnStdout: true).trim()// 解析文件路径,决定需要构建的模块def buildModules = []if (changedFiles.contains("module1")) {buildModules += 'module1'}if (changedFiles.contains("module2")) {buildModules += 'module2'}// 将需要构建的模块列表存储在环境变量中以便后续使用env.BUILD_MODULES = buildModules.join(',')echo "Modules to be built: ${env.BUILD_MODULES}"}}}// 其他阶段stage('Build Modules') {when {expression {return env.BUILD_MODULES.contains('module1')}}steps {echo 'Building module1...'}}// 定义其他模块的构建阶段}
}

后面去Google搜索了一下其他人的做法,发现Jenkins本身是支持获取上一次的变更文件列表的,参考了stackoverflow上面的写法,具体实现如下

pipeline {agent anyenvironment {// 定义其他环境变量}stages {stage('Detect Changes') {steps {script {def changedFiles = "Changes:\n"build = currentBuildwhile(build != null && build.result != 'SUCCESS') {changedFiles += "In ${build.id}:\n"for (changeLog in build.changeSets) {for(entry in changeLog.items) {for(file in entry.affectedFiles) {changedFiles += "* ${file.path}\n"}}}build = build.previousBuild}echo changedFiles// 解析文件路径,决定需要构建的模块def buildModules = []if (changedFiles.contains("module1")) {buildModules += 'module1'}if (changedFiles.contains("module2")) {buildModules += 'module2'}// 将需要构建的模块列表存储在环境变量中以便后续使用env.BUILD_MODULES = buildModules.join(',')echo "Modules to be built: ${env.BUILD_MODULES}"}}}// 其他阶段stage('Build Modules') {when {expression {return env.BUILD_MODULES.contains('module1')}}steps {echo 'Building module1...'}}// 定义其他模块的构建阶段}
}

参考

https://stackoverflow.com/questions/38084806/how-to-get-the-changes-since-the-last-successful-build-in-jenkins-pipeline

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

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

相关文章

Shell编程之数组

一.数组定义方法 1.数组名称(数值1 数值2 数值3 数值4 数值5)数组名称("字符串1" "字符串2" "字符串4" "字符串5" "字符串6")(或者使用单引号) 如何查看数组的元素&#xff1…

项目管理表格-项目总体计划(项目管理-项目经理干货资料Excel)

项目管理总体计划模板 1、项目基本信息 2、项目里程碑 3、项目干系人 4、项目团队组织架构管理 5、项目预算管理 6、项目项目任务计划管理 7、问题及风险管理 8、项目周报 9、项目相关要求 软件项目相关全套精华资料包获取方式①:点我获取 获取方式②:本…

javaSE:类和对象

面向对象 java是一种面向对象的编程语言,面向对象就是把能为我们所用的东西直接拿来使用,省去中间过程,比如洗衣服,要完成这一个动作,我们本来需要一个盆,放水,放衣服,换水&#xf…

Hive的排序

order by 全局排序,因此只有一个reducer,设置了多个reducer也不起作用.-- 设置reducer的个数为2 set mapred.reduce.tasks2; -- 查询 select * from user_install_status_limit order by uptime limit 10;order by 在hive.mapred.mode strict 模式下,必须指定 limit,否则执行…

Hive内部表(管理表)和外部表的区别

1、定义 Hive内部表:默认创建的表是内部表。hive完全管理表(元数据和数据)的声明周期,类似于RDBMS的表。当删除表时,他会删除源数据以及表的元数据。 Hive外部表:外部表的数据不是Hive拥有或者管理的,只管…

三大国密浏览器简单介绍-行云管家

国密浏览器是指支持国密算法SM2/SM3,支持基于国密算法的SSL协议,支持采用国密SSL证书实现HTTPS加密的网站正常访问的浏览器。今天我们行云管家小编就给大家简单介绍一下三大国密浏览器,以便大家了解。 三大国密浏览器简单介绍-行云管家 1、密…

JavaScript的数据类型和运算符

JS的数据类型和运算符 1 JS的数据类型 1.1 数值类型 数值类型统一为 number,不区分整数和浮点数 1.2 字符串类型 字符串类型为 string 和JAVA中的String相似,JS中不严格区分单双引号,都可以用于表示字符串 1.3 布尔类型 布尔类型为boolean 和Java中的boolean相似,但是在…

开源可视化表单服务商:提升自主研发 助力流程化办公!

当前,做好流程化办公可以为企业实现提质增效的办公效果,助力企业进入数字化转型。作为开源可视化表单服务商,流辰信息坚持研发创新理念,努力提升自主研发能力,专为广大客户朋友提供集产品、框架定制、产品交付为一体的…

【WEEK12】 【DAY2】整合Druid数据源【中文版】

2024.5.14 Tuesday 目录 12.整合Druid数据源12.1.Druid简介12.2.配置数据源12.2.1.添加Druid数据源依赖12.2.2.切换数据源12.2.3.运行Springboot04DataApplicationTests.java12.2.4.尝试使用Druid数据源的专有配置12.2.5.导入Log4j 的依赖12.2.6.新建config文件夹12.2.7.修改测…

短视频人设定位有哪些:四川京之华锦信息技术公司

短视频人设定位有哪些:打造独特魅力的关键 随着短视频平台的兴起,越来越多的内容创作者开始涌现,他们凭借各自独特的魅力在网络世界中崭露头角。而在这其中,一个成功的短视频账号背后,往往有一个清晰、鲜明的人设定位…

安卓APP+TCP+服务器端

1、在.xml文件中添加权限 <uses-permission android:name"android.permission.ACCESS_WIFI_STATE"/><uses-permission android:name"android.permission.INTERNET"/>2、修改显示界面 <?xml version"1.0" encoding"utf-8&…

短剧私域-快速引流变现

短剧的爆火&#xff0c;衍生出了很多周边项目。 比如免费看剧App&#xff0c;短剧搜索机器人&#xff0c;短剧付费圈子等等。 这些项目的本质&#xff0c;就是借助短剧的热度&#xff0c;把流量引到自己的鱼塘进行变现。 短剧机器人大家都知道&#xff0c;目前最火的一种玩法…

【大数据面试题】27 讲下Doris的物化视图

一步一个脚印&#xff0c;一天一道面试题。 物化视图概念 物化视图&#xff0c;顾名思义&#xff0c;是将一个查询的结果预先计算并存储为物理表的形式。这意味着&#xff0c;原本需要在运行时动态执行的复杂查询&#xff0c;现在变成了直接从已经计算好的结果表中读取数据&a…

vue一个简易时钟

<template><div class"">时间{{ time }}<div class"base1"><div class"move-to-center line"></div><div class"move-to-center line line2"></div><div class"move-to-center lin…

单链表经典算法OJ题--牛客(环形链表的约瑟夫问题

链接&#xff1a;环形链表的约瑟夫问题_牛客题霸_牛客网【点击即可跳转】 著名的Josephus问题 据说著名犹太历史学家 Josephus有过以下的故事&#xff1a; 在罗马人占领乔塔帕特后&#xff0c;39 个犹太⼈与 Josephus及他的朋友躲到⼀个洞中&#xff0c;39个犹太⼈决定宁愿死也…

部标JT809开源(go版本)

GitHub - Yordroid/jt809_server: 部标809下级平台&#xff0c;支持2011&#xff0c;2013,2019 欢迎大家给波星

网络接口类型

第二天&#xff08;网络、接口类型&#xff09; 网络类型&#xff1a; 1、点到点&#xff1a;在一个网段内只能存在&#xff0c;两个物理节点 MA --- 多路访问 -- 在一个网段内物理节点的数量不限制 MA --- BMA NBMA 2、BMA --- 广播型多路访问 3、NBMA --- 非广播型多路…

智能鱼缸-设计说明书

设计摘要&#xff1a; 本论文以STC89C52单片机为核心控制器&#xff0c;构建了一套智能鱼缸系统。该系统由中控部分、输入部分和输出部分组成。中控部分采用STC89C52单片机&#xff0c;负责获取输入部分数据并进行处理&#xff0c;控制输出部分。输入部分包括TDS水质水温检测模…

MySQL:查询一个由逗号分隔的字符串数组,并检查其中指定元素是否等于某个值

使用SUBSTRING_INDEX函数 SELECT * FROM TABLE_NAME WHERE SUBSTRING_INDEX(SUBSTRING_INDEX(status, ,, 2), ,, -1) 1SUBSTRING_INDEX()函数 用于提取字符串中的子字符串。函数有三个参数&#xff1a; 第一个参数是源字符串&#xff0c;这是您要从中提取子字符串的字符串。…

Axure RP移动端交互元件库/交互原型模板

作品类型&#xff1a;元件库/原型模板 更新日期&#xff1a;2023-12-04 当前版本&#xff1a;V1.3 适用范围&#xff1a;App应用/小程序 Axure版本&#xff1a;Axure 9.0均可打开 文件大小&#xff1a;36.7M 历时两个月制作并整理了手机移动端常用的75种组件、90个常用界面模板…