实现Jenkinsfile与Json的转换

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

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

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

  • 本地安装jdk和maven,jdk建议采用的版本为8(该工程会依赖一个名为tools.jar的包,jdk 9之后移除了该包)

    如果本地没有找到tools.jar,可以下载一个1.8版本的jdk,然后在pom.xml中增加如下依赖

    <dependency>
    <groupId>jdk.tools</groupId>
    <artifactId>jdk.tools</artifactId>
    <version>1.8.0</version>
    <scope>system</scope>
    <systemPath>/root/jdk1.8.0_271/lib/tools.jar</systemPath>
    </dependency>
  • clone pipeline-model-definition-plugin工程

  • 在/root/.m2/目录下创建settings.xml,内容来自Jenkins官方:

    <settings>
    <pluginGroups>
    <pluginGroup>org.jenkins-ci.tools</pluginGroup>
    </pluginGroups> <profiles>
    <!-- Give access to Jenkins plugins -->
    <profile>
    <id>jenkins</id>
    <activation>
    <activeByDefault>true</activeByDefault> <!-- change this to false, if you don't like to have it on per default -->
    </activation>
    <repositories>
    <repository>
    <id>repo.jenkins-ci.org</id>
    <url>https://repo.jenkins-ci.org/public/</url>
    </repository>
    </repositories>
    <pluginRepositories>
    <pluginRepository>
    <id>repo.jenkins-ci.org</id>
    <url>https://repo.jenkins-ci.org/public/</url>
    </pluginRepository>
    </pluginRepositories>
    </profile>
    </profiles>
    <mirrors>
    <mirror>
    <id>repo.jenkins-ci.org</id>
    <url>https://repo.jenkins-ci.org/public/</url>
    <mirrorOf>m.g.o-public</mirrorOf>
    </mirror>
    </mirrors>
    </settings>
  • 执行 mvn install进行编译

  • 由于主要用到的是Jenkinsfile和json之间的转换关系,因此主要用的是如下两个REST API:

    • Conversion to JSON representation from Jenkinsfile

      • URL: JENKINS_URL/pipeline-model-converter/toJson
      • Parameters: jenkinsfile - the Jenkinsfile contents
      • Info: Takes a Jenkinsfile and converts it to the JSON representation for its pipeline step.
      • Returns: JSON with a result field that will either be success or failure. If success, the JSON representation will be in the json field. If failure, there'll be an additional array in the errors field of the error messages encountered.
    • Conversion to Jenkinsfile from JSON representation

      • URL: JENKINS_URL/pipeline-model-converter/toJenkinsfile
      • Parameters: json - the JSON representation of the model
      • Info: Takes the JSON representation of the model and converts it to the contents for a Jenkinsfile invoking the pipeline step.
      • Returns: JSON with a result field that will either be success or failure. If success, the Jenkinsfile contents will be in the jenkinsfile field. If failure, there'll be an additional array in the errors field of the error messages encountered.

    上述两个API在pipeline-model-definition-plugin/pipeline-model-definition目录下,因此在该目录下直接运行:mvn hpi:run -Dhost=0.0.0.0 -Djetty.port=8080即可。

  • 将json转换为Jenkinsfile的操作如下:

    完整的返回值如下:

    {
    "status": "ok",
    "data": {
    "result": "success",
    "json": {
    "pipeline": {
    "stages": [
    {
    "name": "Hello",
    "branches": [
    {
    "name": "default",
    "steps": [
    {
    "name": "echo",
    "arguments": [
    {
    "key": "message",
    "value": {
    "isLiteral": true,
    "value": "Hello World"
    }
    }
    ]
    }
    ]
    }
    ]
    }
    ],
    "agent": {
    "type": "any"
    }
    }
    }
    }
    }
  • 将Jenkinsfile转换为json的操作如下

  • 制作容器镜像时,只需要将本地工程和/root/.m2上传到容器,生成对应的镜像即可,下面Dockerfile假设生成的镜像为pipeline-model-definition-plugin:latest

    FROM pipeline-model-definition-plugin:latest
    WORKDIR /usr/pipeline-model-definition-plugin/pipeline-model-definition
    ENV PATH=$PATH:/usr/local/bin/maven-3.6.3/bin
    ENTRYPOINT ["sh", "-c", "mvn hpi:run -Dhost=0.0.0.0"]

    我自己打包了一个镜像:docker pull quay.io/woodliu/pipeline-model-definition-plugin

需要注意的是,本插件提供的转换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:

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' }
}
}
}

对应的解析结果如下:

- 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语法重点标注:

  • 当使用静默规则时,解析结果中将不会出现该规则字段。当解析下面规则时,解析结果中将不会存在silent,即parsed.as_rule() 中不会存在silent

    silent = _{ ... }
  • 当使用原子语法时,整个规则体将视为一个规则,如double_quoted = ${ (quote ~ inner_double_str ~ quote) },在解析时会将quote ~ inner_double_str ~ quote视为一个规则,而不是三个。这有利于获取一段完整的字符串。

    atomic = @{ ... }
    compound_atomic = ${ ... }

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

