如何将构建参数传入Jenkins共享库并在其中设置环境变量
问题:Jenkins声明式流水线调用共享库报错,参数传递与环境变量设置异常
报错信息
Scripts not permitted to use method groovy.lang.GroovyObject invokeMethod java.lang.String java.lang.Object (org.jenkinsci.plugins.workflow.cps.CpsClosure2 build org.codehaus.groovy.runtime.GStringImpl). Administrators can decide whether to approve or reject this signature.
现有代码
Jenkinsfile
#!groovy @Library('my-jenkins-shared-lib')_ pipeline { agent any options { disableConcurrentBuilds(abortPrevious: true) } parameters { string(description: 'Git Repository (HTTPS URL)', name: 'git_url', defaultValue: 'https://git.myrepo.com:8443/scm/my_workspace/', trim: true) choice(choices: 'Build\nPromote', description: 'Select the run type', name: 'runtype') string(description: 'Enter the git branch to be built', name: 'branch', defaultValue: 'master', trim: true) credentials(credentialType: 'com.cloudbees.plugins.credentials.common.StandardCredentials', defaultValue: '', description: 'Select Credentials for Git checkout', name: 'git_credentials', required: true) } stages { stage('Clean') { steps { cleanWs() } } stage('Checkout') { steps { script { if ( params.branch == '') { echo "Building commit with Tag: master" checkout changelog: false, poll: false, scm: [$class: 'GitSCM', branches: [[name: 'master']], extensions: [], userRemoteConfigs: [[credentialsId: params.git_credentials, url: params.git_url]]] echo "Built at path: ${WORKSPACE}" sh 'ls -l ${WORKSPACE}' } else { echo "Building commit with Tag: ${params.branch}" checkout changelog: false, poll: false, scm: [$class: 'GitSCM', branches: [[name: params.branch]], extensions: [], userRemoteConfigs: [[credentialsId: params.git_credentials, url: params.git_url]]] echo "Built at path: ${WORKSPACE}" } } } } stage('Build') { steps { build "${params.git_url}" "${params.runtype}" } } } } }
共享库 vars/build.groovy
def call(String git_url, String runtype) { env.VERSION = sh script: 'grep -m 1 version_number ${WORKSPACE}/ComponentInfo.toml | tr -s \' \' | tr -d \'"\' | tr -d "\'" | cut -d\' \' -f3', returnStdout: true echo "Version: ${env.VERSION}" env.PROJECT = sh script: 'echo '+git_url+'|rev|cut -d\'/\' -f1|cut -d\'.\' -f2|rev', returnStdout: true echo "Project: ${env.PROJECT}" env.BASEPATH = sh script: 'echo ${WORKSPACE%/*}' , returnStdout: true if ( runtype == 'Build') { env.ZIP_FILEPATH = "${env.BASEPATH.trim()}/${env.PROJECT.trim()}-${env.VERSION.trim()}-SNAPSHOT.zip" } else if ( runtype == 'Promote') { env.ZIP_FILEPATH = "${env.BASEPATH.trim()}/${env.PROJECT.trim()}-${env.VERSION.trim()}.zip" } echo "Zip File Path: ${env.ZIP_FILEPATH}" zip defaultExcludes: false, exclude: '*.git, *.log, *.idea, dist', glob: '', overwrite: true, zipFile: env.ZIP_FILEPATH sh "md5sum "+env.ZIP_FILEPATH.trim()+" | awk '{printf \$1}' > "+env.ZIP_FILEPATH+".md5" sh "sha1sum "+env.ZIP_FILEPATH.trim()+" | awk '{printf \$1}' > "+env.ZIP_FILEPATH+".sha1" sh "sha256sum "+env.ZIP_FILEPATH.trim()+" | awk '{printf \$1}' > "+env.ZIP_FILEPATH+".sha256" sh "sha512sum "+env.ZIP_FILEPATH.trim()+" | awk '{printf \$1}' > "+env.ZIP_FILEPATH+".sha512" sh "ls -lrt "+env.BASEPATH }
解决方案
1. 修正共享库调用方式(核心错误)
Jenkins内置的build步骤用于触发其他Job构建,和共享库的build方法重名,且原调用的字符串拼接方式会触发权限检查。修改Build阶段代码:
stage('Build') { steps { script { // 直接传递参数给共享库的build方法 build(params.git_url, params.runtype) } } }
声明式流水线中调用自定义共享库方法,建议包裹在script块中确保执行逻辑正确。
2. 授权脚本权限
登录Jenkins后台,依次操作:
- 进入 Manage Jenkins > In-process Script Approval
- 找到报错对应的权限请求条目,点击Approve完成授权
- 后续若出现新的权限请求,重复此操作即可(不建议过度开放安全权限)
3. 优化环境变量设置(去除换行符)
sh步骤返回的标准输出会包含换行符,导致环境变量带无效字符,需用.trim()清理。修改共享库vars/build.groovy:
def call(String git_url, String runtype) { // 读取VERSION并去除换行 env.VERSION = sh(script: 'grep -m 1 version_number ${WORKSPACE}/ComponentInfo.toml | tr -s \' \' | tr -d \'"\'"\'\' | cut -d\' \' -f3', returnStdout: true).trim() echo "Version: ${env.VERSION}" // 读取PROJECT并去除换行 env.PROJECT = sh(script: "echo ${git_url} | rev | cut -d'/' -f1 | cut -d'.' -f2 | rev", returnStdout: true).trim() echo "Project: ${env.PROJECT}" // 读取BASEPATH并去除换行 env.BASEPATH = sh(script: 'echo ${WORKSPACE%/*}', returnStdout: true).trim() if (runtype == 'Build') { env.ZIP_FILEPATH = "${env.BASEPATH}/${env.PROJECT}-${env.VERSION}-SNAPSHOT.zip" } else if (runtype == 'Promote') { env.ZIP_FILEPATH = "${env.BASEPATH}/${env.PROJECT}-${env.VERSION}.zip" } echo "Zip File Path: ${env.ZIP_FILEPATH}" zip defaultExcludes: false, exclude: '*.git, *.log, *.idea, dist', glob: '', overwrite: true, zipFile: env.ZIP_FILEPATH // 简化哈希值生成脚本,避免字符串拼接出错 sh """ md5sum ${env.ZIP_FILEPATH} | awk '{printf \$1}' > ${env.ZIP_FILEPATH}.md5 sha1sum ${env.ZIP_FILEPATH} | awk '{printf \$1}' > ${env.ZIP_FILEPATH}.sha1 sha256sum ${env.ZIP_FILEPATH} | awk '{printf \$1}' > ${env.ZIP_FILEPATH}.sha256 sha512sum ${env.ZIP_FILEPATH} | awk '{printf \$1}' > ${env.ZIP_FILEPATH}.sha512 """ sh "ls -lrt ${env.BASEPATH}" }
4. 简化Checkout阶段冗余代码
原Checkout阶段的分支判断可以合并,减少重复代码:
stage('Checkout') { steps { script { def branchName = params.branch ?: 'master' echo "Building commit with Tag: ${branchName}" checkout changelog: false, poll: false, scm: [ $class: 'GitSCM', branches: [[name: branchName]], extensions: [], userRemoteConfigs: [[credentialsId: params.git_credentials, url: params.git_url]] ] echo "Built at path: ${WORKSPACE}" sh 'ls -l ${WORKSPACE}' } } }
内容的提问来源于stack exchange,提问作者aiman
相关产品推荐
相关产品推荐

