我正在寻找一种方法来修改Jenkins中的changeset列表,以列出自上次成功构建以来的所有更改,而不是自上次构建以来的所有更改,而不管状态如何。
对于多分支管道,有办法做到这一点吗?
我需要它在我的changeSet中,因为我需要jira插件来获取所有这些提交。
到目前为止,这就是我所拥有的
@NonCPS
def commitHashForBuild(build) {
def scmAction = build?.actions.find { action -> action instanceof jenkins.scm.api.SCMRevisionAction }
return scmAction?.revision?.hash
}
def getLastSuccessfulCommit() {
def lastSuccessfulHash = null
def lastSuccessfulBuild = currentBuild.rawBuild.getPreviousSuccessfulBuild()
if ( lastSuccessfulBuild ) {
lastSuccessfulHash = commitHashForBuild(lastSuccessfulBuild)
}
return lastSuccessfulHash
}
def modifyChangeSets(commits){
currentBuild.rawBuild.changeSets = commits
}
def call(Map config) {
def lastSuccessfulCommit = getLastSuccessfulCommit()
def currentCommit = commitHashForBuild(currentBuild.rawBuild)
commits = sh(script: "git rev-list $currentCommit \"^$lastSuccessfulCommit\" --pretty=oneline --abbrev-commit ", returnStdout: true).trim().split('\n').collect{it}
modifyChangeSets(commits)
}
控制台中没有错误,但是变更列表根本没有生成,它破坏了状态UI屏幕。
发布于 2022-07-08 22:46:34
您可以使用下面的Groovy代码从上一次成功构建中获取changeSets。
def allChangeSetsFromLastSuccessfulBuild() {
def job = Jenkins.instance.getItem("$JOB_NAME")
def lastSuccessBuild = job.lastSuccessfulBuild.number as int
def currentBuildId = "$BUILD_ID" as int
def changeSets = []
for(int i = lastSuccessBuild + 1; i < currentBuildId; i++) {
echo "Getting Change Set for the Build ID : ${i}"
def chageSet = job.getBuildByNumber(i).getChangeSets()
changeSets.addAll(chageSet)
}
changeSets.addAll(currentBuild.changeSets) // Add the current Changeset
return changeSets
}
全管道实例
函数getFilesChanged
将返回在所有更改集中更改的文件列表。
pipeline {
agent any
stages {
stage('Build') {
steps {
git (url: 'https://github.com/xxx/sample.git', branch: 'main')
script {
def changeSets = allChangeSetsFromLastSuccessfulBuild()
echo "ChangeSet Size : ${changeSets.size()}"
echo "Files Changed : ${getFilesChanged(changeSets)}"
}
}
}
}
}
def allChangeSetsFromLastSuccessfulBuild() {
def job = Jenkins.instance.getItem("$JOB_NAME")
def lastSuccessBuild = job.lastSuccessfulBuild.number as int
def currentBuildId = "$BUILD_ID" as int
def changeSets = []
for(int i = lastSuccessBuild + 1; i < currentBuildId; i++) {
echo "Getting Change Set for the Build ID : ${i}"
def chageSet = job.getBuildByNumber(i).getChangeSets()
changeSets.addAll(chageSet)
}
changeSets.addAll(currentBuild.changeSets) // Add the current Changeset
return changeSets
}
def getFilesChanged(chgSets) {
def filesList = []
def changeLogSets = chgSets
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 files = new ArrayList(entry.affectedFiles)
for (int k = 0; k < files.size(); k++) {
def file = files[k]
filesList.add(file.path)
}
}
}
return filesList
}
https://stackoverflow.com/questions/72911958
复制相似问题