jenkins:实现Jenkinsfile与Json的转换

2021-03-02 16:09:20 浏览数 (1)

实现Jenkinsfile与Json的转换

目录

  • 实现Jenkinsfile与Json的转换
  • 方法1:使用现有的jenkins插件
    • 参考
  • 方法2:解析原生的jenkinsfile文件
    • 参考

最近在做个需求,需要支持Jenkinsfile和json的转换。

方法1:使用现有的jenkins插件

参考的是这篇文章。下面介绍一下将插件打包成镜像的步骤:

需要注意的是,本插件提供的转换API toJenkinsfile和toJson并不是万能的,只能支持jenkins标准的参数类型,例如对于gitParameter这样的参数就无法解析(扩展功能),一种解决方式是独立解析扩展的参数,然后将其插入解析好的标准JenkinsFile中;另外一个方式就是写一个jenkinsfile的解析器。

参考
  • mvn hpi的命令可以参考官方文档
  • 可以运行mvn hpi:hpi生成对应的hpi文件,如: /pipeline-model-definition-plugin/pipeline-model-definition/target/pipeline-model-definition.hpi

方法2:解析原生的jenkinsfile文件

在GitHub上有一个支持jenkinsfile解析的项目,该项目使用rust的pest crate来编写jenkinsfile的语法,支持对jenkinsfile的格式验证。Pest官方文档中给出了一个非常好的对json语法的解析例子,主要是使用递归的方式来解析语法。

pest官方提供了一个编辑器,可以使用该编辑器查看经过pest解析之后的字段,对了解pest的工作方式非常有用。如,使用jdp项目提供的pest文件解析如下jenkinsfile:

代码语言:javascript复制
pipeline {
    agent {
        docker {
            reuseNode true
            image 'maven:3-alpine'
            label 'my-defined-label'
            args  '-v /tmp:/tmp'
            registryUrl 'https://myregistry.com/'
            registryCredentialsId 'myPredefinedCredentialsInJenkins'
        }
    }

    stages {
        stage('Build') {
            steps { sh 'make' }
        }
    }
}

对应的解析结果如下:

代码语言:javascript复制
- preceeding_junk: ""
- opening_brace: "{"
- agentDecl > agentBlock
  - opening_brace: "{"
  - dockerAgent
    - opening_brace: "{"
    - bool: "true"
    - string > single_quoted
      - single_quote: "'"
      - inner_single_str: "maven:3-alpine"
      - single_quote: "'"
    - string > single_quoted
      - single_quote: "'"
      - inner_single_str: "my-defined-label"
      - single_quote: "'"
    - string > single_quoted
      - single_quote: "'"
      - inner_single_str: "-v /tmp:/tmp"
      - single_quote: "'"
    - string > single_quoted
      - single_quote: "'"
      - inner_single_str: "https://myregistry.com/"
      - single_quote: "'"
    - string > single_quoted
      - single_quote: "'"
      - inner_single_str: "myPredefinedCredentialsInJenkins"
      - single_quote: "'"
    - closing_brace: "}"
  - closing_brace: "}"
- stagesDecl
  - opening_brace: "{"
  - stage
    - string > single_quoted
      - single_quote: "'"
      - inner_single_str: "Build"
      - single_quote: "'"
    - opening_brace: "{"
    - stepsDecl
      - opening_brace: "{"
      - step > simple_step
        - IDENT: "sh"
        - args > string > single_quoted
          - single_quote: "'"
          - inner_single_str: "make"
          - single_quote: "'"
      - closing_brace: "}"
    - closing_brace: "}"
  - closing_brace: "}"
- closing_brace: "}"
- ending_junk: ""
- EOI: ""

Pest语法重点标注:

我尝试使用该项目解析jenkinsfile,但发现实现起来太过复杂,且rust和jenkinsFile的语法也是一言难尽。如下,当step中带括号和不带括号混用时会导致解析错误。

代码语言:javascript复制
steps {
    echo 'test'
    dir('command') {
		sh "sh ./saas.sh ${params.channel} ${params.buildType} "
	}     
}

有精力的大神可以在此基础上实现解析JenkinsFile的功能。

参考
  • pest文档

0 人点赞