仅当最新提交消息不包含特定文本时如何执行阶段

min*_*rse 5 jenkins jenkins-pipeline

我正在使用声明性管道,并且希望仅在与某个分支匹配并且最新提交不包含某些文本时才运行阶段。

匹配分支是最简单的部分:

when {
  branch 'master'
}
Run Code Online (Sandbox Code Playgroud)

但是为了检查最新的提交消息,我不确定如何添加此检查。

我遇到了这个答案,这正是我想要实现的目标。

我想知道是否需要使用包含与上面链接的答案类似的逻辑的表达式子句,来查询 git 日志并解析\检查最新提交消息包含我提供的正则表达式模式。

谁能指出一些对我有帮助的片段?

谢谢

Joc*_*ker 2

我回答得有点晚,但对其他人可能有用。

您向我们指出的答案是针对脚本化管道并且效果很好。

如果您想以声明方式执行此操作,可以将changelog条件和branch条件组合起来,如下所示:

stage("Skip release commit") {
    when {
        changelog "^chore\\(release\\):.*"
        branch "master"
    }
    steps {
        script {
            // Abort the build to avoid build loop
            currentBuild.result = "ABORTED"
            error('Last commit is from Jenkins release, cancel execution')
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

master我的观点是,当 Jenkins 在分支上提交消息时跳过构建chore(release):...

如果您必须检查更复杂的分支名称,您可以替换branch "master"为类似的内容expression {env.BRANCH_NAME ==~ /^feat\/.+/}(仅在以“feat/”开头的分支名称上执行阶段)

不幸的是,如果您项目的贡献者git commit --amend在之前的提交中使用了与条件匹配的消息changelog,那么该阶段将不会被触发,因为变更日志将用于Branch indexing此修改。

在这种情况下,您可能需要:

environment {
    CHORE_RELEASE = sh script: "git log -1 | grep 'chore(release):'", returnStatus: true
}
when {
    expression { "${CHORE_RELEASE}" == "0" }
    branch "master"
}
Run Code Online (Sandbox Code Playgroud)

代替

when {
    changelog "^chore\\(release\\):.*"
    branch "master"
}
Run Code Online (Sandbox Code Playgroud)