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

Jenkins Pipeline中Mercurial标签触发Deploy阶段的问题求助

解决Mercurial环境下Jenkins Deploy阶段仅在版本打标签时触发的问题

这个问题确实是Mercurial和Git的标签机制差异导致的——Git的标签是独立的引用,而Mercurial的标签是通过提交.hgtags文件来记录的,这就造成Jenkins默认的tag条件判断没法直接适配你的场景:被标签标记的版本拉取时还没标签记录,而包含标签记录的提交本身又不是被标记的版本。

下面给你几个可行的解决思路:

方案1:自定义Script条件判断(推荐)

放弃Jenkins默认的tag条件,改用script条件手动通过Mercurial命令检查两种场景:

  1. 当前构建的提交是打标签的提交(即修改了.hgtags文件),且新增的标签符合release*规则
  2. 当前构建的版本被某个release*标签指向(即使标签记录在后续提交里)

修改后的Jenkinsfile Deploy阶段示例:

stage ('Deploy') {
    when {
        script {
            // 获取当前构建的Mercurial变更集ID
            def currentChangeset = env.MERCURIAL_CHANGESET
            // 场景1:检查当前提交是否修改了.hgtags,且新增了符合规则的标签
            def hgtagsModified = bat(returnStatus: true, script: "hg status --change ${currentChangeset} | findstr /C:".hgtags"") == 0
            if (hgtagsModified) {
                // 提取本次提交的描述(hg tag命令生成的提交描述会包含新增的标签)
                def commitDesc = bat(returnStdout: true, script: "hg log --change ${currentChangeset} --template \"{desc}\"").trim()
                if (commitDesc =~ /release\S+/) {
                    return true
                }
            }
            // 场景2:检查当前版本是否被某个release*标签指向
            def currentRev = bat(returnStdout: true, script: "hg identify -i").trim()
            def matchingTags = bat(returnStdout: true, script: "hg tags | findstr /C:\"${currentRev}\" | findstr /C:\"release\"").trim()
            return matchingTags != ""
        }
    }
    steps {
        bat "\"${env.WORKSPACE}\\jenkins\\deploy.bat\" \"M:\\dev-FU4\""
    }
}

逻辑说明:

  • 第一个判断针对打标签的提交:当你执行hg tag releaseX.X时,Mercurial会生成一个修改.hgtags的提交,描述里会包含标签名,我们通过检查这个提交的内容来触发部署
  • 第二个判断针对被标签指向的旧版本:即使构建的是旧版本,只要拉取了包含标签记录的所有提交,就能通过hg tags找到指向当前版本的标签

方案2:调整打标签与构建的流程

如果你的团队流程允许,可以调整操作步骤来适配Jenkins:

  • 打完标签后(hg tag releaseX.X),手动触发Jenkins构建,并指定被标签指向的旧版本作为构建版本(而不是默认的default分支最新提交)
  • 或者在Jenkins的Mercurial SCM配置里,将revision设置为标签名(比如release*),让Jenkins自动轮询符合规则的标签版本

方案3:通过插件辅助解析标签

可以安装Jenkins的Pipeline Utility Steps插件,直接读取工作区的.hgtags文件,解析里面的标签与变更集映射关系,判断当前版本是否被目标标签指向。示例逻辑:

stage ('Deploy') {
    when {
        script {
            def hgtags = readFile('.hgtags').split('\n')
            def currentRev = bat(returnStdout: true, script: "hg identify -i").trim()
            // 遍历.hgtags,找是否有release*标签指向当前版本
            for (line in hgtags) {
                if (line.trim() == "") continue
                def parts = line.split(/\s+/)
                if (parts.size() >=2 && parts[0] == currentRev && parts[1] =~ /release*/) {
                    return true
                }
            }
            return false
        }
    }
    steps {
        bat "\"${env.WORKSPACE}\\jenkins\\deploy.bat\" \"M:\\dev-FU4\""
    }
}

这个方案的优势是不需要执行额外的Mercurial命令,直接解析文件即可,但要确保工作区已经拉取了包含最新.hgtags的提交。


内容的提问来源于stack exchange,提问作者Laurent GROSBOIS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 13:17:30