steps {
echo 'test'
dir('command') {
sh "sh ./saas.sh ${params.channel} ${params.buildType} "
}
}

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

参考

jenkins:实现Jenkinsfile与Json的转换的更多相关文章

  1. Jenkinsfile与Json的转换

    前段时间调研了下青云的kubesphere,意外的发现了一个插件,pipeline-model-definition-plugin,用了将jenkins的pipeline.json互相转换的,以前可能 ...

  2. json日期转换

    //调用 ChangeDateFormat(CreatTime) //json日期转换 function ChangeDateFormat(jsondate) { jsondate = jsondat ...

  3. java中Array/List/Map/Object与Json互相转换详解

    http://blog.csdn.net/xiaomu709421487/article/details/51456705 JSON(JavaScript Object Notation): 是一种轻 ...

  4. Json格式转换

    验证Json格式可以进入 http://json.cn/ json简单说就是javascript中的对象和数组,所以这两种结构就是对象和数组两种结构,通过这两种结构可以表示各种复杂的结构1.对象:对象 ...

  5. JSON.stringify转换Date不正确的解決方法

    JSON.stringify转换Date不正确的原因:国际时区(UTC)和中国时区(GMT)的原因,东八区+8等于国际时区. 解决方法,重新Es5的Date.prototype.toJSON方法,代码 ...

  6. 使用js进行string和json之间转换的方法

    在数据传输过种中,json是以文本,即字符串的形式传递,字符串形似Json对象: var str1 = '{ "name": "Amy", "sex& ...

  7. 前台 JSON对象转换成字符串 相互转换 的几种方式

    在最近的工作中,使用到JSON进行数据的传递,特别是从前端传递到后台,前台可以直接采用ajax的data函数,按json格式传递,后台Request即可,但有的时候,需要传递多个参数,后台使用requ ...

  8. C#中服务端接受前端JSON字符串转换成字典集合

    我们是否可以把从前端接受的JSON字符串转换成字典集合呢? 比如从前端接收:{'size':'10', 'weight':'10kg'} 在服务端转换成:[{size:"10"}, ...

  9. json格式转换成Map的应用

    jsp 1.引用json.js(将json格式转换成字符串) 2. var name = document.getElementById("name").value; var re ...

随机推荐

  1. Celery--短信与邮件

    1 Celery 实现短信--邮件 1.1 容联云-短信 from ronglian_sms_sdk import SmsSDK accountSid = '8a216da8757784cd01759 ...

  2. kubernets之job资源

    一  介绍job资源 1.1   前面介绍的RC,RS,DS等等,管控的pod都是需要长期持久的运行的应用,但是尝试考虑另外一种场景,在微服务的场景下,有些pod的作用就是需要 执行完一些命令之后正常 ...

  3. C语言目的概念(C语言学习笔记)

    什么是目 目是针对操作符来说的,一个操作符影响两个操作数就表示该操作符为双目运算符 举个例子: 1+2 这里的加号影响了1和2两个操作数,所以"+"就是双目运算符 +1,-1 这里 ...

  4. MySQL全面瓦解19:游标相关

    定义 我们经常会遇到这样的一种情况,需要对我们查询的结果进行遍历操作,并对遍历到的每一条数据进行处理,这时候就会使用到游标. 所以:游标(Cursor)是处理数据的一种存储在MySQL服务器上的数据库 ...

  5. linux下删除文件夹及下面所有文件

    使用rm -rf 目录名字 命令即可 -r 就是向下递归,不管有多少级目录,一并删除-f 就是直接强行删除,不作任何提示的意思 rm 不带参数 只能删除文件 rm test.txt mkdir /us ...

  6. linux自定义位置安装tomcat8.5

    1 下载tomcat安装文件 下载地址:https://tomcat.apache.org/download-80.cgi  2 解压文件 tar -zxvf apache-tomcat-8.5.56 ...

  7. innodb锁和事物

    • InnoDB存储引擎支持行级锁,其大类可以细分为共享锁和排它锁两类• 共享锁(S):允许拥有共享锁的事务读取该行数据.当一个事务拥有一行的共享锁时,另外的事务可以在同一行数据也获得共享锁,但另外的 ...

  8. Py装饰器

    装饰器: 1.定义,什么是装饰器 装饰器本质是一个函数,它是为了给其他函数添加附加功能 2.装饰器的两个原则 原则1   不修改被修饰函数的源代码原则2   不修改被修饰函数的调用方式 3.首先来看一 ...

  9. 前端面试之JavaScript中this的指向【待完善!】

    JavaScript中this的指向问题! 另一个特殊的对象是 this,它在标准函数和箭头函数中有不同的行为. 在标准函数中, this 引用的是把函数当成方法调用的上下文对象,这时候通常称其为 t ...

  10. (013)每日SQL学习:日期的各种计算

    1.确定两个日期之间的工作日天数 --确定两个日期之间的工作日天数with x0 as (select to_date('2018-01-01','yyyy-mm-dd') as 日期 from du ...