Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jenkins管道文件不工作时Groovy中的字符串插值_Groovy_Jenkins Pipeline_String Interpolation - Fatal编程技术网

Jenkins管道文件不工作时Groovy中的字符串插值

Jenkins管道文件不工作时Groovy中的字符串插值,groovy,jenkins-pipeline,string-interpolation,Groovy,Jenkins Pipeline,String Interpolation,因此,我有一个Jenkins管道,它使用Jenkins管道提供的readFile方法读取文本文件(JSON)。文本文件app.JSON有多个变量,这些变量已经在Jenkins管道中定义 虽然readFile读取文件并将其转换为字符串,但它不会插入这些变量。除了简单的字符串替换(我想避免)之外,我还有哪些选项可以插入这些变量 我知道我可以使用readJSON或JSON解析器,但我希望输出为字符串,这样我就更容易将其作为字符串读取并传递 我尝试过使用gstring、${->variable}和.to

因此,我有一个Jenkins管道,它使用Jenkins管道提供的readFile方法读取文本文件(JSON)。文本文件app.JSON有多个变量,这些变量已经在Jenkins管道中定义

虽然readFile读取文件并将其转换为字符串,但它不会插入这些变量。除了简单的字符串替换(我想避免)之外,我还有哪些选项可以插入这些变量

我知道我可以使用readJSON或JSON解析器,但我希望输出为字符串,这样我就更容易将其作为字符串读取并传递

我尝试过使用gstring、${->variable}和.toString()方法。对我来说什么都不管用

詹金斯管道代码

appServerName = 'gaga'
def appMachine = readFile file: 'util-silo-create-v2/app.json'
println appMachine
app.json

{
   "name":"${appServerName}",
   "fqdn":"${appServerName}"
}
管道和app.json中都有多个变量需要替换

问题在于Jenkins管道提供的readFile方法。虽然它非常整洁且易于使用,但它不插入字符串

我预计产量低于预期

印刷机

{
   "name":"gaga",
   "fqdn":"gaga"
}
我得到的输出

{
   "name":"${appServerName}",
   "fqdn":"${appServerName}"
}

您认为
readFile
step(或从文本文件读取内容的任何其他方法)应该绑定当前范围中的变量并在原始文本中插入变量占位符的假设是错误的。但是,您可以使用Groovy模板引擎调用类似于GString变量插值的东西。考虑下面的例子:

import groovy.text.SimpleTemplateEngine

def jsonText = '''{
   "name":"${appServerName}",
   "fqdn":"${appServerName}"
}'''

@NonCPS
def parseJsonWithVariables(String json, Map variables) {
    def template = new SimpleTemplateEngine()
    return template.createTemplate(json).make(variables.withDefault { it -> "\${$it}" }).toString()
}

node {
    stage("Test") {
        def parsed =  parseJsonWithVariables(jsonText, [
            appServerName: "gaga"
        ])

        echo parsed
    }
}
方法
parseJsonWithVariables
实现了您期望得到的结果。使此方法成为
@NonCPS
非常关键,因为
SimpleTemplateEngine
以及使用
withDefault()
创建的映射不可序列化。它接受以前从文件读取的JSON(在本例中,为了简单起见,我使用了一个变量)和一个参数映射。它将此映射转换为具有默认值的映射(部分
variables.withDefault{…}
负责),因此模板引擎不会抱怨没有具有给定名称的属性。在这种情况下,默认方法返回一个变量“原样”,但您可以返回空字符串或
null
值。无论什么对你更好

当您运行它时,您将看到以下内容:

[Pipeline]管道的开始(隐藏)
[管道]节点
[管道]{
[管道]阶段
[管道]{(测试)
[管道]回声
{
“姓名”:“嘎嘎”,
“fqdn”:“gaga”
}
[管道]}
[管道]//阶段
[管道]}
[管道]//节点
[管道]管道末端
完成:成功
尝试使用
文件(${Jenkins.instance.getJob('jobname').workspace}/util-silo-create-v2/appJSON.json”).getText()
也希望可以对其进行插值,但结果是
java.io.File
方法将引用运行Jenkins的主机上的文件,而不是从机上的当前工作区中的文件。要引用从机上的文件,只能使用readFile方法