web-dev-qa-db-ja.com

コミットメッセージに[ci skip]が含まれている場合、gitの最新のコミットメッセージを取得し、jenkinsビルドを防ぐ方法

Jenkinsfileでgitコミットメッセージを取得し、コミットメッセージに基づいたビルドを防止しようとしました。

env.GIT_COMMITは、jenkinsfileにコミットの詳細を返しません。

コミットメッセージに[ci skip]が含まれている場合、gitの最新のコミットメッセージを取得し、jenkinsビルドを防ぐ方法は?

17
Yahwe Raj

ビルドは、[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..."
  }
}
16
Amityo

同じ問題がありました。パイプラインを使用しています。 共有ライブラリ を実装することでこの問題を解決しました。

ライブラリのコードは次のとおりです。

// 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に設定することはできません。 ビルド結果が悪化する可能性があるためです

11
csalazar

マルチブランチパイプラインジョブ構成で簡単に実行できると思います[ブランチソース]> [追加の動作]> [ポーリングは特定のメッセージによるコミットを無視します multi branch pipeline job configuration

5
hakamairi

今日の時点で、達成するのは非常に簡単です。興味深い行は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'
  ]]
])
3
mana

宣言的なパイプラインについては、「when」ディレクティブで「changelog」を使用してステージをスキップできます。

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

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

2
third_man