为什么Jenkins在沙箱中运行共享管道库?

时间:2018-01-29 23:14:09

标签: jenkins jenkins-pipeline jenkins-shared-libraries

我创建了一个git repo,其中包含位于src/com/me的以下文件:

package com.me
import com.cloudbees.groovy.cps.NonCPS

class JobTriggerInfo implements Serializable {
    def script
    JobTriggerInfo(script)
    {
         this.script = script
    }

    // Source originally from: 
    //   https://hopstorawpointers.blogspot.com/2016/10/performing-nightly-build-steps-with.html
    @NonCPS
    wasStartedByTimer() {
        def startedByTimer = false
        try {
            def buildCauses = script.currentBuild.rawBuild.getCauses()
            for ( buildCause in buildCauses ) {
                if (buildCause != null) {
                    def causeDescription = buildCause.getShortDescription()
                    script.echo "shortDescription: ${causeDescription}"
                    if (causeDescription.contains("Started by timer")) {
                        startedByTimer = true
                    }
                }
            }
        } catch(theError) {
            script.echo "Error getting build cause"
        }
        return startedByTimer
    }
}

然后我将git repo添加到Manage Jenkins的“Global Pipeline Libraries”部分 - >配置系统。

然后我使用以下管道脚本创建了一个简单的管道项目:

@Library('JSL') 
import com.me.JobTriggerInfo
node {
   stage('Preparation') { 
           echo 'Hello World'
           startedByTimer = false 
           script {
               startedByTimer = new com.me.JobTriggerInfo(this).wasStartedByTimer
           }   
            echo 'Was started by timer?'
            echo startedByTimer.toString()
   }
}

当我运行作业时,它失败了:

  

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException:不允许使用方法的脚本groovy.lang.GroovyObject getProperty java.lang.String(com.me.JobTriggerInfo.wasStartedByTimer)

我的理解是全局管道库将基于official Jenkins docs在沙箱外运行。

我错过了什么?要从全局管道库而不是沙箱中运行此代码,我需要做什么?

1 个答案:

答案 0 :(得分:0)

根本原因是我的脚本中缺少括号。脚本节中的行必须是:

startedByTimer = new com.me.JobTriggerInfo(this).wasStartedByTimer()

令人困惑的是报告的错误消息没有直接表明这是问题所在。