groovy - Groovy 中的字符串插值与 Jenkins 流水线文件不起作用

标签 groovy jenkins-pipeline string-interpolation

所以我有一个 Jenkins Pipeline,它使用 Jenkins Pipeline 提供的 readFile 方法读取文本文件(JSON)。文本文件 app.JSON 有多个变量,这些变量已在 Jenkins 流水线中定义。

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

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

我尝试过使用 Gstrings、${-> variable} 和 .toString() 方法。没有什么对我有用。

Jenkins 管道代码

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

应用程序.json
{
   "name":"${appServerName}",
   "fqdn":"${appServerName}"
}

我要替换的管道和 app.json 中的变量不止一个

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

我希望低于输出

println appMachine
{
   "name":"gaga",
   "fqdn":"gaga"
}

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

最佳答案

您的假设 readFile步骤(或从文本文件读取内容的任何其他方法)应绑定(bind)当前范围的变量并在原始文本中插入变量占位符是错误的。但是,您可以使用 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() 创建的 map 不可序列化。它需要先前从文件中读取的 JSON(在此示例中,为简单起见,我使用变量代替)和参数映射。它将此映射转换为具有默认值的映射(variables.withDefault { ... } 部分负责),因此模板引擎不会提示没有给定名称的属性。在这种情况下,默认方法“按原样”返回变量,但您可以返回空字符串或 null。取而代之的是值(value)。任何对你更有效的东西。

当你运行它时,你会是这样的:

[Pipeline] Start of Pipeline (hide)
[Pipeline] node
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Test)
[Pipeline] echo
{
   "name":"gaga",
   "fqdn":"gaga"
}
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

关于groovy - Groovy 中的字符串插值与 Jenkins 流水线文件不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56101952/

相关文章:

Groovy: map 减少 map 列表

java - 如何在 Groovy 中传递值

jenkins - 从 Jenkins 工作流(管道)插件获取登录 Jenkins 的用户名

像 ruby​​ 一样的 Javascript 字符串插值

grails - 带和不带 def 关键字的方法参数

git - 由于正在创建 @tmp 路径,Jenkins 管道作业找不到脚本

java - 是否有任何关于 Jenkins 的 Pipeline 插件套件(内部)结构如何的文档?

jenkins - 在 Jenkinsfile 中触发远程构建(例如,从脚本)语法

javascript - 插入 React Link 组件并将其作为 prop 传递

android - Kotlin:如何获取字符串中 "@"之后的字符?