使用Generic Webhook Trigger无法仅触发TAG推送构建问题
问题
无法仅针对基于TAG的代码检出触发构建,当前会同时触发基于BRANCH和TAG的代码检出构建。
版本信息
- Jenkins: 2.401.1
- Generic Webhook Trigger插件: 1.86.3
复现步骤
- 使用以下代码创建Jenkinsfile并构建流水线:
def val = "Jenkins-Agent-01" def registryLogin = "docker-hub.example.com" def imageURL = "centos/devops-build:latest" pipeline { agent { node { label val customWorkspace "/opt/devops/workspace/${JOB_NAME}/${BUILD_NUMBER}" } } triggers { GenericTrigger( genericVariables: [ [key: 'eventKey', value: '$.eventKey', defaultValue: 'null'], [key: 'tagId', value: '$.changes[0].refId', defaultValue: 'null'], [key: 'repoName', value: '$.repository.name', defaultValue: 'null'], [key: 'repository_slug', value: '$.repository.slug', defaultValue: 'null'], [key: 'repository_project_key', value: '$.repository.project.key', defaultValue: 'null'], [key: 'changes_ref_ids', value: '$.changes[?(@.ref.type == "TAG")].ref.id', defaultValue: 'null'] ], causeString: 'Triggered By BitBucket', token: '', tokenCredentialId: '', printContributedVariables: false, printPostContent: false, silentResponse: false, regexpFilterText: '$changes_ref_ids', regexpFilterExpression: '^refs/tags/.*$' ) } stages { stage('Display Payload') { steps { script { sh """ echo "Repo ref Id: ${changes_ref_ids}" echo "Repo Project Key: ${repository_project_key}" """ } } } stage('Build Jar file') { steps { script { docker.withRegistry("https://${registryLogin}", "docker-hub-creds") { docker.image("${imageURL}").pull() docker.image("${imageURL}").inside() { echo "Starting the build...." checkout([$class: 'GitSCM', branches: [[name: "${tagId}"]], userRemoteConfigs: [[credentialsId: "bitbucket-creds", url: "https://bitbucket.example.com/scm/${repository_project_key}/${repoName}.git"]]]) sh """ mvn help:evaluate -Dexpression=project.version -q -DforceStdout; mvn clean install -DskipTests -Ptest """ } } } } } } }
- 在BitBucket中配置Jenkins的Webhook地址
- 推送分支或标签触发流水线构建
预期结果
- Jenkins应仅在推送TAG时触发构建,分支推送时不触发。
实际结果
- 推送分支或TAG时,Jenkins都会触发构建。
解决方法
你当前的过滤逻辑失效的核心原因是:分支推送时changes_ref_ids会返回空值,而插件对空值的过滤判断不符合预期,导致分支推送也能触发构建。可以通过以下方式调整:
方案1:直接过滤引用类型
修改GenericTrigger配置,新增获取引用类型的变量,仅允许TAG类型的变更触发构建:
triggers { GenericTrigger( genericVariables: [ [key: 'eventKey', value: '$.eventKey', defaultValue: 'null'], [key: 'tagId', value: '$.changes[0].refId', defaultValue: 'null'], [key: 'repoName', value: '$.repository.name', defaultValue: 'null'], [key: 'repository_project_key', value: '$.repository.project.key', defaultValue: 'null'], // 新增获取当前变更的引用类型 [key: 'ref_type', value: '$.changes[0].ref.type', defaultValue: 'null'] ], causeString: 'Triggered By BitBucket', token: '', tokenCredentialId: '', printContributedVariables: false, printPostContent: false, silentResponse: false, // 过滤引用类型为TAG的事件 regexpFilterText: '$ref_type', regexpFilterExpression: '^TAG$' ) }
方案2:双重过滤事件类型与引用类型
如果需要更严格的控制,可以同时匹配BitBucket的事件Key和引用类型,确保只有标签变更事件触发:
triggers { GenericTrigger( genericVariables: [ [key: 'eventKey', value: '$.eventKey', defaultValue: 'null'], [key: 'tagId', value: '$.changes[0].refId', defaultValue: 'null'], [key: 'repoName', value: '$.repository.name', defaultValue: 'null'], [key: 'repository_project_key', value: '$.repository.project.key', defaultValue: 'null'], [key: 'ref_type', value: '$.changes[0].ref.type', defaultValue: 'null'] ], causeString: 'Triggered By BitBucket', token: '', tokenCredentialId: '', printContributedVariables: false, printPostContent: false, silentResponse: false, // 同时匹配事件Key和引用类型 regexpFilterText: '$eventKey $ref_type', regexpFilterExpression: 'repo:refs_changed TAG' ) }
调试建议
如果调整后仍有问题,可以暂时开启printContributedVariables: true和printPostContent: true,Jenkins会打印Webhook推送的原始内容和解析到的变量值,方便排查过滤逻辑是否正确。
内容的提问来源于stack exchange,提问作者Udayendu
相关产品推荐
相关产品推荐

