-
-
Save ftclausen/8c46195ee56e48e4d01cbfab19c41fc0 to your computer and use it in GitHub Desktop.
// -*- mode: groovy -*- | |
// vim: set filetype=groovy : | |
node( 'some_node' ) { | |
stage( "Phase 1" ) { | |
sshagent( credentials: [ 'some_creds' ] ) { | |
checkout scm | |
def lastSuccessfulCommit = getLastSuccessfulCommit() | |
def currentCommit = commitHashForBuild( currentBuild.rawBuild ) | |
if (lastSuccessfulCommit) { | |
commits = sh( | |
script: "git rev-list $currentCommit \"^$lastSuccessfulCommit\"", | |
returnStdout: true | |
).split('\n') | |
println "Commits are: $commits" | |
} | |
} | |
} | |
} | |
def getLastSuccessfulCommit() { | |
def lastSuccessfulHash = null | |
def lastSuccessfulBuild = currentBuild.rawBuild.getPreviousSuccessfulBuild() | |
if ( lastSuccessfulBuild ) { | |
lastSuccessfulHash = commitHashForBuild( lastSuccessfulBuild ) | |
} | |
return lastSuccessfulHash | |
} | |
/** | |
* Gets the commit hash from a Jenkins build object, if any | |
*/ | |
@NonCPS | |
def commitHashForBuild( build ) { | |
def scmAction = build?.actions.find { action -> action instanceof jenkins.scm.api.SCMRevisionAction } | |
return scmAction?.revision?.hash | |
} |
Hi, another option (as described on the SO question) is to use Last Changes plugin, following is a (scripted) pipeline example:
node {
stage("checkout") {
git url: 'https://github.com/jenkinsci/last-changes-plugin.git'
}
stage("last-changes") {
def publisher = LastChanges.getLastChangesPublisher "LAST_SUCCESSFUL_BUILD", "SIDE", "LINE", true, true, "", "", "", "", ""
publisher.publishLastChanges()
def changes = publisher.getLastChanges()
println(changes.getEscapedDiff())
for (commit in changes.getCommits()) {
println(commit)
def commitInfo = commit.getCommitInfo()
println(commitInfo)
println(commitInfo.getCommitMessage())
println(commit.getChanges())
}
}
}
Note that by default (without the need for groovy scripting) the plugin makes the list of commits available for browsing on the jenkins UI, see here.
I hope it helps.
maybe not completely related, but useful nevertheless. I needed to obtain the branch name without using the env.
@NonCPS
def branchForBuild( build ) {
def scmAction = build?.actions.find { action -> action instanceof jenkins.scm.api.SCMRevisionAction }
return scmAction?.revision?.head?.getName()
}
@belsander thank you! I've used this to retrieve commit hash from which Jenkinsfile was cloned to execute inside GitHub Organization Folder https://gist.github.com/oxygenxo/930980d79ab09c74da34be459563f760
Solution using jenkins changelogsets
@NonCPS
def getAllChangeResults() {
def result = getChangeStringForBuild(currentBuild)
def buildToCheck = currentBuild.getPreviousBuild()
while (buildToCheck != null && buildToCheck.result != 'SUCCESS') {
result += "\nBuild #${buildToCheck.number} [${buildToCheck.result}]\n"
result += getChangeStringForBuild(buildToCheck)
buildToCheck = buildToCheck.previousBuild
}
return result
}
@NonCPS
def getChangeStringForBuild(build) {
MAX_MSG_LEN = 60
echo "Gathering SCM changes"
def changeLogSets = build.changeSets
def changeString = ""
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]
def truncated_msg = entry.msg.take(MAX_MSG_LEN)
if (entry.msg.length() > MAX_MSG_LEN) {
truncated_msg += "..."
}
changeString += "-[@${entry.author.getFullName().toLowerCase()}][${entry.commitId.take(6)}]: ${truncated_msg}\n"
}
}
if (!changeString) {
changeString = " - No new changes"
}
return "${changeString}"
}
Has anyone else having trouble with getRevisionList()
?
I keep receiving the following
[ERROR: getRevisionList]: org.jenkinsci.plugins.workflow.job.WorkflowRun
I believe its due to the git rev-list
shell command as my multi-branch pipeline jobs are being merged before any building occurs. Seems to be comparing the same commit and erroring out. Testing the git rev-list on my local machine seems to output a bunch of git sha's out.
roman-acumen commented on Nov 22, 2019
Thank you!
@NonCPS
def commitHashForBuild( build ) {
def scmAction = build?.actions.find { action -> action instanceof jenkins.scm.api.SCMRevisionAction }
return scmAction?.revision?.hash
}
Does this only works with multibranch pipeline jobs and doesnot work with regular jobs? This doesnot seem to work for me for regular jobs..
in a multi branch pipeline there is a env var exposed GIT_PREVIOUS_COMMIT
. This seems to be the commit of the last build however regardless of pass fail.
Is there a way i can get the getLastSuccessfulCommit in a Declarative Pipeline ?
GIT_PREVIOUS_SUCCESSFUL_COMMIT
is the environment variable exposed by jenkins build and provides the last successful build git commit.
GIT_PREVIOUS_SUCCESSFUL_COMMIT
is the environment variable exposed by jenkins build and provides the last successful build git commit.
simple variable! it works.
Thanks - that was useful