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

时间:2018-03-14 12:18:33

标签: jenkins jenkins-pipeline

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

匹配分支很容易:

when {
  branch 'master'
}

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

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

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

任何人都可以在任何可以帮助我的片段中指出我吗?

由于

1 个答案:

答案 0 :(得分:0)

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

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

如果要以声明性方式进行此操作,可以将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')
        }
    }
}

我的观点是,当詹金斯通过一条master消息在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"
}

代替

when {
    changelog "^chore\\(release\\):.*"
    branch "master"
}