「Jenkins Pipeline」- 获取自上次成功构建之后的变更

  CREATE BY JENKINSBOT

问题描述

在 Jenkins Pipeline 中,通过 currentBuild.changeSets 变量,我们可以获取仓库文件的变更记录,比如哪些代码文件发生修改,并进行某些特定操作。

比如,文件 fileA.txt 发生变更时,我们将进行某些特殊测试操作。但是,该方案存在以下场景(问题):

	(1)当文件fileA.txt发生变更时,我们将进行某些操作,但是由于环境配置错误而导致构建操作失败。
	(2)当我们修改环境配置后,重新触发构建(手动触发或者其他方式)。
	(3)此时,由于仓库并未变更,因此已经检测不到文件fileA.txt发生变更。因为变更属于上一次构建。

这就导致特定操作无法被触发。我们需要获取这些变更,这些自上次成功构建后的变更记录。

解决方案

第一步,通过 currentBuild.previousBuild 属性,可以获取上次构建。两者为同类型对象,即方法属性是相同的;
第二步,我们只需要找到所有失败的构建,并读取其中变更记录即可;

因此依据上述步骤,代码实现如下:

def build = currentBuild
while(build != null && build.result != "SUCCESS") {

	def changeSets = build.changeSets
	// doing some stuff

    build = build.previousBuild
}

附加说明

在绝大多数情况下,我们遇到的问题别人早已遇到过。我们之所以没有解决是因为我们没有“搜索”到解决方案。

已知问题

通过 ChangeLogSet.Entry.getAffectedFiles() 方法,无法获取所有变更文件

问题描述:
# 01/24/2021 我们共计修改 2808 个文件,通过 git diff-tree --no-commit-id --name-only -r HEAD | wc -l 验证。但是,通过 getAffectedFiles() 方法,仅获取 993 个变更文件。我们还没有找到原因,也可能是类库的 BUG。
# 01/25/2021 如果仅仅修改少量文件,比如我们测试修改 4 个文件,使用 getAffectedFiles() 是正常的。

解决方案:
# 01/24/2021 我们现在没有更好的解决方案,只能通过 git diff-tree 获取被修改文件,然后再进行处理,参考 find files changed 笔记。

参考文献

How to get the changes since the last successful build in jenkins pipeline?