How to write custom groovy script to easily manipulate data from all commits since last successful build?
Asked
Active
Viewed 5,806 times
1
-
Do you use the groovy script in a build step by groovy plugin or just test in script console? If itβs in a build step, can you give more detail about your configuration? β Marina Liu Feb 27 '17 at 07:52
-
@marina-MSFT changed the answer β Bato-Bair Tsyrenov Mar 01 '17 at 04:58
1 Answers
5
Add new build step after gradle/maven step -> Execute system groovy script.
Adaptable code:
import com.tikal.jenkins.plugins.multijob.*
import hudson.*
import hudson.model.*
import hudson.plugins.git.*
import hudson.slaves.*
import hudson.tasks.*
def ln = System.getProperty('line.separator')
println "---------------Groovy Changelog script Started---------------$ln"
def lastSuccesfulBuild = build.previousNotFailedBuild
def failed = build.result != hudson.model.Result.SUCCESS
println "Last Succesful Build: ${lastSuccesfulBuild}"
println "Current Build Result, is failed?: ${failed}"
def currResult = build.result
def prevResult = build.previousBuild?.result ?: null
def consecutiveSuccess = currResult == hudson.model.Result.SUCCESS && prevResult == hudson.model.Result.SUCCESS
def builds = []
def changes = []
def count = 0
if (consecutiveSuccess) {
println "Last Build was sucessful, getting latest changes$ln"
builds << build
def changeItems = build.changeSet.items
println "Change Items: ${changeItems}$ln"
count += changeItems.length
changes += changeItems as List
} else {
println "Last Build was not sucessful, getting changes from all failed build as well$ln"
println "BUILD: $build$ln"
println "Hudson version: $build.hudsonVersion$ln"
println "Change set: $build.changeSet$ln"
println "Change set items: $build.changeSet.items$ln"
while (lastSuccesfulBuild) {
builds << lastSuccesfulBuild
def changeSet = lastSuccesfulBuild.changeSet
if (!changeSet.emptySet) {
def changeItems = lastSuccesfulBuild.changeSet.items
count += changeItems.length
changes += changeItems as List
}
lastSuccesfulBuild = lastSuccesfulBuild.nextBuild
}
}
def file = new File(build.getEnvVars()["WORKSPACE"] + '\\changelog')
file.delete()
file = new File(build.getEnvVars()["WORKSPACE"] + '\\changelog')
if (count ==0){
file << "No changes.$ln"
}
changes.each { item ->
println "item: $item$ln"
println "author: $item.authorName$ln"
println "msg: $item.msg$ln"
println "id: $item.id$ln"
println "revision: $item.revision$ln"
println "comment: $item.comment$ln"
println "commentAnnotated: $item.commentAnnotated$ln"
println "affectedFiles: $item.affectedFiles$ln"
println "affectedPaths: $item.affectedPaths$ln"
println "commitId: $item.commitId$ln"
println "timestamp: $item.timestamp$ln"
println "date: $item.date$ln"
file << "Commit ID: $item.id, by $item.author on $item.date, timestamp: $item.timestamp$ln"
file << "$item.comment$ln"
item.affectedFiles.each { cl ->
println "editType: $cl.editType.description$ln"
println "changeSet: $cl.changeSet$ln"
println "path: $cl.path$ln"
println "src: $cl.src$ln"
println "dst: $cl.dst$ln"
file << "$cl.editType.description: $cl.path$ln"
}
file << "$ln"
}
println "---------------Groovy Changelog script Finished---------------$ln"

Bato-Bair Tsyrenov
- 1,174
- 3
- 17
- 40
-
This seems to include the changes from the last successful build because you have `lastSuccesfulBuild = lastSuccesfulBuild.nextBuild` the last statement in the while-loop, is that correct? I thought you wanted to exclude the last successful build all the way to the current build? I'm asking this because I need the same thing to implement automatic versioning and I need to loop through the comments to identify the change types so I can bump up the version based on that β xbmono Apr 18 '19 at 00:12