问题描述
在 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?