如何在Bash、Groovy或Jenkinsfile中识别Git最近合并修改的文件路径?
实现Jenkins合并事件中识别特定目录文件修改的方法
在Jenkins合并触发的任务中,要判断是否需要执行特定阶段,核心是精准获取本次合并带来的文件变更列表,再匹配目标目录路径,以下是两种常用实现方式:
方式一:通过Git命令手动获取并判断变更文件
适合脚本式或需要自定义逻辑的流水线,直接用Git命令拉取合并提交的变更文件,再做路径匹配:
pipeline { agent any stages { stage('检查环境配置变更') { steps { script { // 获取合并提交的所有变更文件(HEAD为合并后版本,HEAD^为合并前目标分支版本) def changedFiles = sh( script: 'git diff --name-only HEAD^ HEAD', returnStdout: true ).trim().split('\n') // 匹配foo/env/<环境名>/下的所有文件变更 def hasEnvChanges = changedFiles.any { filePath -> filePath ==~ /foo\/env\/[^\/]+\/.+/ } if (hasEnvChanges) { echo "检测到foo/env目录下有环境配置变更,执行部署阶段" deployToEnvironment() } else { echo "未检测到目标目录变更,跳过部署阶段" } } } } } } // 封装需要触发的阶段逻辑 def deployToEnvironment() { stage('部署到目标环境') { steps { echo "执行环境部署操作..." // 这里添加具体的部署步骤(如kubectl apply、Ansible执行等) } } }
注意事项:
- 若Jenkins任务是PR触发的预合并检查,可将Git命令替换为
git diff origin/<目标分支>...origin/<源分支>,获取PR中所有待合并的变更文件 - 确保Jenkins节点的Git配置能正确拉取完整提交历史,必要时在流水线中添加
git fetch --depth=0拉取所有历史
方式二:用Jenkins声明式流水线的changeset条件
如果是声明式流水线,可直接通过when块的changeset条件实现,无需手动写Git命令:
pipeline { agent any stages { stage('部署到目标环境') { // 仅当变更文件匹配foo/env下任意子目录的文件时执行 when { changeset pattern: 'foo/env/**/*', comparator: 'REGEXP' } steps { echo "执行环境部署操作..." // 具体部署步骤 } } } }
说明:
pattern: 'foo/env/**/*'是正则匹配,会覆盖foo/env/下所有层级的文件变更- 若要严格匹配
foo/env/<环境名>/下的直接文件(不含更深子目录),可将pattern改为foo/env/[^/]+/[^/]+
内容的提问来源于stack exchange,提问作者Marcin Kulik
相关产品推荐
相关产品推荐

