Jenkinsfileでgitコミットメッセージを取得し、コミットメッセージに基づいたビルドを防止しようとしました。
env.GIT_COMMITは、jenkinsfileにコミットの詳細を返しません。
コミットメッセージに[ci skip]が含まれている場合、gitの最新のコミットメッセージを取得し、jenkinsビルドを防ぐ方法は?
ビルドは、[ci skip]が最後のgitログで提供されるとパスしますが、実際のビルドコードは実行しません(最初の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..."
}
}
同じ問題がありました。パイプラインを使用しています。 共有ライブラリ を実装することでこの問題を解決しました。
ライブラリのコードは次のとおりです。
// 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
に設定することはできません。 ビルド結果が悪化する可能性があるためです
今日の時点で、達成するのは非常に簡単です。興味深い行は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'
]]
])
宣言的なパイプラインについては、「when」ディレクティブで「changelog」を使用してステージをスキップできます。
when {
not {
changelog '.*^\\[ci skip\\] .+$'
}
}