You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 22:52:43