代码之家  ›  专栏  ›  技术社区  ›  mmaceachran

Jenkins SCM plugin,如何获得自上次生成以来的每个更新文件的列表?

  •  0
  • mmaceachran  · 技术社区  · 7 年前

    我有一个Jenkins管道构建,我想遍历自上次构建以来更新的所有文件。我环顾四周,认为当前构建对象的changeSets变量可能有效。所以我试了这个:

    def gitUrl = "git@gitlab.xxx.com:me/myrepo.git"
    def gitResponse = dir(".") { checkout([
      $class: 'GitSCM', branches: [[name: '*/master']],
      userRemoteConfigs: [[url: gitUrl,credentialsId:'xxxkey']]
    ]) }
    // don't do anything if nothing changed
    if(gitResponse.GIT_COMMIT == gitResponse.GIT_PREVIOUS_COMMIT) {
      echo "No changes detected."
      return
    }
    def changeLogSets = currentBuild.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]
        echo "Change detected: ${entry}"
      }
    }
    

    但我得到了一个错误:

    Caused: java.io.NotSerializableException: hudson.plugins.git.GitChangeSetList
    

    有没有办法列出自上次生成以来每个更改的文件?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Krzysztof Błażełek    7 年前

    node {
        checkout([$class: 'GitSCM', branches: [[name: 'YOUR_BRANCH']],
         userRemoteConfigs: [[url: 'YOUR_GIT_URL']]])      
        stage('TEST') {
            def changeLogSets = currentBuild.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]
                entry.getAffectedPaths().each {
                    echo "Change detected: ${it}"   
                }
              }
            }
        }
    }
    
        2
  •  1
  •   laughedelic    7 年前

    要以更实用的方式解释Krzysztof的答案,您可以得到一组修改后的路径,如下所示:

    def paths = currentBuild
      .changeSets.collectMany {
        it.items.collectMany {
          it.affectedPaths
        }
      }.unique()
    

    你可以和我核对一下 echo paths.join('\n') script 步骤。