Merge pull request #3588 from LinuxSuRen/pipeline-json-missing-env

Fix fields missing when convert Jenkinsfile to JSON
This commit is contained in:
KubeSphere CI Bot
2021-03-29 18:07:30 +08:00
committed by GitHub
6 changed files with 19 additions and 55 deletions

View File

@@ -614,6 +614,13 @@ func AddPipelineToWebService(webservice *restful.WebService, devopsClient devops
Writes(devops.ResJenkinsfile{})) Writes(devops.ResJenkinsfile{}))
// match /pipeline-model-converter/toJson // match /pipeline-model-converter/toJson
/*
* Considering the following reasons, we use a generic data struct here.
* - A fixed go struct might need to change again once Jenkins has new features.
* - No refer requirement for the specific data struct
* Please read the official document if you want to know more details
* https://github.com/jenkinsci/pipeline-model-definition-plugin/blob/fc8d22192d7d3a17badc3b8af7191a84bb7fd4ca/EXTENDING.md#conversion-to-json-representation-from-jenkinsfile
*/
webservice.Route(webservice.POST("/tojson"). webservice.Route(webservice.POST("/tojson").
To(projectPipelineHandler.ToJson). To(projectPipelineHandler.ToJson).
Metadata(restfulspec.KeyOpenAPITags, []string{constants.DevOpsJenkinsfileTag}). Metadata(restfulspec.KeyOpenAPITags, []string{constants.DevOpsJenkinsfileTag}).
@@ -621,8 +628,8 @@ func AddPipelineToWebService(webservice *restful.WebService, devopsClient devops
Produces("application/json", "charset=utf-8"). Produces("application/json", "charset=utf-8").
Doc("Convert jenkinsfile to json format. Usually the frontend uses json to show or edit pipeline"). Doc("Convert jenkinsfile to json format. Usually the frontend uses json to show or edit pipeline").
Reads(devops.ReqJenkinsfile{}). Reads(devops.ReqJenkinsfile{}).
Returns(http.StatusOK, RespOK, devops.ResJson{}). Returns(http.StatusOK, RespOK, map[string]interface{}{}).
Writes(devops.ResJson{})) Writes(map[string]interface{}{}))
} }
return nil return nil
} }

View File

