2016-06-28 17 views

答えて

11

私は何か一緒に何かをcobbleすることができました。私は、あなたがより良い配列を反復処理することができますかなり確信しているが、ここで私は今のところ持っているものです:私は、宣言パイプラインで使用するために以下のスクリプトを思い付いたCaptRespectからの回答をもとに

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; 
    } 
3

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 

これは、特定のファイルが変更されたときにのみステージを実行するのに非常に役立ちます。私はまだその部分に慣れていませんが、私はこれから共有ライブラリを作成し、チェックするためにいくつかのグロビングパターンを渡すことができるようにしたいと思います。

EDIT:Check the docs btw、少し深く掘り下げたい場合に備えて。 object.getSomeProperty()のすべてのコールをちょうどentry.somePropertyに変換できるはずです。

+0

ニース。 contrubuteに気を付けると、いくつかのパイプラインの例があるgithub repoがあります:https://github.com/jenkinsci/pipeline-examples – CaptRespect

+0

これは宣言的なパイプラインスタイルではなく、スクリプトによるパイプラインです! – Lincoln

+1

@ Lincoln、yup。あなたは宣言的にそれをすることはできません。あなたがしなければならないことは、それをスクリプトブロックにラップするか、共有ライブラリから使用することです。 – andsens

関連する問題