【问题标题】:how to run vars/script.groovy from a Jenkins shared library如何从 Jenkins 共享库运行 vars/script.groovy
【发布时间】:2018-06-06 05:56:45
【问题描述】:

我试图从一个 groovy 脚本中获取信息,该脚本位于从共享库 Jenkins 类调用的 vars 下,但出现错误。一些信息:

  • 需要 - 全局配置文件。类似于 管理 Jenkins -> 配置系统 -> 环境变量

  • 目标 - 无需从 Jenkinsfile 发送参数即可在共享库中获取全局值。

  • 我的解决方案 - 我尝试使用适用于 Jenkinsfile 但不适用于共享库的“vars/script.groovy”。

文件结构

.
├── src
│   └── org
│       └── jenkins
│            └──shared_library.groovy 
│── vars
│      └── globals.groovy
│
│── jenkinsfile.groovy

vars/globals.groovy

def my_global() {
return 'my_global_name'
}

shared_library 类

package src.org.jenkins

class shared_library implements Serializable {
private steps

shared_library(steps) {
    this.steps = steps
}

def some_func(){
  println globals.my_global
}

jenkinsfile

@Library 'shared_library'
import org.jenkins.shared_library

my_shared_library = new shared_library(steps)

node(){
  stage('my_first_stage'){
    println globals.my_global
  }
  stage('my_second_stage'){
    println shared_library.some_func()
  }
}

所以,我可以看到管道中第一个打印的值,但第二个我得到:

没有这样的属性:类的全局变量:src.org.jenkins.shared_library

【问题讨论】:

    标签: jenkins-pipeline jenkins-shared-libraries


    【解决方案1】:

    您还需要使用 steps 对象来访问全局变量:

    def some_func(){
        println steps.globals.my_global()
    }
    

    以你的例子为例

    shared_library 类

    package src.org.jenkins
    
    class shared_library implements Serializable {
    private steps
    
    shared_library(steps) {
        this.steps = steps
    }
    
    def some_func(){
      println steps.globals.my_global()
    }
    

    编辑:刚刚看到您的 Jenkinsfile 也有错字。需要使用共享库对象而不是 'my_second_stage' 中的类:

    Jenkins 文件

    @Library('shared_library')
    import org.jenkins.shared_library
    
    my_shared_library = new shared_library(steps)
    
    node(){
      stage('my_first_stage'){
        println globals.my_global()
      }
      stage('my_second_stage'){
        println my_shared_library.some_func()
      }
    }
    

    【讨论】:

    • 我试过了,但它在共享库 groovy 文件中不起作用。可以加个例子吗?
    • 添加了完整的示例。什么不起作用?您收到错误消息吗?
    • 我按照你的例子,但不断收到“groovy.lang.MissingPropertyException:没有这样的属性:类的全局变量:org.jenkinsci.plugins.workflow.cps.DSL”我认为你必须有“@Library ('xxx')" 以便能够从 vars/globals.groovy 获取信息。
    • @Library('shared_library')(添加大括号)如果你在 vars 中有 globals.groovy 就足够了。您是如何配置全局共享库的?都签到了吗?存储库配置是否正确?
    • 完全正确。但我的 shared_library 类中没有 @Library('shared_library') 。我的例子和你的完全一样。我为它创建了一个简单的新项目,并将我的“测试”shared_library 类添加到 Jenkins 配置中。我可以使用 jenkins_file 中的全局变量,但是一旦调用一个 func 就出现了错误,该函数如您所描述的那样放置了“println steps.globals.my_global”......谢谢!
    【解决方案2】:

    如果您对在 .properties 或 .json 文件中定义值感到满意,您可以使用“资源”文件夹

    sharedlibrary/resource/global.properties

    在您的管道脚本或 var/script.groovy 中

    使用 libraryResource 方法

    globalPropertyContent = libraryResource 'global.properties'
    

    访问属性值,例如:

    globalPropertyContent.PROJECT_NAME
    

    【讨论】:

    • 我试过了,但它在共享库 groovy 文件中不起作用 - “资源目录允许从外部库使用 libraryResource 步骤来加载关联的非 Groovy 文件。目前不支持此功能用于内部图书馆。” jenkins.io/doc/book/pipeline/shared-libraries
    猜你喜欢
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 2020-07-09
    • 2018-11-27
    • 2018-09-16
    • 1970-01-01
    相关资源
    最近更新 更多