You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将构建参数传入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 19:08:10