23

我试图在 jenkinsfile 中获取 git 提交消息并阻止基于提交消息的构建。

env.GIT_COMMIT不会在 jenkinsfile 中返回提交详细信息。

如果提交消息中包含 [ci skip],如何获取 git 最新提交消息并阻止 jenkins 构建?

4

5 回答 5

21

我遇到过同样的问题。我正在使用管道。我通过实现共享库解决了这个问题。

该库的代码是这样的:

// vars/ciSkip.groovy

def call(Map args) {
    if (args.action == 'check') {
        return check()
    }
    if (args.action == 'postProcess') {
        return postProcess()
    }
    error 'ciSkip has been called without valid arguments'
}

def check() {
    env.CI_SKIP = "false"
    result = sh (script: "git log -1 | grep '.*\\[ci skip\\].*'", returnStatus: true)
    if (result == 0) {
        env.CI_SKIP = "true"
        error "'[ci skip]' found in git commit message. Aborting."
    }
}

def postProcess() {
    if (env.CI_SKIP == "true") {
        currentBuild.result = 'NOT_BUILT'
    }
}

然后,在我的 Jenkinsfile 中:

pipeline {
  stages {
    stage('prepare') { steps { ciSkip action: 'check' } }
    // other stages here ...
  }
  post { always { ciSkip action: 'postProcess' } }
}

如您所见,构建标记为NOT_BUILT. 如果您愿意,可以将其更改为ABORTED,但不能设置为,SUCCESS因为构建结果只会变得更糟

于 2017-08-30T19:17:07.780 回答
17

当最后一个 git 日志中提供 [ci skip] 时,构建将通过,但不会运行实际的构建代码(替换为第一个 echo 语句)

node {
  checkout scm
  result = sh (script: "git log -1 | grep '\\[ci skip\\]'", returnStatus: true) 
  if (result != 0) {
    echo "performing build..."
  } else {
    echo "not running..."
  }
}
于 2016-12-15T10:25:15.900 回答
8

至于声明性管道,可以在“when”指令中使用“changelog”来跳过一个阶段:

when {
    not {
    changelog '.*^\\[ci skip\\] .+$'
    }
}

请参阅:https ://jenkins.io/doc/book/pipeline/syntax/#when

于 2019-06-06T18:53:41.833 回答
7

我认为您可以在多分支管道作业配置中轻松做到这一点 Branch Sources > Additional Behaviors > Polling ignores commits with certain messages 多分支流水线作业配置

于 2016-12-15T13:02:07.000 回答
5

到今天为止,这很容易实现。有趣的行是extension命名的MessageExclusionwhereexcludedMessage接受正则表达式。

checkout([ $class: 'GitSCM', 
  branches: [[name: '*/master']], 
  doGenerateSubmoduleConfigurations: false, 
  extensions: [[
    $class: 'MessageExclusion', excludedMessage: '.*skip-?ci.*'
  ]], 
  submoduleCfg: [], 
  userRemoteConfigs: [[
    credentialsId: 'xxx', url: 'git@github.com:$ORG/$REPO.git'
  ]]
])
于 2018-06-05T18:57:00.643 回答