首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Jenkins:修改ChangeSet列表,使其自上次成功构建以来进行更改

Jenkins:修改ChangeSet列表,使其自上次成功构建以来进行更改
EN

Stack Overflow用户
提问于 2022-07-08 13:13:27
回答 1查看 408关注 0票数 0

我正在寻找一种方法来修改Jenkins中的changeset列表,以列出自上次成功构建以来的所有更改,而不是自上次构建以来的所有更改,而不管状态如何。

对于多分支管道,有办法做到这一点吗?

我需要它在我的changeSet中,因为我需要jira插件来获取所有这些提交。

到目前为止,这就是我所拥有的

代码语言:javascript
运行
复制
@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屏幕。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-08 22:46:34

您可以使用下面的Groovy代码从上一次成功构建中获取changeSets。

代码语言:javascript
运行
复制
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将返回在所有更改集中更改的文件列表。

代码语言:javascript
运行
复制
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
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72911958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档