web-dev-qa-db-fra.com

Comment obtenir les changements depuis le dernier pipeline jenkins construit avec succès?

Quelqu'un a un script Jenkins Pipeline qui peut intégrer toutes les modifications depuis la dernière construction réussie d'une variable? J'utilise git et un travail de pipeline multibranches.

11
CaptRespect

Eh bien, j'ai réussi à bricoler quelque chose ensemble. Je suis à peu près sûr de pouvoir mieux itérer les tableaux, mais voici ce que j'ai pour le moment:

node('Android') {
  passedBuilds = []

  lastSuccessfulBuild(passedBuilds, currentBuild);

  def changeLog = getChangeLog(passedBuilds)
  echo "changeLog ${changeLog}"
}

def lastSuccessfulBuild(passedBuilds, build) {
  if ((build != null) && (build.result != 'SUCCESS')) {
      passedBuilds.add(build)
      lastSuccessfulBuild(passedBuilds, build.getPreviousBuild())
   }
}

@NonCPS
def getChangeLog(passedBuilds) {
    def log = ""
    for (int x = 0; x < passedBuilds.size(); x++) {
        def currentBuild = passedBuilds[x];
        def changeLogSets = currentBuild.rawBuild.changeSets
        for (int i = 0; i < changeLogSets.size(); i++) {
            def entries = changeLogSets[i].items
            for (int j = 0; j < entries.length; j++) {
                def entry = entries[j]
                log += "* ${entry.msg} by ${entry.author} \n"
            }
        }
    }
    return log;
  }
14
CaptRespect

Basé sur la réponse de CaptRespect, j'ai développé le script suivant à utiliser dans le pipeline déclaratif:

def changes = "Changes:\n"
build = currentBuild
while(build != null && build.result != 'SUCCESS') {
    changes += "In ${build.id}:\n"
    for (changeLog in build.changeSets) {
        for(entry in changeLog.items) {
            for(file in entry.affectedFiles) {
                changes += "* ${file.path}\n"
            }
        }
    }
    build = build.previousBuild
}
echo changes

Ceci est très utile dans les parties stage->when->expression pour exécuter une étape uniquement lorsque certains fichiers ont été modifiés. Je ne suis pas encore au courant de cette partie. J'aimerais bien créer une bibliothèque partagée à partir de cette page et lui permettre de lui transmettre des modèles globuleux à vérifier.

EDIT: Vérifiez la documentation btw, au cas où vous voudriez aller un peu plus loin. Vous devriez pouvoir convertir tous les appels object.getSomeProperty() en seulement entry.someProperty.

8
andsens

Il y a le Changements depuis le dernier plugin de succès qui pourrait vous aider avec ça.

0
Rogério Peixoto

Pour toute personne utilisant Accurev, voici une adaptation de andsens answer. andsens answer ne peut pas être utilisé car le plug-in Accurev n'implémente pas getAffectedFiles. La documentation relative à AccurevTransaction qui étend la classe ChangeLogSet.Entry est disponible à l’adresse ici.

import hudson.plugins.accurev.*

def changes = "Changes: \n"
build = currentBuild
// Go through the previous builds and get changes until the
// last successful build is found.
while (build != null && build.result != 'SUCCESS') {
    changes += "Build ${build.id}:\n"

    for (changeLog in build.changeSets) {
        for (AccurevTransaction entry in changeLog.items) {
            changes += "\n    Issue: " + entry.getIssueNum()
            changes += "\n    Change Type: " + entry.getAction()
            changes += "\n    Change Message: " + entry.getMsg()
            changes += "\n    Author: " + entry.getAuthor()
            changes += "\n    Date: " + entry.getDate()
            changes += "\n    Files: "
            for (path in entry.getAffectedPaths()) {
                changes += "\n        " + path;
            }
            changes += "\n"
        }
    }
    build = build.previousBuild
}
echo changes
writeFile file: "changeLog.txt", text: changes
0
Bakon Jarser