web-dev-qa-db-fra.com

Comment désactiver la compilation automatique à partir de SCM Change dans Jenkinsfile

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?

13
numb3rs1x

Si vous utilisez un pipeline multibranches, vous devriez pouvoir le faire sur la page de configuration du travail:

  1. Faites défiler jusqu'à "Sources de branche"
  2. Sous "Stratégie de propriété", choisissez "Les branches nommées ont des propriétés différentes"
  3. Cliquez sur "Ajouter une exception", entrez "maître" comme nom de branche
  4. Cliquez sur "Ajouter une propriété", choisissez "Supprimer le déclenchement automatique du GDS".
  5. Sauvegarder

Cela empêcherait les modifications apportées à la branche master de déclencher la création du travail correspondant.

19
Christopher Orr

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 .

2
scarswell

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")
    }
}
1
Adi De Masi

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 ....
0
numb3rs1x

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é).

0
Karthick