* add devops client interface Signed-off-by: runzexia <runzexia@yunify.com> * direct return jenkins Signed-off-by: runzexia <runzexia@yunify.com> * add some interface Signed-off-by: runzexia <runzexia@yunify.com> * update Signed-off-by: runzexia <runzexia@yunify.com> * update interface Signed-off-by: runzexia <runzexia@yunify.com> * update Signed-off-by: runzexia <runzexia@yunify.com> * credential op structs Signed-off-by: runzexia <runzexia@yunify.com> * status Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * update interface Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * credential handler Signed-off-by: runzexia <runzexia@yunify.com> * update devopsoperator func Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * get build sonar Signed-off-by: runzexia <runzexia@yunify.com> * sonar handler * mv code to cilent Signed-off-by: runzexia <runzexia@yunify.com> * update Signed-off-by: runzexia <runzexia@yunify.com> * project member handler Signed-off-by: runzexia <runzexia@yunify.com> * update pipeline operator interface Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * add tenant devops handler Signed-off-by: runzexia <runzexia@yunify.com> * update merge Signed-off-by: runzexia <runzexia@yunify.com> * clean Signed-off-by: runzexia <runzexia@yunify.com> * fmt Signed-off-by: runzexia <runzexia@yunify.com> * update ListPipelineRuns Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * complate pipelineOperator interface Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * update HttpParameters Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * add pipeline steps interface Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * update pipeline GetNodesDetail Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * add s2i api Signed-off-by: runzexia <runzexia@yunify.com> * add branch pipeline interface and update handler Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * add scan branch interface and update handler Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * add common interface and update handler Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * add SCM interface and update handler Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * add handler Signed-off-by: runzexia <runzexia@yunify.com> * add fake s3 Signed-off-by: runzexia <runzexia@yunify.com> * add webhook&check interface and update handler Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * clean Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * clean Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * format Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * add some func Signed-off-by: runzexia <runzexia@yunify.com> * clean code Signed-off-by: runzexia <runzexia@yunify.com> * implement interface Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * fix interface GetBranchArtifacts Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * add s2ibinary upload test Signed-off-by: runzexia <runzexia@yunify.com> * tenant devops Signed-off-by: runzexia <runzexia@yunify.com> * update tenant Signed-off-by: runzexia <runzexia@yunify.com> * fake Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * add some unit test Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * add devops tenant handler Signed-off-by: runzexia <runzexia@yunify.com> * status Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * status Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * status Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * update fake test Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * update unit test and fake data Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * update Co-authored-by: Xiaoyang Zhu <sunzhu@yunify.com>
166 lines
5.0 KiB
Go
166 lines
5.0 KiB
Go
package jenkins
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/emicklei/go-restful"
|
|
"k8s.io/klog"
|
|
"kubesphere.io/kubesphere/pkg/simple/client/devops"
|
|
"net/http"
|
|
)
|
|
|
|
func (j *Jenkins) CreateProjectPipeline(projectId string, pipeline *devops.ProjectPipeline) (string, error) {
|
|
switch pipeline.Type {
|
|
case devops.NoScmPipelineType:
|
|
|
|
config, err := createPipelineConfigXml(pipeline.Pipeline)
|
|
if err != nil {
|
|
return "", restful.NewError(http.StatusInternalServerError, err.Error())
|
|
}
|
|
|
|
job, err := j.GetJob(pipeline.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 && GetJenkinsStatusCode(err) != http.StatusNotFound {
|
|
return "", restful.NewError(GetJenkinsStatusCode(err), err.Error())
|
|
}
|
|
|
|
_, err = j.CreateJobInFolder(config, pipeline.Pipeline.Name, projectId)
|
|
if err != nil {
|
|
return "", restful.NewError(GetJenkinsStatusCode(err), err.Error())
|
|
}
|
|
|
|
return pipeline.Pipeline.Name, nil
|
|
case devops.MultiBranchPipelineType:
|
|
config, err := createMultiBranchPipelineConfigXml(projectId, pipeline.MultiBranchPipeline)
|
|
if err != nil {
|
|
return "", restful.NewError(http.StatusInternalServerError, err.Error())
|
|
}
|
|
|
|
job, err := j.GetJob(pipeline.MultiBranchPipeline.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 && GetJenkinsStatusCode(err) != http.StatusNotFound {
|
|
return "", restful.NewError(GetJenkinsStatusCode(err), err.Error())
|
|
}
|
|
|
|
_, err = j.CreateJobInFolder(config, pipeline.MultiBranchPipeline.Name, projectId)
|
|
if err != nil {
|
|
return "", restful.NewError(GetJenkinsStatusCode(err), err.Error())
|
|
}
|
|
|
|
return pipeline.MultiBranchPipeline.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(GetJenkinsStatusCode(err), err.Error())
|
|
}
|
|
return pipelineId, nil
|
|
|
|
}
|
|
func (j *Jenkins) UpdateProjectPipeline(projectId string, pipeline *devops.ProjectPipeline) (string, error) {
|
|
switch pipeline.Type {
|
|
case devops.NoScmPipelineType:
|
|
|
|
config, err := createPipelineConfigXml(pipeline.Pipeline)
|
|
if err != nil {
|
|
return "", restful.NewError(http.StatusInternalServerError, err.Error())
|
|
}
|
|
|
|
job, err := j.GetJob(pipeline.Pipeline.Name, projectId)
|
|
|
|
if err != nil {
|
|
return "", restful.NewError(GetJenkinsStatusCode(err), err.Error())
|
|
}
|
|
|
|
err = job.UpdateConfig(config)
|
|
if err != nil {
|
|
return "", restful.NewError(GetJenkinsStatusCode(err), err.Error())
|
|
}
|
|
|
|
return pipeline.Pipeline.Name, nil
|
|
case devops.MultiBranchPipelineType:
|
|
|
|
config, err := createMultiBranchPipelineConfigXml(projectId, pipeline.MultiBranchPipeline)
|
|
if err != nil {
|
|
klog.Errorf("%+v", err)
|
|
|
|
return "", restful.NewError(http.StatusInternalServerError, err.Error())
|
|
}
|
|
|
|
job, err := j.GetJob(pipeline.MultiBranchPipeline.Name, projectId)
|
|
|
|
if err != nil {
|
|
return "", restful.NewError(GetJenkinsStatusCode(err), err.Error())
|
|
}
|
|
|
|
err = job.UpdateConfig(config)
|
|
if err != nil {
|
|
klog.Errorf("%+v", err)
|
|
return "", restful.NewError(GetJenkinsStatusCode(err), err.Error())
|
|
}
|
|
|
|
return pipeline.MultiBranchPipeline.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) (*devops.ProjectPipeline, error) {
|
|
job, err := j.GetJob(pipelineId, projectId)
|
|
if err != nil {
|
|
klog.Errorf("%+v", err)
|
|
return nil, restful.NewError(GetJenkinsStatusCode(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(GetJenkinsStatusCode(err), err.Error())
|
|
}
|
|
pipeline, err := parsePipelineConfigXml(config)
|
|
if err != nil {
|
|
return nil, restful.NewError(GetJenkinsStatusCode(err), err.Error())
|
|
}
|
|
pipeline.Name = pipelineId
|
|
return &devops.ProjectPipeline{
|
|
Type: devops.NoScmPipelineType,
|
|
Pipeline: pipeline,
|
|
}, nil
|
|
|
|
case "org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject":
|
|
config, err := job.GetConfig()
|
|
if err != nil {
|
|
return nil, restful.NewError(GetJenkinsStatusCode(err), err.Error())
|
|
}
|
|
pipeline, err := parseMultiBranchPipelineConfigXml(config)
|
|
if err != nil {
|
|
return nil, restful.NewError(GetJenkinsStatusCode(err), err.Error())
|
|
}
|
|
pipeline.Name = pipelineId
|
|
return &devops.ProjectPipeline{
|
|
Type: devops.MultiBranchPipelineType,
|
|
MultiBranchPipeline: pipeline,
|
|
}, nil
|
|
default:
|
|
klog.Errorf("%+v", err)
|
|
return nil, restful.NewError(http.StatusBadRequest, err.Error())
|
|
}
|
|
}
|