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]?
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..."
}
}
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
Aujourd'hui, c'est assez facile à réaliser. La ligne intéressante est le extension
nommé MessageExclusion
où excludedMessage
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'
]]
])
Quant au pipeline déclaratif, on peut utiliser 'changelog' dans la directive 'when' pour sauter une étape:
when {
not {
changelog '.*^\\[ci skip\\] .+$'
}
}