Jenkins Pipeline-我需要一个全局配置对象,这样对待工作区根目录中的文件不是个好主意吗?

Jenkins Pipeline-我需要一个全局配置对象,这样对待工作区根目录中的文件不是个好主意吗?,jenkins,groovy,jenkins-pipeline,Jenkins,Groovy,Jenkins Pipeline,我正在编写一个有点复杂的全局管道库。该库实际上只是编排了一个复杂的构建,一系列步骤以vars/*的形式公开,一个src/com/myorg/pipeline/utils.groovy类处理所有常见的功能。每个Jenkins文件定义所有特定于“构建”的配置,并将其传递给vars/myBuildFlavor.groovy步骤,然后该步骤调用该构建风格所需的所有步骤。vars/myBuildFlavor.groovy步骤还读取包含每个Jenkins实例全局配置的所有配置的服务器配置文件 这个设置非常好

我正在编写一个有点复杂的全局管道库。该库实际上只是编排了一个复杂的构建,一系列步骤以vars/*的形式公开,一个src/com/myorg/pipeline/utils.groovy类处理所有常见的功能。每个Jenkins文件定义所有特定于“构建”的配置,并将其传递给vars/myBuildFlavor.groovy步骤,然后该步骤调用该构建风格所需的所有步骤。vars/myBuildFlavor.groovy步骤还读取包含每个Jenkins实例全局配置的所有配置的服务器配置文件

这个设置非常好。它允许用户从我在全局库中公开的步骤中拼凑出自己的构建,或者在他们的Jenkins文件中设置所有构建属性,并调用我作为一个步骤公开的构建的现有风格。我正在努力解决的是如何从“构建”和“服务器”配置中访问配置值,另外,我在构建的早期步骤中有一些随机属性,我希望在构建的后期保存和使用这些属性。令人非常恼火的是,我必须用“this”传递脚本的整个上下文,或者使用非常长的方法签名来处理所有这些值的杂耍


我认为最好是在工作区根目录中编写一个文件,其中包含所有构建和服务器配置值,以及我以后在构建中需要的任何属性。以前有人处理过这个问题吗?我的方法有什么大问题吗?更好的主意?

我还没试过这个,但你让我想确保它有效。如果你不抢先一步,我会给你一个机会,所以请你回去报告

vars中的东西被创建为单例。所以我认为你应该可以做这样的事情:

// vars/customConfig.groovy
class customConfig implements Serializable {
    private String url
    private Map allTheThings

    def setUrl(myUrl) {
        url = myUrl
    }
    def getUrl() {
        url
    }

    def setAllTheThings(Map configMap) {
        allTheThings = configMap
    }
    def getAllTheThings() {
        return allTheThings
    }


    def coolMethod(myVar) {
        echo "This method does something cool with the ${myVar} and with ${name}"
    }
}
然后访问以下内容:

customConfig.url = 'https://www.google.com'
echo ${customConfig.url}"
customConfig.coolMethod "FOOBAR"
customConfig.allTheThings.configItem1 = "BAZ"
customConfig.allTheThings.configItem2 = 12345
echo "${customConfig.allTheThings.configItem2} is an Int"
因为它是一个“全局变量”或单个变量,所以我认为您可以在任何地方使用它,并且所有值都是共享的


让我知道这是否符合我的想法

我还没试过这个,但你让我想确保它能正常工作。如果你不抢先一步,我会给你一个机会,所以请你回去报告

vars中的东西被创建为单例。所以我认为你应该可以做这样的事情:

// vars/customConfig.groovy
class customConfig implements Serializable {
    private String url
    private Map allTheThings

    def setUrl(myUrl) {
        url = myUrl
    }
    def getUrl() {
        url
    }

    def setAllTheThings(Map configMap) {
        allTheThings = configMap
    }
    def getAllTheThings() {
        return allTheThings
    }


    def coolMethod(myVar) {
        echo "This method does something cool with the ${myVar} and with ${name}"
    }
}
然后访问以下内容:

customConfig.url = 'https://www.google.com'
echo ${customConfig.url}"
customConfig.coolMethod "FOOBAR"
customConfig.allTheThings.configItem1 = "BAZ"
customConfig.allTheThings.configItem2 = 12345
echo "${customConfig.allTheThings.configItem2} is an Int"
因为它是一个“全局变量”或单个变量,所以我认为您可以在任何地方使用它,并且所有值都是共享的


让我知道这是否符合我的想法

我想这是可行的,但是您仍然需要将customConfig对象传递给vars中定义的所有步骤。如果您的构建是“平面”的,并且完全包含在一个Jenkins文件中,这将非常有用,但是我的构建非常复杂,并且在现有的vars步骤中调用多个vars步骤。我想传递customConfig对象并没有那么糟糕,但是如果我在任何地方都传递了一些东西,那么我也可以传递整个脚本上下文。基本上,这是一个非常奇怪的范例。我很难把我的头脑集中在好的设计上——我的设计很好用,但它非常凌乱。我不认为你必须把它传给别人。这是一个单身汉。你不能在任何地方按名称访问它?我在文档中也是这么想的,但是如果我在一个vars步骤defaultBuildType()中设置customConfig.url,然后调用另一个vars步骤doSomeBuildStep()和echo customConfig.url,customConfig.url将为null。我必须将customConfig传递给doSomeBuildStep(),才能访问customConfig.url的值,例如doSomeBuildStep(customConfig).Wow。这是令人惊讶的。现在,我必须建立这个,并与它一起玩,看看我是否能理解正在发生的事情。也许它只在主管道脚本中起作用,在其他变量中超出了范围。是的,这肯定是正在发生的事情。我还尝试在Jenkins文件中设置值,然后从vars步骤获取它们,但singleton返回null。我认为customConfig单例的作用域仅限于它所设置的vars(或Jenkinsfile)文件。我想这是可行的,但您仍然需要将customConfig对象传递给vars中定义的所有步骤。如果您的构建是“平面”的,并且完全包含在一个Jenkins文件中,这将非常有用,但是我的构建非常复杂,并且在现有的vars步骤中调用多个vars步骤。我想传递customConfig对象并没有那么糟糕,但是如果我在任何地方都传递了一些东西,那么我也可以传递整个脚本上下文。基本上,这是一个非常奇怪的范例。我很难把我的头脑集中在好的设计上——我的设计很好用,但它非常凌乱。我不认为你必须把它传给别人。这是一个单身汉。你不能在任何地方按名称访问它?我在文档中也是这么想的,但是如果我在一个vars步骤defaultBuildType()中设置customConfig.url,然后调用另一个vars步骤doSomeBuildStep()和echo customConfig.url,customConfig.url将为null。我必须将customConfig传递给doSomeBuildStep(),才能访问customConfig.url的值,例如doSomeBuildStep(customConfig).Wow。这是令人惊讶的。现在,我必须建立这个,并与它一起玩,看看我是否能理解正在发生的事情。也许它只在主管道脚本中起作用,在其他变量中超出了范围。是的,这肯定是正在发生的事情。我还尝试在Jenkins文件中设置值,然后从vars步骤获取它们,但singleton返回null。我认为customConfig单例的作用域仅限于它所设置的vars(或Jenkinsfile)文件。