Как получить последнее сообщение об ошибке git и предотвратить сбор jenkins, если сообщение commit содержит [ci skip]?

Я попытался получить сообщение git commit в файле jenkinsfile и предотвратить сборку на основе сообщения о фиксации.

env.GIT_COMMIT не возвращает детали комманды в файле jenkins.

Как получить последнее сообщение о фиксации git и предотвратить сбор jenkins, если сообщение commit содержит [ci skip] в нем?

Ответ 1

Сборка будет проходить, когда [ci skip] предоставлен в последнем журнале git, но не будет запускать фактический код сборки (замена на первый оператор эха)

node {
  checkout scm
  result = sh (script: "git log -1 | grep '\\[ci skip\\]'", returnStatus: true) 
  if (result != 0) {
    echo "performing build..."
  } else {
    echo "not running..."
  }
}

Ответ 2

У меня была такая же проблема. Я использую конвейеры. Я решил эту проблему, выполнив общую библиотеку.

Код библиотеки:

// 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'
    }
}

Затем в моем файле Jenkins:

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

Как вы можете видеть, сборка отмечена как NOT_BUILT. Вы можете изменить его на ABORTED, если хотите, но не может быть установлен на SUCCESS, потому что результат сборки может только ухудшиться

Ответ 3

Я думаю, что вы могли бы легко сделать это в конфигурации работы с несколькими ветвями конвейера. Источники веток> Дополнительные поведения> Опрос игнорирует фиксации с определенными сообщениями multi branch pipeline job configuration

Ответ 4

На сегодняшний день это довольно легко достичь. Интересная линия является extension имени MessageExclusion где excludedMessage принимает регулярное выражение.

checkout([ $class: 'GitSCM', 
  branches: [[name: '*/master']], 
  doGenerateSubmoduleConfigurations: false, 
  extensions: [[
    $class: 'MessageExclusion', excludedMessage: '.*skip-?ci.*'
  ]], 
  submoduleCfg: [], 
  userRemoteConfigs: [[
    credentialsId: 'xxx', url: '[email protected]:$ORG/$REPO.git'
  ]]
])

Ответ 5

Что касается декларативного конвейера, можно использовать директиву changelog в директиве when для пропуска этапа:

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

См.: https://jenkins.io/doc/book/pipeline/syntax/#when.