3

我在 repo 中有一个 Jenkins 共享库,通常的文件夹结构:

vars
  utils.groovy

在 utils.groovy 我有一些功能:

void funcA() {}
void funcB() {}

现在我想定义一个该模块中的所有函数都可以使用的常量,但是当我尝试这个时:

String common='hi'
void funcA() {println "A ${common}"}
void funcB() {println "B ${common}"}

我得到一个例外,即 common 不是一个存在的符号:

groovy.lang.MissingPropertyException: No such property: common for class: utils

现在我通过这个hack来解决这个问题:

String _getCommon() {
    return 'hi'
}
void funcA() {String common=_getCommon(); println "A ${common}"}
void funcB() {String common=_getCommon(); println "B ${common}"}
4

2 回答 2

7

模块级变量可以通过@Field 定义:

import groovy.transform.Field
@Field var =...
void func() {println var}

同一个库中的其他模块也可以按照通常的方式引用它。例如,假设上述内容是在 utils.groovy 中定义的,那么 other.groovy 可能具有:

void func() {println utils.var}

请参阅http://docs.groovy-lang.org/latest/html/gapi/groovy/transform/Field.html

于 2018-09-15T01:19:46.207 回答
3

看起来 CPS 类加载器不支持简单属性。然而事实证明,你可以使用类似的东西:

class InnerClass {
    static String myProperty = 'Hi'
}

String setCommon(String value) {
    InnerClass.myProperty = value
}

String getCommon() {
    return InnerClass.myProperty
}

void funcA() {println "A ${common}"}
void funcB() {println "B ${common}"}

有了这个,您还可以从 Jenkinsfile 中访问该属性,例如:

@Library('cpsLibFoo') _

utils.funcA()
utils.common = 'baz'
utils.funcB()

输出将是:

[Pipeline] echo
A Hi
[Pipeline] echo
B baz
[Pipeline] End of Pipeline
于 2018-09-14T21:03:18.323 回答