【问题标题】:How to validate if a multiline string is a valid YAML or not?如何验证多行字符串是否是有效的 YAML?
【发布时间】:2021-01-26 17:04:29
【问题描述】:

我有一个脚本化的 Jenkins 管道,我在其中使用名为 CUSTOM_YAML 的多行字符串参数。

在构建作业时,我将该参数的输入作为 yaml 文本提供,并将其转换为 .yaml 文件:

writeFile file: 'demo.yaml', text: params.DEMO_YAML

现在,我想验证一下这个 yaml 文件(demo.yaml)的格式是否正确。

注意:就像有多种工具可以手动执行此操作(例如 https://codebeautify.org/yaml-validator ),我们可以在其中粘贴文本并单击 validate 和 。但是如何在我的 Jenkins 管道中实现这一点?

【问题讨论】:

  • 调用readYaml步骤怎么样?如果你用 try-catch 包围它,你可以检查它是否可以被解析
  • 我试过了:datas = readYaml (file: 'demo.yaml')。在输入多行参数中,我给出了一些未在 yaml 中格式化的文本,但仍高于 readYaml 函数返回的输出文本。如果 yaml 的格式不正确,它应该会抛出异常。不是吗?

标签: validation yaml jenkins-pipeline multilinestring


【解决方案1】:

您可以使用内置的readYaml 步骤来进行基本的语法验证。要检查数据的有效性,您可以使用assertions。

如果您需要做的只是因任何错误而使构建失败,那么您已经完成了。当readYamlassert 失败时,将自动记录错误。如果您需要专门处理错误或想要改进断言错误消息,请将代码包装在try/catch 中(注意:断言必须被捕获为AssertionError)。

node {
    def CUSTOM_YAML = '''\
        foo: "bar"
        baz:
        - "baz1"
        - "baz2"
    '''
     
    try {
        // Parse the YAML. Does basic syntax checking.
        def config = readYaml text: CUSTOM_YAML
     
        // Validate YAML data.
        assert config.foo == 'bar'     
        assert config.baz.size() >= 2
    }
    catch( Exception e ){
        // Handle syntax error        
    }
    catch( AssertionError e ){
        // Handle data validation error (assert's)        
    }
}

这是脚本化管道的示例。如果您有声明式管道,则可以将代码放入 steps{script{ /*the code*/ }} 块中。

【讨论】:

  • 如果我必须验证通过 Jenkins 作业中的参数加载的任何规范文件,并根据我的仓库中已有的模式验证文件对其进行验证,那么我该如何编写此代码?我希望在我的作业运行之前首先验证我放入参数中的任何规范文件,如果它违反验证,它应该在我的记录器中抛出错误。
猜你喜欢
  • 2013-03-04
  • 1970-01-01
  • 1970-01-01
  • 2019-11-15
  • 1970-01-01
  • 2011-04-25
  • 1970-01-01
  • 2014-10-10
  • 1970-01-01
相关资源
最近更新 更多