From 2f4c6f47ee02c836d3e2f021edc3a62d3bb5d70d Mon Sep 17 00:00:00 2001 From: mzmuer Date: Sun, 27 Feb 2022 17:20:49 +0800 Subject: [PATCH 01/11] create a new API to download artifacts from a PipelineRun --- pkg/kapis/devops/v1alpha2/devops.go | 30 ++++++++++++++++++++++ pkg/kapis/devops/v1alpha2/handler.go | 5 +++- pkg/kapis/devops/v1alpha2/register.go | 27 ++++++++++++++++--- pkg/kapis/devops/v1alpha2/register_test.go | 6 +++++ 4 files changed, 64 insertions(+), 4 deletions(-) diff --git a/pkg/kapis/devops/v1alpha2/devops.go b/pkg/kapis/devops/v1alpha2/devops.go index 97347161..a0571f5e 100644 --- a/pkg/kapis/devops/v1alpha2/devops.go +++ b/pkg/kapis/devops/v1alpha2/devops.go @@ -907,3 +907,33 @@ func parseErr(err error, resp *restful.Response) { } return } + +// downloadArtifact API to download artifacts from Jenkins +func (h *ProjectPipelineHandler) downloadArtifact(request *restful.Request, response *restful.Response) { + projectName := request.PathParameter("devops") + pipelineName := request.PathParameter("pipeline") + runId := request.PathParameter("run") + fileName := request.QueryParameter("filename") + + artifactUrl := fmt.Sprintf("/job/%s/job/%s/%s/artifact/%s", projectName, pipelineName, runId, fileName) + statusCode, body, err := h.jenkinsClient.Request(http.MethodGet, artifactUrl, nil, nil) + if err != nil { + kapis.HandleError(request, response, err) + return + } + + if statusCode != http.StatusOK { + err := fmt.Errorf("failed to get artifact. The HTTP status code is %d", statusCode) + kapis.HandleError(request, response, err) + return + } + + // add download header + response.AddHeader("Content-Type", "application/octet-stream") + response.AddHeader("Content-Disposition", fmt.Sprintf("attachment; filename=%s", fileName)) + _, err = response.Write(body) + if err != nil { + kapis.HandleError(request, response, err) + return + } +} diff --git a/pkg/kapis/devops/v1alpha2/handler.go b/pkg/kapis/devops/v1alpha2/handler.go index 8b6eeedb..32c3633d 100644 --- a/pkg/kapis/devops/v1alpha2/handler.go +++ b/pkg/kapis/devops/v1alpha2/handler.go @@ -17,6 +17,7 @@ limitations under the License. package v1alpha2 import ( + "github.com/jenkins-zh/jenkins-client/pkg/core" "kubesphere.io/devops/pkg/client/clientset/versioned" devopsClient "kubesphere.io/devops/pkg/client/devops" "kubesphere.io/devops/pkg/client/informers/externalversions" @@ -30,6 +31,7 @@ type ProjectPipelineHandler struct { k8sClient k8s.Client devopsOperator devops.DevopsOperator projectCredentialGetter devops.ProjectCredentialGetter + jenkinsClient core.JenkinsCore } type PipelineSonarHandler struct { @@ -37,11 +39,12 @@ type PipelineSonarHandler struct { pipelineSonarGetter devops.PipelineSonarGetter } -func NewProjectPipelineHandler(devopsClient devopsClient.Interface, k8sClient k8s.Client) ProjectPipelineHandler { +func NewProjectPipelineHandler(devopsClient devopsClient.Interface, k8sClient k8s.Client, jenkinsClient core.JenkinsCore) ProjectPipelineHandler { return ProjectPipelineHandler{ devopsOperator: devops.NewDevopsOperator(devopsClient, k8sClient.Kubernetes(), k8sClient.KubeSphere()), projectCredentialGetter: devops.NewProjectCredentialOperator(devopsClient), k8sClient: k8sClient, + jenkinsClient: jenkinsClient, } } diff --git a/pkg/kapis/devops/v1alpha2/register.go b/pkg/kapis/devops/v1alpha2/register.go index 4ece5ef8..4d0b5ccc 100644 --- a/pkg/kapis/devops/v1alpha2/register.go +++ b/pkg/kapis/devops/v1alpha2/register.go @@ -70,7 +70,7 @@ func AddToContainer(container *restful.Container, ksInformers externalversions.S func addToContainerWithWebService(container *restful.Container, ksInformers externalversions.SharedInformerFactory, devopsClient devops.Interface, sonarqubeClient sonarqube.SonarInterface, ksClient versioned.Interface, s3Client s3.Interface, endpoint string, k8sClient k8s.Client, jenkinsClient core.JenkinsCore, ws *restful.WebService) error { - err := AddPipelineToWebService(ws, devopsClient, k8sClient) + err := AddPipelineToWebService(ws, devopsClient, k8sClient, jenkinsClient) if err != nil { return err } @@ -94,11 +94,11 @@ func addToContainerWithWebService(container *restful.Container, ksInformers exte return nil } -func AddPipelineToWebService(webservice *restful.WebService, devopsClient devops.Interface, k8sClient k8s.Client) error { +func AddPipelineToWebService(webservice *restful.WebService, devopsClient devops.Interface, k8sClient k8s.Client, jenkinsClient core.JenkinsCore) error { projectPipelineEnable := devopsClient != nil if projectPipelineEnable { - projectPipelineHandler := NewProjectPipelineHandler(devopsClient, k8sClient) + projectPipelineHandler := NewProjectPipelineHandler(devopsClient, k8sClient, jenkinsClient) webservice.Route(webservice.GET("/devops/{devops}/credentials/{credential}/usage"). To(projectPipelineHandler.GetProjectCredentialUsage). @@ -653,6 +653,26 @@ func AddPipelineToWebService(webservice *restful.WebService, devopsClient devops Reads(devops.ReqJenkinsfile{}). Returns(http.StatusOK, api.StatusOK, map[string]interface{}{}). Writes(map[string]interface{}{})) + + webservice.Route(webservice.GET("/devops/{devops}/pipelines/{pipeline}/runs/{run}"). + To(projectPipelineHandler.GetPipelineRun). + Metadata(restfulspec.KeyOpenAPITags, []string{constants.DevOpsPipelineTag}). + Doc("Get details in the specified pipeline activity."). + Param(webservice.PathParameter("devops", "the name of devops project")). + Param(webservice.PathParameter("pipeline", "the name of the CI/CD pipeline")). + Param(webservice.PathParameter("run", "pipeline run ID, the unique ID for a pipeline once build.")). + Returns(http.StatusOK, api.StatusOK, devops.PipelineRun{}). + Writes(devops.PipelineRun{})) + + // download PipelineRun artifact + webservice.Route(webservice.GET("/devops/{devops}/pipelines/{pipeline}/artifact/runs/{run}"). + Param(webservice.PathParameter("devops", "DevOps project's ID, e.g. project-RRRRAzLBlLEm")). + Param(webservice.PathParameter("pipeline", "the name of the CI/CD pipeline")). + Param(webservice.PathParameter("run", "pipeline run ID, the unique ID for a pipeline once build.")). + Param(webservice.QueryParameter("filename", "artifact filename. e.g. artifact:v1.0.1")). + To(projectPipelineHandler.downloadArtifact). + Returns(http.StatusOK, api.StatusOK, nil). + Metadata(restfulspec.KeyOpenAPITags, []string{constants.DevOpsPipelineTag})) } return nil } @@ -725,6 +745,7 @@ func addJenkinsToContainer(webservice *restful.WebService, devopsClient devops.I To(jenkinsProxy.proxyWithDevOps). Returns(http.StatusOK, api.StatusOK, nil). Metadata(restfulspec.KeyOpenAPITags, []string{constants.DevOpsJenkinsTag})) + return nil } diff --git a/pkg/kapis/devops/v1alpha2/register_test.go b/pkg/kapis/devops/v1alpha2/register_test.go index 9dfb0a00..502b479e 100644 --- a/pkg/kapis/devops/v1alpha2/register_test.go +++ b/pkg/kapis/devops/v1alpha2/register_test.go @@ -209,6 +209,12 @@ func TestAPIsExist(t *testing.T) { method: http.MethodPost, uri: "/tojenkinsfile", }, + }, { + name: "artifact download", + args: args{ + method: http.MethodGet, + uri: "/devops/fake/pipelines/fake/artifact/runs/fake", + }, }} for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { From 05ef97fad32f3ffa7c0c48a4f5d7c82c3a6f920e Mon Sep 17 00:00:00 2001 From: mzmuer Date: Sun, 27 Feb 2022 17:41:11 +0800 Subject: [PATCH 02/11] formatting code --- pkg/kapis/devops/v1alpha2/register.go | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/pkg/kapis/devops/v1alpha2/register.go b/pkg/kapis/devops/v1alpha2/register.go index 4d0b5ccc..288d2472 100644 --- a/pkg/kapis/devops/v1alpha2/register.go +++ b/pkg/kapis/devops/v1alpha2/register.go @@ -654,16 +654,6 @@ func AddPipelineToWebService(webservice *restful.WebService, devopsClient devops Returns(http.StatusOK, api.StatusOK, map[string]interface{}{}). Writes(map[string]interface{}{})) - webservice.Route(webservice.GET("/devops/{devops}/pipelines/{pipeline}/runs/{run}"). - To(projectPipelineHandler.GetPipelineRun). - Metadata(restfulspec.KeyOpenAPITags, []string{constants.DevOpsPipelineTag}). - Doc("Get details in the specified pipeline activity."). - Param(webservice.PathParameter("devops", "the name of devops project")). - Param(webservice.PathParameter("pipeline", "the name of the CI/CD pipeline")). - Param(webservice.PathParameter("run", "pipeline run ID, the unique ID for a pipeline once build.")). - Returns(http.StatusOK, api.StatusOK, devops.PipelineRun{}). - Writes(devops.PipelineRun{})) - // download PipelineRun artifact webservice.Route(webservice.GET("/devops/{devops}/pipelines/{pipeline}/artifact/runs/{run}"). Param(webservice.PathParameter("devops", "DevOps project's ID, e.g. project-RRRRAzLBlLEm")). From 33514236e4517eab3f2c68b3de2a012ae7434893 Mon Sep 17 00:00:00 2001 From: mzmuer Date: Mon, 28 Feb 2022 22:36:17 +0800 Subject: [PATCH 03/11] Modify the route for downloading artifacts --- pkg/kapis/devops/v1alpha2/register.go | 2 +- pkg/kapis/devops/v1alpha2/register_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/kapis/devops/v1alpha2/register.go b/pkg/kapis/devops/v1alpha2/register.go index 288d2472..b7544e5d 100644 --- a/pkg/kapis/devops/v1alpha2/register.go +++ b/pkg/kapis/devops/v1alpha2/register.go @@ -655,7 +655,7 @@ func AddPipelineToWebService(webservice *restful.WebService, devopsClient devops Writes(map[string]interface{}{})) // download PipelineRun artifact - webservice.Route(webservice.GET("/devops/{devops}/pipelines/{pipeline}/artifact/runs/{run}"). + webservice.Route(webservice.GET("/devops/{devops}/pipelines/{pipeline}/runs/{run}/artifacts"). Param(webservice.PathParameter("devops", "DevOps project's ID, e.g. project-RRRRAzLBlLEm")). Param(webservice.PathParameter("pipeline", "the name of the CI/CD pipeline")). Param(webservice.PathParameter("run", "pipeline run ID, the unique ID for a pipeline once build.")). diff --git a/pkg/kapis/devops/v1alpha2/register_test.go b/pkg/kapis/devops/v1alpha2/register_test.go index 502b479e..8c2515a3 100644 --- a/pkg/kapis/devops/v1alpha2/register_test.go +++ b/pkg/kapis/devops/v1alpha2/register_test.go @@ -213,7 +213,7 @@ func TestAPIsExist(t *testing.T) { name: "artifact download", args: args{ method: http.MethodGet, - uri: "/devops/fake/pipelines/fake/artifact/runs/fake", + uri: "/devops/fake/pipelines/fake/runs/fake/artifacts", }, }} for _, tt := range tests { From 0d342e2fd2a844dd0948db4bb6a70b828c61a0f0 Mon Sep 17 00:00:00 2001 From: mzmuer Date: Mon, 7 Mar 2022 23:30:43 +0800 Subject: [PATCH 04/11] fix: using the Jenkins API download artifact --- go.mod | 2 +- go.sum | 4 +- pkg/kapis/devops/v1alpha2/devops.go | 79 ++++++++++++++-------- pkg/kapis/devops/v1alpha2/register.go | 20 +++--- pkg/kapis/devops/v1alpha2/register_test.go | 2 +- 5 files changed, 63 insertions(+), 44 deletions(-) diff --git a/go.mod b/go.mod index d1870ee3..73cca6e8 100644 --- a/go.mod +++ b/go.mod @@ -25,7 +25,7 @@ require ( github.com/google/go-cmp v0.5.5 github.com/google/go-querystring v1.1.0 // indirect github.com/h2non/gock v1.0.9 - github.com/jenkins-zh/jenkins-client v0.0.8 + github.com/jenkins-zh/jenkins-client v0.0.9 github.com/kubesphere/sonargo v0.0.2 github.com/onsi/ginkgo v1.16.4 github.com/onsi/gomega v1.15.0 diff --git a/go.sum b/go.sum index db3f59cd..4f6eeaa2 100644 --- a/go.sum +++ b/go.sum @@ -324,8 +324,8 @@ github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NH github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jenkins-zh/jenkins-cli v0.0.32/go.mod h1:uE1mH9PNITrg0sugv6HXuM/CSddg0zxXoYu3w57I3JY= -github.com/jenkins-zh/jenkins-client v0.0.8 h1:leaVU9pYvWcAhpG4VkX7KUFIcvNp1qxwnnGVjkhSfMU= -github.com/jenkins-zh/jenkins-client v0.0.8/go.mod h1:ICBk7OOoTafVP//f/VfKZ34c0ff8vJwVnOsF9btiMYU= +github.com/jenkins-zh/jenkins-client v0.0.9 h1:yqWtjLifYWbVxR+wFdExh/cHSQ54i/Cdco2MYkc/5vI= +github.com/jenkins-zh/jenkins-client v0.0.9/go.mod h1:ICBk7OOoTafVP//f/VfKZ34c0ff8vJwVnOsF9btiMYU= github.com/jenkins-zh/jenkins-formulas v0.0.5/go.mod h1:zS8fm8u5L6FcjZM0QznXsLV9T2UtSVK+hT6Sm76iUZ4= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= diff --git a/pkg/kapis/devops/v1alpha2/devops.go b/pkg/kapis/devops/v1alpha2/devops.go index a0571f5e..7ecee857 100644 --- a/pkg/kapis/devops/v1alpha2/devops.go +++ b/pkg/kapis/devops/v1alpha2/devops.go @@ -17,11 +17,16 @@ limitations under the License. package v1alpha2 import ( + "bytes" "encoding/json" "errors" "fmt" + "github.com/jenkins-zh/jenkins-client/pkg/artifact" + "io" "kubesphere.io/devops/pkg/kapis" "net/http" + "net/url" + "strconv" "strings" "kubesphere.io/devops/pkg/apiserver/query" @@ -255,6 +260,50 @@ func (h *ProjectPipelineHandler) GetArtifacts(req *restful.Request, resp *restfu resp.WriteAsJson(res) } +// downloadArtifact API to download artifacts from Jenkins +func (h *ProjectPipelineHandler) downloadArtifact(request *restful.Request, response *restful.Response) { + projectName := request.PathParameter("devops") + pipelineName := request.PathParameter("pipeline") + runId := request.PathParameter("run") + fileName := request.QueryParameter("filename") + runID, err := strconv.Atoi(runId) + if err != nil { + kapis.HandleError(request, response, err) + return + } + + fileName, err = url.QueryUnescape(fileName) + if err != nil { + kapis.HandleError(request, response, err) + return + } + + // request the Jenkins API to download artifact + c := artifact.Client{JenkinsCore: h.jenkinsClient} + body, err := c.GetArtifact(projectName, pipelineName, runID, fileName) + if err != nil { + kapis.HandleError(request, response, err) + return + } + defer body.Close() + + buf := &bytes.Buffer{} + _, err = io.Copy(buf, body) + if err != nil { + kapis.HandleError(request, response, err) + return + } + + // add download header + response.AddHeader("Content-Type", "application/octet-stream") + response.AddHeader("Content-Disposition", fmt.Sprintf("attachment; filename=%s", fileName)) + _, err = response.Write(buf.Bytes()) + if err != nil { + kapis.HandleError(request, response, err) + return + } +} + func (h *ProjectPipelineHandler) GetRunLog(req *restful.Request, resp *restful.Response) { projectName := req.PathParameter("devops") pipelineName := req.PathParameter("pipeline") @@ -907,33 +956,3 @@ func parseErr(err error, resp *restful.Response) { } return } - -// downloadArtifact API to download artifacts from Jenkins -func (h *ProjectPipelineHandler) downloadArtifact(request *restful.Request, response *restful.Response) { - projectName := request.PathParameter("devops") - pipelineName := request.PathParameter("pipeline") - runId := request.PathParameter("run") - fileName := request.QueryParameter("filename") - - artifactUrl := fmt.Sprintf("/job/%s/job/%s/%s/artifact/%s", projectName, pipelineName, runId, fileName) - statusCode, body, err := h.jenkinsClient.Request(http.MethodGet, artifactUrl, nil, nil) - if err != nil { - kapis.HandleError(request, response, err) - return - } - - if statusCode != http.StatusOK { - err := fmt.Errorf("failed to get artifact. The HTTP status code is %d", statusCode) - kapis.HandleError(request, response, err) - return - } - - // add download header - response.AddHeader("Content-Type", "application/octet-stream") - response.AddHeader("Content-Disposition", fmt.Sprintf("attachment; filename=%s", fileName)) - _, err = response.Write(body) - if err != nil { - kapis.HandleError(request, response, err) - return - } -} diff --git a/pkg/kapis/devops/v1alpha2/register.go b/pkg/kapis/devops/v1alpha2/register.go index b7544e5d..f012d653 100644 --- a/pkg/kapis/devops/v1alpha2/register.go +++ b/pkg/kapis/devops/v1alpha2/register.go @@ -226,6 +226,16 @@ func AddPipelineToWebService(webservice *restful.WebService, devopsClient devops Returns(http.StatusOK, "The filed of \"Url\" in response can download artifacts", []devops.Artifacts{}). Writes([]devops.Artifacts{})) + // download PipelineRun artifact + webservice.Route(webservice.GET("/devops/{devops}/pipelines/{pipeline}/runs/{run}/artifacts/download"). + Param(webservice.PathParameter("devops", "DevOps project's ID, e.g. project-RRRRAzLBlLEm")). + Param(webservice.PathParameter("pipeline", "the name of the CI/CD pipeline")). + Param(webservice.PathParameter("run", "pipeline run ID, the unique ID for a pipeline once build.")). + Param(webservice.QueryParameter("filename", "artifact filename. e.g. artifact:v1.0.1")). + To(projectPipelineHandler.downloadArtifact). + Returns(http.StatusOK, api.StatusOK, nil). + Metadata(restfulspec.KeyOpenAPITags, []string{constants.DevOpsPipelineTag})) + // match /blue/rest/organizations/jenkins/pipelines/{devops}/{pipeline}/runs/{run}/log/?start=0 webservice.Route(webservice.GET("/devops/{devops}/pipelines/{pipeline}/runs/{run}/log"). To(projectPipelineHandler.GetRunLog). @@ -653,16 +663,6 @@ func AddPipelineToWebService(webservice *restful.WebService, devopsClient devops Reads(devops.ReqJenkinsfile{}). Returns(http.StatusOK, api.StatusOK, map[string]interface{}{}). Writes(map[string]interface{}{})) - - // download PipelineRun artifact - webservice.Route(webservice.GET("/devops/{devops}/pipelines/{pipeline}/runs/{run}/artifacts"). - Param(webservice.PathParameter("devops", "DevOps project's ID, e.g. project-RRRRAzLBlLEm")). - Param(webservice.PathParameter("pipeline", "the name of the CI/CD pipeline")). - Param(webservice.PathParameter("run", "pipeline run ID, the unique ID for a pipeline once build.")). - Param(webservice.QueryParameter("filename", "artifact filename. e.g. artifact:v1.0.1")). - To(projectPipelineHandler.downloadArtifact). - Returns(http.StatusOK, api.StatusOK, nil). - Metadata(restfulspec.KeyOpenAPITags, []string{constants.DevOpsPipelineTag})) } return nil } diff --git a/pkg/kapis/devops/v1alpha2/register_test.go b/pkg/kapis/devops/v1alpha2/register_test.go index 8c2515a3..2fee833e 100644 --- a/pkg/kapis/devops/v1alpha2/register_test.go +++ b/pkg/kapis/devops/v1alpha2/register_test.go @@ -213,7 +213,7 @@ func TestAPIsExist(t *testing.T) { name: "artifact download", args: args{ method: http.MethodGet, - uri: "/devops/fake/pipelines/fake/runs/fake/artifacts", + uri: "/devops/fake/pipelines/fake/runs/fake/artifacts/download", }, }} for _, tt := range tests { From 83699df947d8b41dbd7ee2a06125781a4763f7f0 Mon Sep 17 00:00:00 2001 From: mzmuer Date: Sun, 27 Feb 2022 17:20:49 +0800 Subject: [PATCH 05/11] rebase to master --- pkg/kapis/devops/v1alpha2/devops.go | 30 +++++++++++++++++++++++++++ pkg/kapis/devops/v1alpha2/register.go | 20 ++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/pkg/kapis/devops/v1alpha2/devops.go b/pkg/kapis/devops/v1alpha2/devops.go index 7ecee857..fd87bd59 100644 --- a/pkg/kapis/devops/v1alpha2/devops.go +++ b/pkg/kapis/devops/v1alpha2/devops.go @@ -956,3 +956,33 @@ func parseErr(err error, resp *restful.Response) { } return } + +// downloadArtifact API to download artifacts from Jenkins +func (h *ProjectPipelineHandler) downloadArtifact(request *restful.Request, response *restful.Response) { + projectName := request.PathParameter("devops") + pipelineName := request.PathParameter("pipeline") + runId := request.PathParameter("run") + fileName := request.QueryParameter("filename") + + artifactUrl := fmt.Sprintf("/job/%s/job/%s/%s/artifact/%s", projectName, pipelineName, runId, fileName) + statusCode, body, err := h.jenkinsClient.Request(http.MethodGet, artifactUrl, nil, nil) + if err != nil { + kapis.HandleError(request, response, err) + return + } + + if statusCode != http.StatusOK { + err := fmt.Errorf("failed to get artifact. The HTTP status code is %d", statusCode) + kapis.HandleError(request, response, err) + return + } + + // add download header + response.AddHeader("Content-Type", "application/octet-stream") + response.AddHeader("Content-Disposition", fmt.Sprintf("attachment; filename=%s", fileName)) + _, err = response.Write(body) + if err != nil { + kapis.HandleError(request, response, err) + return + } +} diff --git a/pkg/kapis/devops/v1alpha2/register.go b/pkg/kapis/devops/v1alpha2/register.go index f012d653..d9fa735d 100644 --- a/pkg/kapis/devops/v1alpha2/register.go +++ b/pkg/kapis/devops/v1alpha2/register.go @@ -663,6 +663,26 @@ func AddPipelineToWebService(webservice *restful.WebService, devopsClient devops Reads(devops.ReqJenkinsfile{}). Returns(http.StatusOK, api.StatusOK, map[string]interface{}{}). Writes(map[string]interface{}{})) + + webservice.Route(webservice.GET("/devops/{devops}/pipelines/{pipeline}/runs/{run}"). + To(projectPipelineHandler.GetPipelineRun). + Metadata(restfulspec.KeyOpenAPITags, []string{constants.DevOpsPipelineTag}). + Doc("Get details in the specified pipeline activity."). + Param(webservice.PathParameter("devops", "the name of devops project")). + Param(webservice.PathParameter("pipeline", "the name of the CI/CD pipeline")). + Param(webservice.PathParameter("run", "pipeline run ID, the unique ID for a pipeline once build.")). + Returns(http.StatusOK, api.StatusOK, devops.PipelineRun{}). + Writes(devops.PipelineRun{})) + + // download PipelineRun artifact + webservice.Route(webservice.GET("/devops/{devops}/pipelines/{pipeline}/artifact/runs/{run}"). + Param(webservice.PathParameter("devops", "DevOps project's ID, e.g. project-RRRRAzLBlLEm")). + Param(webservice.PathParameter("pipeline", "the name of the CI/CD pipeline")). + Param(webservice.PathParameter("run", "pipeline run ID, the unique ID for a pipeline once build.")). + Param(webservice.QueryParameter("filename", "artifact filename. e.g. artifact:v1.0.1")). + To(projectPipelineHandler.downloadArtifact). + Returns(http.StatusOK, api.StatusOK, nil). + Metadata(restfulspec.KeyOpenAPITags, []string{constants.DevOpsPipelineTag})) } return nil } From 16654da05fc21ab1fc713f00e6fce321b28c6db6 Mon Sep 17 00:00:00 2001 From: mzmuer Date: Sun, 27 Feb 2022 17:41:11 +0800 Subject: [PATCH 06/11] formatting code --- pkg/kapis/devops/v1alpha2/register.go | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/pkg/kapis/devops/v1alpha2/register.go b/pkg/kapis/devops/v1alpha2/register.go index d9fa735d..646805e2 100644 --- a/pkg/kapis/devops/v1alpha2/register.go +++ b/pkg/kapis/devops/v1alpha2/register.go @@ -664,16 +664,6 @@ func AddPipelineToWebService(webservice *restful.WebService, devopsClient devops Returns(http.StatusOK, api.StatusOK, map[string]interface{}{}). Writes(map[string]interface{}{})) - webservice.Route(webservice.GET("/devops/{devops}/pipelines/{pipeline}/runs/{run}"). - To(projectPipelineHandler.GetPipelineRun). - Metadata(restfulspec.KeyOpenAPITags, []string{constants.DevOpsPipelineTag}). - Doc("Get details in the specified pipeline activity."). - Param(webservice.PathParameter("devops", "the name of devops project")). - Param(webservice.PathParameter("pipeline", "the name of the CI/CD pipeline")). - Param(webservice.PathParameter("run", "pipeline run ID, the unique ID for a pipeline once build.")). - Returns(http.StatusOK, api.StatusOK, devops.PipelineRun{}). - Writes(devops.PipelineRun{})) - // download PipelineRun artifact webservice.Route(webservice.GET("/devops/{devops}/pipelines/{pipeline}/artifact/runs/{run}"). Param(webservice.PathParameter("devops", "DevOps project's ID, e.g. project-RRRRAzLBlLEm")). From c92e558cd228ae69edbe037ee8189b672405ef63 Mon Sep 17 00:00:00 2001 From: mzmuer Date: Mon, 28 Feb 2022 22:36:17 +0800 Subject: [PATCH 07/11] rebase to master --- pkg/kapis/devops/v1alpha2/register.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/kapis/devops/v1alpha2/register.go b/pkg/kapis/devops/v1alpha2/register.go index 646805e2..e19413f8 100644 --- a/pkg/kapis/devops/v1alpha2/register.go +++ b/pkg/kapis/devops/v1alpha2/register.go @@ -665,7 +665,7 @@ func AddPipelineToWebService(webservice *restful.WebService, devopsClient devops Writes(map[string]interface{}{})) // download PipelineRun artifact - webservice.Route(webservice.GET("/devops/{devops}/pipelines/{pipeline}/artifact/runs/{run}"). + webservice.Route(webservice.GET("/devops/{devops}/pipelines/{pipeline}/runs/{run}/artifacts"). Param(webservice.PathParameter("devops", "DevOps project's ID, e.g. project-RRRRAzLBlLEm")). Param(webservice.PathParameter("pipeline", "the name of the CI/CD pipeline")). Param(webservice.PathParameter("run", "pipeline run ID, the unique ID for a pipeline once build.")). From f99c2fadd67011fda38d1fc68995617568ad4a39 Mon Sep 17 00:00:00 2001 From: mzmuer Date: Mon, 7 Mar 2022 23:33:10 +0800 Subject: [PATCH 08/11] fix: using the Jenkins API download artifact --- pkg/kapis/devops/v1alpha2/devops.go | 30 ----------------------------- 1 file changed, 30 deletions(-) diff --git a/pkg/kapis/devops/v1alpha2/devops.go b/pkg/kapis/devops/v1alpha2/devops.go index fd87bd59..7ecee857 100644 --- a/pkg/kapis/devops/v1alpha2/devops.go +++ b/pkg/kapis/devops/v1alpha2/devops.go @@ -956,33 +956,3 @@ func parseErr(err error, resp *restful.Response) { } return } - -// downloadArtifact API to download artifacts from Jenkins -func (h *ProjectPipelineHandler) downloadArtifact(request *restful.Request, response *restful.Response) { - projectName := request.PathParameter("devops") - pipelineName := request.PathParameter("pipeline") - runId := request.PathParameter("run") - fileName := request.QueryParameter("filename") - - artifactUrl := fmt.Sprintf("/job/%s/job/%s/%s/artifact/%s", projectName, pipelineName, runId, fileName) - statusCode, body, err := h.jenkinsClient.Request(http.MethodGet, artifactUrl, nil, nil) - if err != nil { - kapis.HandleError(request, response, err) - return - } - - if statusCode != http.StatusOK { - err := fmt.Errorf("failed to get artifact. The HTTP status code is %d", statusCode) - kapis.HandleError(request, response, err) - return - } - - // add download header - response.AddHeader("Content-Type", "application/octet-stream") - response.AddHeader("Content-Disposition", fmt.Sprintf("attachment; filename=%s", fileName)) - _, err = response.Write(body) - if err != nil { - kapis.HandleError(request, response, err) - return - } -} From 9cfa39c6f46a90ed7df11644bc1e51e8e606a0c7 Mon Sep 17 00:00:00 2001 From: mzmuer Date: Mon, 7 Mar 2022 23:38:51 +0800 Subject: [PATCH 09/11] remove duplicate code --- pkg/kapis/devops/v1alpha2/register.go | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/pkg/kapis/devops/v1alpha2/register.go b/pkg/kapis/devops/v1alpha2/register.go index e19413f8..f012d653 100644 --- a/pkg/kapis/devops/v1alpha2/register.go +++ b/pkg/kapis/devops/v1alpha2/register.go @@ -663,16 +663,6 @@ func AddPipelineToWebService(webservice *restful.WebService, devopsClient devops Reads(devops.ReqJenkinsfile{}). Returns(http.StatusOK, api.StatusOK, map[string]interface{}{}). Writes(map[string]interface{}{})) - - // download PipelineRun artifact - webservice.Route(webservice.GET("/devops/{devops}/pipelines/{pipeline}/runs/{run}/artifacts"). - Param(webservice.PathParameter("devops", "DevOps project's ID, e.g. project-RRRRAzLBlLEm")). - Param(webservice.PathParameter("pipeline", "the name of the CI/CD pipeline")). - Param(webservice.PathParameter("run", "pipeline run ID, the unique ID for a pipeline once build.")). - Param(webservice.QueryParameter("filename", "artifact filename. e.g. artifact:v1.0.1")). - To(projectPipelineHandler.downloadArtifact). - Returns(http.StatusOK, api.StatusOK, nil). - Metadata(restfulspec.KeyOpenAPITags, []string{constants.DevOpsPipelineTag})) } return nil } From 63ce3d4dcb5ebcdaa189cb82a9a08df7e2bdfba4 Mon Sep 17 00:00:00 2001 From: mzmuer Date: Thu, 17 Mar 2022 15:02:57 +0800 Subject: [PATCH 10/11] revert and resubmit --- pkg/client/devops/fake/fakedevops.go | 5 ++ pkg/client/devops/jclient/pipeline.go | 15 +++++ pkg/client/devops/pipeline.go | 1 + pkg/kapis/devops/v1alpha2/devops.go | 52 +--------------- pkg/kapis/devops/v1alpha2/register.go | 15 +---- pkg/kapis/devops/v1alpha2/register_test.go | 13 ++-- .../devops/v1alpha3/pipelinerun/handler.go | 62 ++++++++++++++++++- .../devops/v1alpha3/pipelinerun/register.go | 18 +++++- .../v1alpha3/pipelinerun/register_test.go | 16 +++-- pkg/kapis/devops/v1alpha3/register.go | 5 +- 10 files changed, 121 insertions(+), 81 deletions(-) diff --git a/pkg/client/devops/fake/fakedevops.go b/pkg/client/devops/fake/fakedevops.go index ace75d1a..27ea5251 100644 --- a/pkg/client/devops/fake/fakedevops.go +++ b/pkg/client/devops/fake/fakedevops.go @@ -18,6 +18,7 @@ package fake import ( "fmt" + "io" "io/ioutil" "net/http" "net/url" @@ -189,6 +190,10 @@ func (d *Devops) RunPipeline(projectName, pipelineName string, httpParameters *d func (d *Devops) GetArtifacts(projectName, pipelineName, runId string, httpParameters *devops.HttpParameters) ([]devops.Artifacts, error) { return nil, nil } +func (d *Devops) DownloadArtifact(projectName, pipelineName, runId, filename string) (io.ReadCloser, error) { + return nil, nil +} + func (d *Devops) GetRunLog(projectName, pipelineName, runId string, httpParameters *devops.HttpParameters) ([]byte, error) { return nil, nil } diff --git a/pkg/client/devops/jclient/pipeline.go b/pkg/client/devops/jclient/pipeline.go index c494e33a..8217421d 100644 --- a/pkg/client/devops/jclient/pipeline.go +++ b/pkg/client/devops/jclient/pipeline.go @@ -17,7 +17,12 @@ limitations under the License. package jclient import ( + "fmt" + "io" "net/http" + "strconv" + + "github.com/jenkins-zh/jenkins-client/pkg/artifact" "kubesphere.io/devops/pkg/client/devops" ) @@ -62,6 +67,16 @@ func (j *JenkinsClient) GetArtifacts(projectName, pipelineName, runID string, ht return j.jenkins.GetArtifacts(projectName, pipelineName, runID, httpParameters) } +// DownloadArtifact download an artifact +func (j *JenkinsClient) DownloadArtifact(projectName, pipelineName, runID, filename string) (io.ReadCloser, error) { + jobRunID, err := strconv.Atoi(runID) + if err != nil { + return nil, fmt.Errorf("runId error, not a number: %v", err) + } + c := artifact.Client{JenkinsCore: j.Core} + return c.GetArtifact(projectName, pipelineName, jobRunID, filename) +} + // GetRunLog returns the log output of a pipeline run func (j *JenkinsClient) GetRunLog(projectName, pipelineName, runID string, httpParameters *devops.HttpParameters) ([]byte, error) { return j.jenkins.GetRunLog(projectName, pipelineName, runID, httpParameters) diff --git a/pkg/client/devops/pipeline.go b/pkg/client/devops/pipeline.go index 016cf20e..f61e49c5 100644 --- a/pkg/client/devops/pipeline.go +++ b/pkg/client/devops/pipeline.go @@ -1135,6 +1135,7 @@ type PipelineOperator interface { ReplayPipeline(projectName, pipelineName, runId string, httpParameters *HttpParameters) (*ReplayPipeline, error) RunPipeline(projectName, pipelineName string, httpParameters *HttpParameters) (*RunPipeline, error) GetArtifacts(projectName, pipelineName, runId string, httpParameters *HttpParameters) ([]Artifacts, error) + DownloadArtifact(projectName, pipelineName, runId, filename string) (io.ReadCloser, error) GetRunLog(projectName, pipelineName, runId string, httpParameters *HttpParameters) ([]byte, error) GetStepLog(projectName, pipelineName, runId, nodeId, stepId string, httpParameters *HttpParameters) ([]byte, http.Header, error) GetNodeSteps(projectName, pipelineName, runId, nodeId string, httpParameters *HttpParameters) ([]NodeSteps, error) diff --git a/pkg/kapis/devops/v1alpha2/devops.go b/pkg/kapis/devops/v1alpha2/devops.go index 7ecee857..95d06b3f 100644 --- a/pkg/kapis/devops/v1alpha2/devops.go +++ b/pkg/kapis/devops/v1alpha2/devops.go @@ -17,18 +17,14 @@ limitations under the License. package v1alpha2 import ( - "bytes" "encoding/json" "errors" "fmt" - "github.com/jenkins-zh/jenkins-client/pkg/artifact" - "io" - "kubesphere.io/devops/pkg/kapis" "net/http" - "net/url" - "strconv" "strings" + "kubesphere.io/devops/pkg/kapis" + "kubesphere.io/devops/pkg/apiserver/query" "kubesphere.io/devops/pkg/apiserver/request" @@ -260,50 +256,6 @@ func (h *ProjectPipelineHandler) GetArtifacts(req *restful.Request, resp *restfu resp.WriteAsJson(res) } -// downloadArtifact API to download artifacts from Jenkins -func (h *ProjectPipelineHandler) downloadArtifact(request *restful.Request, response *restful.Response) { - projectName := request.PathParameter("devops") - pipelineName := request.PathParameter("pipeline") - runId := request.PathParameter("run") - fileName := request.QueryParameter("filename") - runID, err := strconv.Atoi(runId) - if err != nil { - kapis.HandleError(request, response, err) - return - } - - fileName, err = url.QueryUnescape(fileName) - if err != nil { - kapis.HandleError(request, response, err) - return - } - - // request the Jenkins API to download artifact - c := artifact.Client{JenkinsCore: h.jenkinsClient} - body, err := c.GetArtifact(projectName, pipelineName, runID, fileName) - if err != nil { - kapis.HandleError(request, response, err) - return - } - defer body.Close() - - buf := &bytes.Buffer{} - _, err = io.Copy(buf, body) - if err != nil { - kapis.HandleError(request, response, err) - return - } - - // add download header - response.AddHeader("Content-Type", "application/octet-stream") - response.AddHeader("Content-Disposition", fmt.Sprintf("attachment; filename=%s", fileName)) - _, err = response.Write(buf.Bytes()) - if err != nil { - kapis.HandleError(request, response, err) - return - } -} - func (h *ProjectPipelineHandler) GetRunLog(req *restful.Request, resp *restful.Response) { projectName := req.PathParameter("devops") pipelineName := req.PathParameter("pipeline") diff --git a/pkg/kapis/devops/v1alpha2/register.go b/pkg/kapis/devops/v1alpha2/register.go index f012d653..6697c4b4 100644 --- a/pkg/kapis/devops/v1alpha2/register.go +++ b/pkg/kapis/devops/v1alpha2/register.go @@ -19,11 +19,12 @@ package v1alpha2 import ( "context" "fmt" + "net/url" + "strings" + "github.com/jenkins-zh/jenkins-client/pkg/core" "kubesphere.io/devops/pkg/apiserver/runtime" "kubesphere.io/devops/pkg/client/k8s" - "net/url" - "strings" "github.com/emicklei/go-restful" restfulspec "github.com/emicklei/go-restful-openapi" @@ -226,16 +227,6 @@ func AddPipelineToWebService(webservice *restful.WebService, devopsClient devops Returns(http.StatusOK, "The filed of \"Url\" in response can download artifacts", []devops.Artifacts{}). Writes([]devops.Artifacts{})) - // download PipelineRun artifact - webservice.Route(webservice.GET("/devops/{devops}/pipelines/{pipeline}/runs/{run}/artifacts/download"). - Param(webservice.PathParameter("devops", "DevOps project's ID, e.g. project-RRRRAzLBlLEm")). - Param(webservice.PathParameter("pipeline", "the name of the CI/CD pipeline")). - Param(webservice.PathParameter("run", "pipeline run ID, the unique ID for a pipeline once build.")). - Param(webservice.QueryParameter("filename", "artifact filename. e.g. artifact:v1.0.1")). - To(projectPipelineHandler.downloadArtifact). - Returns(http.StatusOK, api.StatusOK, nil). - Metadata(restfulspec.KeyOpenAPITags, []string{constants.DevOpsPipelineTag})) - // match /blue/rest/organizations/jenkins/pipelines/{devops}/{pipeline}/runs/{run}/log/?start=0 webservice.Route(webservice.GET("/devops/{devops}/pipelines/{pipeline}/runs/{run}/log"). To(projectPipelineHandler.GetRunLog). diff --git a/pkg/kapis/devops/v1alpha2/register_test.go b/pkg/kapis/devops/v1alpha2/register_test.go index 2fee833e..09c654c6 100644 --- a/pkg/kapis/devops/v1alpha2/register_test.go +++ b/pkg/kapis/devops/v1alpha2/register_test.go @@ -18,6 +18,10 @@ package v1alpha2 import ( "context" + "net/http" + "net/http/httptest" + "testing" + "github.com/emicklei/go-restful" "github.com/jenkins-zh/jenkins-client/pkg/core" "github.com/stretchr/testify/assert" @@ -28,9 +32,6 @@ import ( fakedevops "kubesphere.io/devops/pkg/client/devops/fake" "kubesphere.io/devops/pkg/client/k8s" "kubesphere.io/devops/pkg/constants" - "net/http" - "net/http/httptest" - "testing" ) func TestAPIsExist(t *testing.T) { @@ -209,12 +210,6 @@ func TestAPIsExist(t *testing.T) { method: http.MethodPost, uri: "/tojenkinsfile", }, - }, { - name: "artifact download", - args: args{ - method: http.MethodGet, - uri: "/devops/fake/pipelines/fake/runs/fake/artifacts/download", - }, }} for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/pkg/kapis/devops/v1alpha3/pipelinerun/handler.go b/pkg/kapis/devops/v1alpha3/pipelinerun/handler.go index e2f83b79..5596d1a3 100644 --- a/pkg/kapis/devops/v1alpha3/pipelinerun/handler.go +++ b/pkg/kapis/devops/v1alpha3/pipelinerun/handler.go @@ -17,13 +17,16 @@ limitations under the License. package pipelinerun import ( + "bytes" "context" "encoding/json" "fmt" "io" - "kubesphere.io/devops/pkg/kapis" + "net/url" "strconv" + "kubesphere.io/devops/pkg/kapis" + "github.com/emicklei/go-restful" apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/klog" @@ -31,6 +34,7 @@ import ( "kubesphere.io/devops/pkg/apiserver/query" apiserverrequest "kubesphere.io/devops/pkg/apiserver/request" "kubesphere.io/devops/pkg/client/devops" + devopsClient "kubesphere.io/devops/pkg/client/devops" "kubesphere.io/devops/pkg/models/pipelinerun" resourcesV1alpha3 "kubesphere.io/devops/pkg/models/resources/v1alpha3" "sigs.k8s.io/controller-runtime/pkg/client" @@ -38,7 +42,8 @@ import ( // apiHandlerOption holds some useful tools for API handler. type apiHandlerOption struct { - client client.Client + devopsClient devopsClient.Interface + client client.Client } // apiHandler contains functions to handle coming request and give a response. @@ -220,3 +225,56 @@ func (h *apiHandler) getNodeDetails(request *restful.Request, response *restful. _ = response.WriteEntity(&stages) } + +// downloadArtifact API to download artifacts from Jenkins +func (h *apiHandler) downloadArtifact(request *restful.Request, response *restful.Response) { + namespaceName := request.PathParameter("namespace") + pipelineRunName := request.PathParameter("pipelinerun") + filename := request.QueryParameter("filename") + + // get pipelinerun + pr := &v1alpha3.PipelineRun{} + err := h.client.Get(context.Background(), client.ObjectKey{Namespace: namespaceName, Name: pipelineRunName}, pr) + if err != nil { + kapis.HandleError(request, response, err) + return + } + + filename, err = url.QueryUnescape(filename) + if err != nil { + kapis.HandleError(request, response, err) + return + } + + buildID, exists := pr.GetPipelineRunID() + if !exists { + kapis.HandleError(request, response, fmt.Errorf("unable to get PipelineRun nodes due to not found run ID")) + return + } + pipelineName := pr.Labels[v1alpha3.PipelineNameLabelKey] + + // request the Jenkins API to download artifact + body, err := h.devopsClient.DownloadArtifact(namespaceName, pipelineName, buildID, filename) + if err != nil { + kapis.HandleError(request, response, err) + return + } + defer func() { + _ = body.Close() + }() + + buf := &bytes.Buffer{} + if _, err = io.Copy(buf, body); err != nil { + kapis.HandleError(request, response, err) + return + } + + // add download header + response.AddHeader("Content-Type", "application/octet-stream") + response.AddHeader("Content-Disposition", fmt.Sprintf("attachment; filename=%s", filename)) + _, err = response.Write(buf.Bytes()) + if err != nil { + kapis.HandleError(request, response, err) + return + } +} diff --git a/pkg/kapis/devops/v1alpha3/pipelinerun/register.go b/pkg/kapis/devops/v1alpha3/pipelinerun/register.go index 7fb8ed8d..3a7c01b7 100644 --- a/pkg/kapis/devops/v1alpha3/pipelinerun/register.go +++ b/pkg/kapis/devops/v1alpha3/pipelinerun/register.go @@ -19,19 +19,24 @@ package pipelinerun import ( "net/http" + restfulspec "github.com/emicklei/go-restful-openapi" + "kubesphere.io/devops/pkg/constants" + "kubesphere.io/devops/pkg/api/devops/v1alpha3" "kubesphere.io/devops/pkg/models/pipelinerun" "github.com/emicklei/go-restful" "kubesphere.io/devops/pkg/api" "kubesphere.io/devops/pkg/client/devops" + devopsClient "kubesphere.io/devops/pkg/client/devops" "sigs.k8s.io/controller-runtime/pkg/client" ) // RegisterRoutes register routes into web service. -func RegisterRoutes(ws *restful.WebService, c client.Client) { +func RegisterRoutes(ws *restful.WebService, devopsClient devopsClient.Interface, c client.Client) { handler := newAPIHandler(apiHandlerOption{ - client: c, + devopsClient: devopsClient, + client: c, }) ws.Route(ws.GET("/namespaces/{namespace}/pipelines/{pipeline}/pipelineruns"). @@ -69,4 +74,13 @@ func RegisterRoutes(ws *restful.WebService, c client.Client) { Param(ws.PathParameter("namespace", "Namespace of the PipelineRun")). Param(ws.PathParameter("pipelinerun", "Name of the PipelineRun")). Returns(http.StatusOK, api.StatusOK, []pipelinerun.NodeDetail{})) + + // download PipelineRun artifact + ws.Route(ws.GET("/namespaces/{namespace}/pipelineruns/{pipelinerun}/artifacts/download"). + Param(ws.PathParameter("namespace", "Namespace of the PipelineRun")). + Param(ws.PathParameter("pipelinerun", "Name of the PipelineRun")). + Param(ws.QueryParameter("filename", "artifact filename. e.g. artifact:v1.0.1")). + To(handler.downloadArtifact). + Returns(http.StatusOK, api.StatusOK, nil). + Metadata(restfulspec.KeyOpenAPITags, []string{constants.DevOpsPipelineTag})) } diff --git a/pkg/kapis/devops/v1alpha3/pipelinerun/register_test.go b/pkg/kapis/devops/v1alpha3/pipelinerun/register_test.go index b9be6e77..c81e3627 100644 --- a/pkg/kapis/devops/v1alpha3/pipelinerun/register_test.go +++ b/pkg/kapis/devops/v1alpha3/pipelinerun/register_test.go @@ -17,14 +17,16 @@ limitations under the License. package pipelinerun import ( + "net/http" + "net/http/httptest" + "testing" + "github.com/emicklei/go-restful" "github.com/stretchr/testify/assert" "kubesphere.io/devops/pkg/api/devops/v1alpha1" "kubesphere.io/devops/pkg/apiserver/runtime" - "net/http" - "net/http/httptest" + fakedevops "kubesphere.io/devops/pkg/client/devops/fake" "sigs.k8s.io/controller-runtime/pkg/client/fake" - "testing" ) func TestAPIsExist(t *testing.T) { @@ -34,7 +36,7 @@ func TestAPIsExist(t *testing.T) { schema, err := v1alpha1.SchemeBuilder.Register().Build() assert.Nil(t, err) - RegisterRoutes(wsWithGroup, fake.NewFakeClientWithScheme(schema)) + RegisterRoutes(wsWithGroup, fakedevops.NewFakeDevops(nil), fake.NewFakeClientWithScheme(schema)) restful.DefaultContainer.Add(wsWithGroup) type args struct { @@ -68,6 +70,12 @@ func TestAPIsExist(t *testing.T) { method: http.MethodGet, uri: "/namespaces/fake/pipelineruns/fake/nodedetails", }, + }, { + name: "download artifact", + args: args{ + method: http.MethodGet, + uri: "/namespaces/fake/pipelineruns/fake/artifacts/download", + }, }} for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/pkg/kapis/devops/v1alpha3/register.go b/pkg/kapis/devops/v1alpha3/register.go index fec68772..6429de26 100644 --- a/pkg/kapis/devops/v1alpha3/register.go +++ b/pkg/kapis/devops/v1alpha3/register.go @@ -19,10 +19,11 @@ package v1alpha3 import ( + "net/http" + "kubesphere.io/devops/pkg/kapis/devops/v1alpha3/common" "kubesphere.io/devops/pkg/kapis/devops/v1alpha3/scm" "kubesphere.io/devops/pkg/kapis/devops/v1alpha3/template" - "net/http" restful "github.com/emicklei/go-restful" restfulspec "github.com/emicklei/go-restful-openapi" @@ -56,7 +57,7 @@ func AddToContainer(container *restful.Container, devopsClient devopsClient.Inte for _, service := range services { registerRoutes(devopsClient, k8sClient, client, service) - pipelinerun.RegisterRoutes(service, client) + pipelinerun.RegisterRoutes(service, devopsClient, client) pipeline.RegisterRoutes(service, client) template.RegisterRoutes(service, &common.Options{ GenericClient: client, From 0bbe7cdf6d5017af9e07410b867c9e3f17b7c0d8 Mon Sep 17 00:00:00 2001 From: mzmuer Date: Thu, 17 Mar 2022 16:13:08 +0800 Subject: [PATCH 11/11] remove unused code --- pkg/kapis/devops/v1alpha2/handler.go | 5 +---- pkg/kapis/devops/v1alpha2/register.go | 6 +++--- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/pkg/kapis/devops/v1alpha2/handler.go b/pkg/kapis/devops/v1alpha2/handler.go index 32c3633d..8b6eeedb 100644 --- a/pkg/kapis/devops/v1alpha2/handler.go +++ b/pkg/kapis/devops/v1alpha2/handler.go @@ -17,7 +17,6 @@ limitations under the License. package v1alpha2 import ( - "github.com/jenkins-zh/jenkins-client/pkg/core" "kubesphere.io/devops/pkg/client/clientset/versioned" devopsClient "kubesphere.io/devops/pkg/client/devops" "kubesphere.io/devops/pkg/client/informers/externalversions" @@ -31,7 +30,6 @@ type ProjectPipelineHandler struct { k8sClient k8s.Client devopsOperator devops.DevopsOperator projectCredentialGetter devops.ProjectCredentialGetter - jenkinsClient core.JenkinsCore } type PipelineSonarHandler struct { @@ -39,12 +37,11 @@ type PipelineSonarHandler struct { pipelineSonarGetter devops.PipelineSonarGetter } -func NewProjectPipelineHandler(devopsClient devopsClient.Interface, k8sClient k8s.Client, jenkinsClient core.JenkinsCore) ProjectPipelineHandler { +func NewProjectPipelineHandler(devopsClient devopsClient.Interface, k8sClient k8s.Client) ProjectPipelineHandler { return ProjectPipelineHandler{ devopsOperator: devops.NewDevopsOperator(devopsClient, k8sClient.Kubernetes(), k8sClient.KubeSphere()), projectCredentialGetter: devops.NewProjectCredentialOperator(devopsClient), k8sClient: k8sClient, - jenkinsClient: jenkinsClient, } } diff --git a/pkg/kapis/devops/v1alpha2/register.go b/pkg/kapis/devops/v1alpha2/register.go index 6697c4b4..36c502e3 100644 --- a/pkg/kapis/devops/v1alpha2/register.go +++ b/pkg/kapis/devops/v1alpha2/register.go @@ -71,7 +71,7 @@ func AddToContainer(container *restful.Container, ksInformers externalversions.S func addToContainerWithWebService(container *restful.Container, ksInformers externalversions.SharedInformerFactory, devopsClient devops.Interface, sonarqubeClient sonarqube.SonarInterface, ksClient versioned.Interface, s3Client s3.Interface, endpoint string, k8sClient k8s.Client, jenkinsClient core.JenkinsCore, ws *restful.WebService) error { - err := AddPipelineToWebService(ws, devopsClient, k8sClient, jenkinsClient) + err := AddPipelineToWebService(ws, devopsClient, k8sClient) if err != nil { return err } @@ -95,11 +95,11 @@ func addToContainerWithWebService(container *restful.Container, ksInformers exte return nil } -func AddPipelineToWebService(webservice *restful.WebService, devopsClient devops.Interface, k8sClient k8s.Client, jenkinsClient core.JenkinsCore) error { +func AddPipelineToWebService(webservice *restful.WebService, devopsClient devops.Interface, k8sClient k8s.Client) error { projectPipelineEnable := devopsClient != nil if projectPipelineEnable { - projectPipelineHandler := NewProjectPipelineHandler(devopsClient, k8sClient, jenkinsClient) + projectPipelineHandler := NewProjectPipelineHandler(devopsClient, k8sClient) webservice.Route(webservice.GET("/devops/{devops}/credentials/{credential}/usage"). To(projectPipelineHandler.GetProjectCredentialUsage).