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

Jenkins Pipeline正则匹配失效求助:提交消息判断逻辑排查

Jenkins Pipeline正则匹配不生效的问题排查与修复

核心错误原因

你当前的when条件里用了==来比较env.commitMessage和"Built by Jenkins.*",这是字符串精确匹配,而非正则表达式匹配。==会检查字符串是否完全等于"Built by Jenkins.*"(包括末尾的.*符号),根本不会触发你期望的“判断是否包含指定前缀”的逻辑,这就是正则匹配失效的根源。

修复方案

Groovy中实现正则匹配需要用专门的操作符或方法,根据你的需求(判断提交消息是否包含"Built by Jenkins"相关内容),推荐使用=~操作符(匹配子串,只要目标字符串包含正则模式即可)。修改后的when条件如下:

调整"Git Push To Origin"阶段的判断逻辑

stage('Git Push To Origin') {
    when {
        not {
            expression { env.commitMessage =~ /Built by Jenkins.*/ }
        }
    }
    steps {
        // 原有构建推送步骤保持不变
    }
}

调整"No changes was made"阶段的判断逻辑

stage('No changes was made') {
    when {
        expression { env.commitMessage =~ /Built by Jenkins.*/ }
    }
    steps {
        echo "Skipped because commit message contains \"Built by Jenkins\""
    }
}

额外优化建议

  1. 正则模式简化:如果只是判断是否包含"Built by Jenkins"前缀,正则可以简化为/Built by Jenkins/,不需要.*——=~本身会匹配任意位置的子串,只要目标字符串包含该内容即可。
  2. 提交消息格式处理:git log -1 --pretty=%B会返回完整的提交消息(包括换行),如果你的自动提交消息是单行的,建议改用--pretty=%s只获取提交标题,避免换行干扰匹配:
    def commitmsg = sh(script: 'git log -1 --pretty=%s', returnStdout: true).trim()
    

完整修复后的Pipeline代码

pipeline {
  agent {
    node {
      label 'jenkins'
    }
  }
  environment {
    PATH = "/var/lib/jenkins/go/bin:/root/go/bin:/var/lib/jenkins/.gvm/bin/:${env.PATH}"
    BRANCH = "main"
    CREDSID = "jenk"
    GITURL = "git@..."
  }

    stages {
        stage('Clone and build') {
            steps {
                echo 'Cleaning'
                cleanWs()
                
                echo 'Start cloning GIT'
                checkout scmGit(branches: [[name: "*/${BRANCH}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${CREDSID}", url: "${GITURL}"]])
                sh "git checkout ${BRANCH}"

                script {
                    // 可选:用--pretty=%s只获取提交标题,避免换行影响匹配
                    def commitmsg = sh(script: 'git log -1 --pretty=%B', returnStdout: true).trim()
                    env.commitMessage = commitmsg
                    echo "${env.commitMessage}"
                }
            }
        }

        stage('Git Push To Origin') {
            when {
                not {
                    expression { env.commitMessage =~ /Built by Jenkins/ }
                }
            }
            steps {
                sh 'make generate'
                withCredentials([gitUsernamePassword(credentialsId: 'jenki', gitToolName: 'git-tool')]) {
                    sh """
                        git add -A
                        git commit -m 'Built by Jenkins: ${BUILD_NUMBER} for ${env.commitMessage}'
                        git push
                    """
                }
            }
        }

        stage('No changes was made') {
            when {
                expression { env.commitMessage =~ /Built by Jenkins/ }
            }
            steps {
                echo "Skipped because commit message contains \"Built by Jenkins\""
            }
        }
    }
}

内容的提问来源于stack exchange,提问作者Rostyslav Malenko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 09:27:30