@@ -116,7 +116,7 @@ type DevopsOperator interface {
CheckCron(projectName string, req *http.Request) (*devops.CheckCronRes, error) CheckCron(projectName string, req *http.Request) (*devops.CheckCronRes, error)
ToJenkinsfile(req *http.Request) (*devops.ResJenkinsfile, error) ToJenkinsfile(req *http.Request) (*devops.ResJenkinsfile, error)
ToJson(req *http.Request) (*devops.ResJson, error) ToJson(req *http.Request) (map[string]interface{}, error)
} }
type devopsOperator struct { type devopsOperator struct {
@@ -935,7 +935,7 @@ func (d devopsOperator) ToJenkinsfile(req *http.Request) (*devops.ResJenkinsfile
return res, err return res, err
} }
func (d devopsOperator) ToJson(req *http.Request) (*devops.ResJson, error) { func (d devopsOperator) ToJson(req *http.Request) (map[string]interface{}, error) {
res, err := d.devopsClient.ToJson(convertToHttpParameters(req)) res, err := d.devopsClient.ToJson(convertToHttpParameters(req))
if err != nil { if err != nil {

View File

@@ -297,7 +297,7 @@ func (d *Devops) CheckCron(projectName string, httpParameters *devops.HttpParame
func (d *Devops) ToJenkinsfile(httpParameters *devops.HttpParameters) (*devops.ResJenkinsfile, error) { func (d *Devops) ToJenkinsfile(httpParameters *devops.HttpParameters) (*devops.ResJenkinsfile, error) {
return nil, nil return nil, nil
} }
func (d *Devops) ToJson(httpParameters *devops.HttpParameters) (*devops.ResJson, error) { func (d *Devops) ToJson(httpParameters *devops.HttpParameters) (map[string]interface{}, error) {
return nil, nil return nil, nil
} }

View File

@@ -872,7 +872,7 @@ func (j *Jenkins) ToJenkinsfile(httpParameters *devops.HttpParameters) (*devops.
return res, err return res, err
} }
func (j *Jenkins) ToJson(httpParameters *devops.HttpParameters) (*devops.ResJson, error) { func (j *Jenkins) ToJson(httpParameters *devops.HttpParameters) (map[string]interface{}, error) {
PipelineOjb := &Pipeline{ PipelineOjb := &Pipeline{
HttpParameters: httpParameters, HttpParameters: httpParameters,
Jenkins: j, Jenkins: j,

View File

@@ -856,19 +856,10 @@ func (p *Pipeline) ToJenkinsfile() (*devops.ResJenkinsfile, error) {
return &jenkinsfile, err return &jenkinsfile, err
} }
func (p *Pipeline) ToJson() (*devops.ResJson, error) { func (p *Pipeline) ToJson() (result map[string]interface{}, err error) {
res, err := p.Jenkins.SendPureRequest(p.Path, p.HttpParameters) var data []byte
if err != nil { if data, err = p.Jenkins.SendPureRequest(p.Path, p.HttpParameters); err == nil {
klog.Error(err) err = json.Unmarshal(data, &result)
return nil, err
} }
return
var toJson devops.ResJson
err = json.Unmarshal(res, &toJson)
if err != nil {
klog.Error(err)
return nil, err
}
return &toJson, err
} }

View File

@@ -1025,40 +1025,6 @@ type ReqJenkinsfile struct {
Jenkinsfile string `json:"jenkinsfile,omitempty" description:"jenkinsfile"` Jenkinsfile string `json:"jenkinsfile,omitempty" description:"jenkinsfile"`
} }
type ResJson struct {
Status string `json:"status,omitempty" description:"status e.g. ok"`
Data struct {
Result string `json:"result,omitempty" description:"result e.g. success"`
JSON struct {
Pipeline struct {
Stages []interface{} `json:"stages,omitempty" description:"stages"`
Agent struct {
Type string `json:"type,omitempty" description:"type"`
Arguments []struct {
Key string `json:"key,omitempty" description:"key"`
Value struct {
IsLiteral bool `json:"isLiteral,omitempty" description:"is literal or not"`
Value string `json:"value,omitempty" description:"value"`
} `json:"value,omitempty"`
} `json:"arguments,omitempty"`
} `json:"agent,omitempty"`
Parameters struct {
Parameters []struct {
Name string `json:"name,omitempty" description:"name"`
Arguments []struct {
Key string `json:"key,omitempty" description:"key"`
Value struct {
IsLiteral bool `json:"isLiteral,omitempty" description:"is literal or not"`
Value interface{} `json:"value,omitempty" description:"value"`
} `json:"value,omitempty"`
} `json:"arguments,omitempty"`
} `json:"parameters,omitempty"`
} `json:"parameters,omitempty"`
} `json:"pipeline,omitempty"`
} `json:"json,omitempty"`
} `json:"data,omitempty"`
}
type NodesDetail struct { type NodesDetail struct {
Class string `json:"_class,omitempty" description:"Its a fully qualified name and is an identifier of the producer of this resource's capability."` Class string `json:"_class,omitempty" description:"Its a fully qualified name and is an identifier of the producer of this resource's capability."`
Links struct { Links struct {
@@ -1202,5 +1168,5 @@ type PipelineOperator interface {
CheckScriptCompile(projectName, pipelineName string, httpParameters *HttpParameters) (*CheckScript, error) CheckScriptCompile(projectName, pipelineName string, httpParameters *HttpParameters) (*CheckScript, error)
CheckCron(projectName string, httpParameters *HttpParameters) (*CheckCronRes, error) CheckCron(projectName string, httpParameters *HttpParameters) (*CheckCronRes, error)
ToJenkinsfile(httpParameters *HttpParameters) (*ResJenkinsfile, error) ToJenkinsfile(httpParameters *HttpParameters) (*ResJenkinsfile, error)
ToJson(httpParameters *HttpParameters) (*ResJson, error) ToJson(httpParameters *HttpParameters) (map[string]interface{}, error)
} }