Files
kubesphere/pkg/simple/client/devops/jenkins/project_pipeline.go
runzexia 23c8d71a5a pipeline crd
Signed-off-by: runzexia <runzexia@yunify.com>
2020-03-25 10:58:39 +08:00

171 lines
5.2 KiB
Go

package jenkins
import (
"fmt"
"github.com/emicklei/go-restful"
"k8s.io/klog"
devopsv1alpha3 "kubesphere.io/kubesphere/pkg/apis/devops/v1alpha3"
"kubesphere.io/kubesphere/pkg/simple/client/devops"
"net/http"
)
func (j *Jenkins) CreateProjectPipeline(projectId string, pipeline *devopsv1alpha3.Pipeline) (string, error) {
switch pipeline.Spec.Type {
case devopsv1alpha3.NoScmPipelineType:
config, err := createPipelineConfigXml(pipeline.Spec.Pipeline)
if err != nil {
return "", restful.NewError(http.StatusInternalServerError, err.Error())
}
job, err := j.GetJob(pipeline.Name, projectId)
if job != nil {
err := fmt.Errorf("job name [%s] has been used", job.GetName())
return "", restful.NewError(http.StatusConflict, err.Error())
}
if err != nil && devops.GetDevOpsStatusCode(err) != http.StatusNotFound {
return "", restful.NewError(devops.GetDevOpsStatusCode(err), err.Error())
}
_, err = j.CreateJobInFolder(config, pipeline.Name, projectId)
if err != nil {
return "", restful.NewError(devops.GetDevOpsStatusCode(err), err.Error())
}
return pipeline.Name, nil
case devopsv1alpha3.MultiBranchPipelineType:
config, err := createMultiBranchPipelineConfigXml(projectId, pipeline.Spec.MultiBranchPipeline)
if err != nil {
return "", restful.NewError(http.StatusInternalServerError, err.Error())
}
job, err := j.GetJob(pipeline.Name, projectId)
if job != nil {
err := fmt.Errorf("job name [%s] has been used", job.GetName())
return "", restful.NewError(http.StatusConflict, err.Error())
}
if err != nil && devops.GetDevOpsStatusCode(err) != http.StatusNotFound {
return "", restful.NewError(devops.GetDevOpsStatusCode(err), err.Error())
}
_, err = j.CreateJobInFolder(config, pipeline.Name, projectId)
if err != nil {
return "", restful.NewError(devops.GetDevOpsStatusCode(err), err.Error())
}
return pipeline.Name, nil
default:
err := fmt.Errorf("error unsupport job type")
klog.Errorf("%+v", err)
return "", restful.NewError(http.StatusBadRequest, err.Error())
}
}
func (j *Jenkins) DeleteProjectPipeline(projectId string, pipelineId string) (string, error) {
_, err := j.DeleteJob(pipelineId, projectId)
if err != nil {
return "", restful.NewError(devops.GetDevOpsStatusCode(err), err.Error())
}
return pipelineId, nil
}
func (j *Jenkins) UpdateProjectPipeline(projectId string, pipeline *devopsv1alpha3.Pipeline) (string, error) {
switch pipeline.Spec.Type {
case devopsv1alpha3.NoScmPipelineType:
config, err := createPipelineConfigXml(pipeline.Spec.Pipeline)
if err != nil {
return "", restful.NewError(http.StatusInternalServerError, err.Error())
}
job, err := j.GetJob(pipeline.Name, projectId)
if err != nil {
return "", restful.NewError(devops.GetDevOpsStatusCode(err), err.Error())
}
err = job.UpdateConfig(config)
if err != nil {
return "", restful.NewError(devops.GetDevOpsStatusCode(err), err.Error())
}
return pipeline.Name, nil
case devopsv1alpha3.MultiBranchPipelineType:
config, err := createMultiBranchPipelineConfigXml(projectId, pipeline.Spec.MultiBranchPipeline)
if err != nil {
klog.Errorf("%+v", err)
return "", restful.NewError(http.StatusInternalServerError, err.Error())
}
job, err := j.GetJob(pipeline.Spec.MultiBranchPipeline.Name, projectId)
if err != nil {
return "", restful.NewError(devops.GetDevOpsStatusCode(err), err.Error())
}
err = job.UpdateConfig(config)
if err != nil {
klog.Errorf("%+v", err)
return "", restful.NewError(devops.GetDevOpsStatusCode(err), err.Error())
}
return pipeline.Name, nil
default:
err := fmt.Errorf("error unsupport job type")
klog.Errorf("%+v", err)
return "", restful.NewError(http.StatusBadRequest, err.Error())
}
}
func (j *Jenkins) GetProjectPipelineConfig(projectId, pipelineId string) (*devopsv1alpha3.Pipeline, error) {
job, err := j.GetJob(pipelineId, projectId)
if err != nil {
klog.Errorf("%+v", err)
return nil, restful.NewError(devops.GetDevOpsStatusCode(err), err.Error())
}
switch job.Raw.Class {
case "org.jenkinsci.plugins.workflow.job.WorkflowJob":
config, err := job.GetConfig()
if err != nil {
return nil, restful.NewError(devops.GetDevOpsStatusCode(err), err.Error())
}
pipeline, err := parsePipelineConfigXml(config)
if err != nil {
return nil, restful.NewError(devops.GetDevOpsStatusCode(err), err.Error())
}
pipeline.Name = pipelineId
return &devopsv1alpha3.Pipeline{
Spec: devopsv1alpha3.PipelineSpec{
Type: devopsv1alpha3.NoScmPipelineType,
Pipeline: pipeline,
},
}, nil
case "org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject":
config, err := job.GetConfig()
if err != nil {
return nil, restful.NewError(devops.GetDevOpsStatusCode(err), err.Error())
}
pipeline, err := parseMultiBranchPipelineConfigXml(config)
if err != nil {
return nil, restful.NewError(devops.GetDevOpsStatusCode(err), err.Error())
}
pipeline.Name = pipelineId
return &devopsv1alpha3.Pipeline{
Spec: devopsv1alpha3.PipelineSpec{
Type: devopsv1alpha3.MultiBranchPipelineType,
MultiBranchPipeline: pipeline,
},
}, nil
default:
klog.Errorf("%+v", err)
return nil, restful.NewError(http.StatusBadRequest, err.Error())
}
}