web-dev-qa-db-fra.com

Comment obtenir le dernier message de validation de git et empêcher la génération de jenkins si le message de validation contient [ci skip]?

J'ai essayé d'obtenir le message de validation git dans jenkinsfile et d'empêcher la génération basée sur le message de validation.

env.GIT_COMMIT ne renvoie pas les détails de validation dans jenkinsfile.

Comment obtenir le dernier message de validation de git et empêcher la génération de jenkins si le message de validation contient [ci-dessus]?

17
Yahwe Raj

Le build passera quand [ci skip] est fourni dans le dernier journal git, mais n'exécutera pas le code de build réel (le remplacement de la première instruction 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

J'ai eu le même problème. J'utilise des pipelines. J'ai résolu ce problème en implémentant une bibliothèque partagée .

Le code de la bibliothèque est le suivant:

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

Ensuite, dans mon fichier Jenkins:

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

Comme vous pouvez le voir, la génération est marquée comme NOT_BUILT. Vous pouvez le changer en ABORTED si vous préférez, mais il ne peut pas être défini sur SUCCESS car n résultat de build ne peut qu'empirer

11
csalazar

Je pense que vous pouvez facilement le faire dans la configuration de travail de pipeline multi-branche Sources de branche> Comportements supplémentaires> L'interrogation ignore les validations avec certains messages multi branch pipeline job configuration

5
hakamairi

Aujourd'hui, c'est assez facile à réaliser. La ligne intéressante est le extension nommé MessageExclusionexcludedMessage accepte une expression régulière.

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

Quant au pipeline déclaratif, on peut utiliser 'changelog' dans la directive 'when' pour sauter une étape:

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

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

2
third_man