Jenkins获取变更记录java.io.NotSerializableException: hudson.plugins.git.GitChangeSetList

本文探讨了JenkinsPipelineJob如何在重启后恢复运行,解释了后台保存job状态的机制,包括控制流程、变量序列化及@NonCPS注解的使用。介绍了将不可序列化操作封装为函数的方法,并给出具体示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

pipeline job为了支持能够在jenkins重启后恢复继续运行,jenkins在后台定期地将job的运行状态保存到硬盘。保存的动作一般在每个step结束后,或者在一些step的中间,例如sh step的中间。
jenkins保存的job的状态,包括整个控制流程,例如局部变量,循环所在的位置,等等。正因为如此,groovy里的任何变量必须是number,string或可序列化的类型,其他的例如网络连接等是不能够序列化的。

然而最安全的方法是将不可序列化的语句隔离到函数中,且在函数的前面增加属性@NonCPS。通过这种方法pipeline将识别此函数为native且不保存对应的局部变量。另外使用了@NoCPS的函数中不能够调用其他的pipeline steps

 

因此把获取git变更记录语句封装成一个函数放在pipeline语句外面:

pipeline
{
    agent any
    stages
    {
        stage('DownloadTestCode')
        {
            steps
            {
                echo '############ test ############'
            }
        }
    }
    
  post
    {            
        always 
        {
            script
            {
                changes = getChanges()
                wrap([$class: 'BuildUser']) 
                {
                 
                    sh "python /home/Jenkins/DdRobot/DdRobot.py $env.JOB_NAME $BUILD_USER $env.BUILD_URL $currentBuild.currentResult $currentBuild.timeInMillis  $changes"
                }
            }
        }
    }
   
}
@NonCPS
def getChanges()
{
    MAX_MSG_LEN = 100
    def changeString = ""
    def changeLogSets = currentBuild.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]
            change_msg = entry.msg.take(MAX_MSG_LEN)
            changeString += " ${change_msg} \n"
        }
    }
    if (!changeString)
    {
        changeString = " No changes "
    }
    return changeString  
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值