jenkins 读取json文件_jenkins:实现Jenkinsfile与Json的转换

本文介绍了如何实现Jenkinsfile与Json之间的转换,包括使用现有Jenkins插件的步骤,涉及REST API的使用,以及解析原生Jenkinsfile文件的方法。通过插件提供的toJenkinsfile和toJson API,可以进行基本的转换,但不支持所有扩展功能。另外提到了一个使用rust的pest crate解析Jenkinsfile的项目,但指出其在处理复杂语法时的局限性。
摘要由CSDN通过智能技术生成

实现Jenkinsfile与Json的转换

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

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

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

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

若是本地没有找到tools.jar,能够下载一个1.8版本的jdk,而后在pom.xml中增长以下依赖docker

jdk.tools

jdk.tools

1.8.0

system

/root/jdk1.8.0_271/lib/tools.jar

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

org.jenkins-ci.tools

jenkins

true

repo.jenkins-ci.org

https://repo.jenkins-ci.org/public/

repo.jenkins-ci.org

https://repo.jenkins-ci.org/public/

repo.jenkins-ci.org

https://repo.jenkins-ci.org/public/

m.g.o-public

执行 mvn install进行编译编辑器

因为主要用到的是Jenkinsfile和json之间的转换关系,所以主要用的是以下两个REST API:ui

Conversion to JSON representation from Jenkinsfilethis

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 representationatom

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的操做以下:

af4afc81c47eb1eab543acf8ac61d79f.png

完整的返回值以下: {

"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的操做以下

72030a6d17e8798e45db7e737dc5dbe5.png

制做容器镜像时,只须要将本地工程和/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的功能。

参考

pest文档

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值