Как получить последнее сообщение об ошибке 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.