如何在Jenkinsfile中禁用scm更改的自动构建

时间:2017-03-14 22:49:01

标签: jenkins jenkins-pipeline

我有一个Jenkins文件,我已使用cron设置pipelineTriggers参数。我似乎无法弄清楚如何禁用作业从合并到repo的主分支。 Jenkinsfile中是否有一种方法可以禁用scm更改中的自动构建?

8 个答案:

答案 0 :(得分:22)

如果您正在使用Multibranch Pipeline,您应该可以在作业的配置页面上执行此操作:

  1. 向下滚动到"分支来源"
  2. 在"物业策略"下,选择"命名分支获得不同的属性"
  3. 点击"添加例外",输入" master"作为分支名称
  4. 点击"添加属性",选择"禁止自动SCM触发"
  5. 保存
  6. 这会阻止对master分支的更改触发相应作业的构建。

答案 1 :(得分:4)

使用multibranch管道,我无法找到防止下一个构建被触发的方法。作为一种解决方法,我将以下代码添加到我的Jenkinsfile(使用脚本语法),如果唯一的更改包含" [ci-skip]"则中止以下构建。在提交消息中:

def abortBuildIfTriggeredBySkippableCommit() {
    def changeSetCount = 0;
    def ciSkipCount = 0;
    if (currentBuild.changeSets != null) {
        for (changeSetList in currentBuild.changeSets) {
            for (changeSet in changeSetList) {
                changeSetCount++;
                if (changeSet.msg.contains('[ci-skip]')) {
                    ciSkipCount++;
                }
            }
        }
    }

    if (changeSetCount > 0 && changeSetCount == ciSkipCount) {
        currentBuild.result = 'NOT_BUILT'
        error("Stopping to prevent auto trigger. All commits contained [ci-skip]")
    }
}

请注意,此代码假定您使用的是git插件,currentBuild.changeSets中的对象将为GitChangeSetList

答案 2 :(得分:1)

我偶然发现了这一点。 IMO是一个可接受的解决方案,它是检查源代码时提交消息的过滤器 - 此功能适用于常规作业,但缺少多分支管道,请参阅https://issues.jenkins-ci.org/browse/JENKINS-48296

对于那些不使用git插件的人来说,这种方法是脚本管道的一种解决方法(受到scarswell的回答):

def abortBuildIfTriggeredBySkippableCommit() {
    lastCommitMessage = sh(
        script: "${gitBinary} --no-pager log -1 --pretty=%B",
        returnStdout: true
    )
    if (lastCommitMessage != null && 
        lastCommitMessage.toString().contains('[maven-release-plugin]')) {
        currentBuild.result = 'ABORTED'
        error("Stopping build, it was triggered by the maven release plugin")
    }
}

答案 3 :(得分:0)

如果您正在使用SCM中的Pipeline脚本,请在Jenkins文件中注释掉触发器部分(SCMPoll / BuildPeriodically选项),如下所示。

//触发{cron(' H / 15 * * * *')} // pipelineTriggers([pollSCM(' H / 15 * * * *')])

如果您使用的是Pipeline脚本,请定期禁用PollSCM / Build(无论使用哪个)选项。

答案 4 :(得分:0)

这就是我想出的。我希望得到一些不那么混乱的东西,但这确实有效:

我将此作为构建的属性:

properties([
    pipelineTriggers([cron('H H 7 * *')])
])

然后我有了这个定义构建源的函数:

// check if the job was started by a timer
@NonCPS
def jobStartedByWhat() {
def startedByWhat = ''
try {
    def buildCauses = currentBuild.rawBuild.getCauses()
    for ( buildCause in buildCauses ) {
        if (buildCause != null) {
            def causeDescription = buildCause.getShortDescription()
            echo "shortDescription: ${causeDescription}"
            if (causeDescription.contains("Started by timer")) {
                startedByWhat = 'timer'
            }
            if (causeDescription.contains("Started by user")) {
                startedByWhat = 'user'
            }
        }
    }
} catch(theError) {
    echo "Error getting build cause: ${theError}"
}

return startedByWhat
}

def startedByWhat = jobStartedByWhat()

然后我可以在运行时评估该函数,这样如果构建因为合并到master而被触发,它将不会实际运行:

node {
try {
    checkout scm

    if (env.BRANCH_NAME == 'master') {
        if (startedByWhat == 'timer' || startedByWhat == 'user') {
 ..... RUN THE BUILD .....
    } else {
.... EXIT WITHOUT RUNNING THE BUILD ....

答案 5 :(得分:0)

可以通过禁用git的webhook通知来禁用scm构建触发器。

答案 6 :(得分:0)

在詹金斯工作中,您可以导航到高级源代码管理

  • 选择行为Dont trigger build on commit notification

这将禁用由SCM更改启动

答案 7 :(得分:0)

对于仍在寻找解决方案的人,请转到多分支管道的配置,在属性策略下,选择“抑制自动 SCM 触发”。

注意:这在 Jenkins 的 cloudbees 版本上可用。我不确定,这是否重要。 https://support.cloudbees.com/hc/en-us/articles/360026953651-Preventing-builds-from-getting-triggered-when-creating-a-new-multibranch-Pipeline-or-Organization-Folder?page=29