J'ai un fichier Jenkins que j'ai configuré avec un cron
pour un paramètre pipelineTriggers
. Je n'arrive pas à comprendre comment désactiver le travail depuis la fusion vers la branche principale du référentiel. Dans le fichier Jenkins, existe-t-il un moyen de désactiver la génération automatique à partir d’un changement de logiciel de gestion?
Si vous utilisez un pipeline multibranches, vous devriez pouvoir le faire sur la page de configuration du travail:
Cela empêcherait les modifications apportées à la branche master
de déclencher la création du travail correspondant.
Avec le pipeline multibranches, je ne pouvais pas trouver un moyen d'empêcher le déclenchement de la prochaine construction. En guise de solution de contournement, j'ai ajouté le code suivant à mon fichier Jenkins (à l'aide de la syntaxe scriptée) pour annuler la construction suivante si les seules modifications contiennent "[ci-skip]" dans le message de validation:
def abortBuildIfTriggeredBySkippableCommit() {
def changeSetCount = 0;
def ciSkipCount = 0;
if (currentBuild.changeSets != null) {
for (changeSetList in currentBuild.changeSets) {
for (changeSet in changeSetList) {
changeSetCount++;
if (changeSet.msg.contains('[ci-skip]')) {
ciSkipCount++;
}
}
}
}
if (changeSetCount > 0 && changeSetCount == ciSkipCount) {
currentBuild.result = 'NOT_BUILT'
error("Stopping to prevent auto trigger. All commits contained [ci-skip]")
}
}
Notez que ce code suppose que vous utilisez le plug-in git et que les objets dans currentBuild.changeSets
seront GitChangeSetList .
Je suis tombé sur cela aussi. IMO, une solution acceptable consisterait en un filtre pour les messages de validation lors de la vérification du code source - cette fonctionnalité existe pour les Jobs classiques mais est manquante pour les pipelines multibranches, voir https://issues.jenkins-ci.org/browse/JENKINS-48296 .
Pour ceux qui n'utilisent pas le plugin git, cette méthode est une solution de contournement pour les pipelines scriptés (inspirée de la réponse de Scarswell):
def abortBuildIfTriggeredBySkippableCommit() {
lastCommitMessage = sh(
script: "${gitBinary} --no-pager log -1 --pretty=%B",
returnStdout: true
)
if (lastCommitMessage != null &&
lastCommitMessage.toString().contains('[maven-release-plugin]')) {
currentBuild.result = 'ABORTED'
error("Stopping build, it was triggered by the maven release plugin")
}
}
C'est ce que je suis venu avec. J'espérais quelque chose de moins en désordre, mais cela semble fonctionner:
J'ai ceci comme propriétés de la construction:
properties([
pipelineTriggers([cron('H H 7 * *')])
])
J'ai alors cette fonction qui définit la source de la construction:
// check if the job was started by a timer
@NonCPS
def jobStartedByWhat() {
def startedByWhat = ''
try {
def buildCauses = currentBuild.rawBuild.getCauses()
for ( buildCause in buildCauses ) {
if (buildCause != null) {
def causeDescription = buildCause.getShortDescription()
echo "shortDescription: ${causeDescription}"
if (causeDescription.contains("Started by timer")) {
startedByWhat = 'timer'
}
if (causeDescription.contains("Started by user")) {
startedByWhat = 'user'
}
}
}
} catch(theError) {
echo "Error getting build cause: ${theError}"
}
return startedByWhat
}
def startedByWhat = jobStartedByWhat()
Je peux ensuite évaluer la fonction au moment de l'exécution afin que, si une construction est déclenchée à la suite d'une fusion avec un maître, elle ne sera pas exécutée:
node {
try {
checkout scm
if (env.BRANCH_NAME == 'master') {
if (startedByWhat == 'timer' || startedByWhat == 'user') {
..... RUN THE BUILD .....
} else {
.... EXIT WITHOUT RUNNING THE BUILD ....
Si vous utilisez un script de pipeline à partir de SCM, commentez la section triggers (option SCMPoll/BuildPeriodically) dans le fichier Jenkins, comme indiqué ci-dessous.
// déclenche {cron ('H/15 * * * *')} // pipelineTriggers ([pollSCM ('H/15 * * * *')])
Si vous utilisez un script de pipeline, désactivez l'option PollSCM/Build périodiquement (selon ce qui est utilisé).