From e64e8bb93b6e0e43be4069d9821aef001321c60c Mon Sep 17 00:00:00 2001 From: sunzhu Date: Wed, 17 Apr 2019 11:04:04 +0800 Subject: [PATCH] add jenkins api Signed-off-by: soulseen --- .gitignore | 1 + cmd/ks-apiserver/apiserver.go | 1 + pkg/apis/devops/install/install.go | 33 +++++ pkg/apis/devops/v1alpha2/register.go | 119 ++++++++++++++++ pkg/apiserver/devops/devops.go | 120 ++++++++++++++++ pkg/models/devops/devops.go | 196 +++++++++++++++++++++++++++ pkg/models/devops/jkerror.go | 34 +++++ pkg/models/devops/json.go | 164 ++++++++++++++++++++++ pkg/models/devops/urlconfig.go | 28 ++++ tools/cmd/doc-gen/main.go | 1 + 10 files changed, 697 insertions(+) create mode 100644 pkg/apis/devops/install/install.go create mode 100644 pkg/apis/devops/v1alpha2/register.go create mode 100644 pkg/apiserver/devops/devops.go create mode 100644 pkg/models/devops/devops.go create mode 100644 pkg/models/devops/jkerror.go create mode 100644 pkg/models/devops/json.go create mode 100644 pkg/models/devops/urlconfig.go diff --git a/.gitignore b/.gitignore index f564d8ad5..192f2e5d0 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,4 @@ tmp/ # OSX trash .DS_Store +api.json diff --git a/cmd/ks-apiserver/apiserver.go b/cmd/ks-apiserver/apiserver.go index 2ac59e2e2..c6637d74c 100644 --- a/cmd/ks-apiserver/apiserver.go +++ b/cmd/ks-apiserver/apiserver.go @@ -21,6 +21,7 @@ import ( "kubesphere.io/kubesphere/cmd/ks-apiserver/app" "log" // Install apis + _ "kubesphere.io/kubesphere/pkg/apis/devops/install" _ "kubesphere.io/kubesphere/pkg/apis/logging/install" _ "kubesphere.io/kubesphere/pkg/apis/metrics/install" _ "kubesphere.io/kubesphere/pkg/apis/monitoring/install" diff --git a/pkg/apis/devops/install/install.go b/pkg/apis/devops/install/install.go new file mode 100644 index 000000000..31cada4cf --- /dev/null +++ b/pkg/apis/devops/install/install.go @@ -0,0 +1,33 @@ +/* + + Copyright 2019 The KubeSphere Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + */ +package install + +import ( + "github.com/emicklei/go-restful" + urlruntime "k8s.io/apimachinery/pkg/util/runtime" + devopsv1alpha2 "kubesphere.io/kubesphere/pkg/apis/devops/v1alpha2" + "kubesphere.io/kubesphere/pkg/apiserver/runtime" +) + +func init() { + Install(runtime.Container) +} + +func Install(c *restful.Container) { + urlruntime.Must(devopsv1alpha2.AddToContainer(c)) +} \ No newline at end of file diff --git a/pkg/apis/devops/v1alpha2/register.go b/pkg/apis/devops/v1alpha2/register.go new file mode 100644 index 000000000..5304ea6ae --- /dev/null +++ b/pkg/apis/devops/v1alpha2/register.go @@ -0,0 +1,119 @@ +/* + + Copyright 2019 The KubeSphere Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + */ +package v1alpha2 + +import ( + "github.com/emicklei/go-restful" + "github.com/emicklei/go-restful-openapi" + "k8s.io/apimachinery/pkg/runtime/schema" + "kubesphere.io/kubesphere/pkg/apiserver/devops" + "kubesphere.io/kubesphere/pkg/apiserver/runtime" +) + +const GroupName = "devops.kubesphere.io" + +var GroupVersion = schema.GroupVersion{Group: GroupName, Version: "v1alpha2"} + +var ( + WebServiceBuilder = runtime.NewContainerBuilder(addWebService) + AddToContainer = WebServiceBuilder.AddToContainer +) + +func addWebService(c *restful.Container) error { + webservice := runtime.NewWebService(GroupVersion) + + tags := []string{"devops"} + + // match Jenkisn api "/blue/rest/organizations/jenkins/pipelines/{projectName}/{pipelineName}" + webservice.Route(webservice.GET("/devops/{projectName}/pipelines/{pipelineName}"). + To(devops.GetPipeline). + Metadata(restfulspec.KeyOpenAPITags, tags). + Doc("Get DevOps Pipelines."). + Param(webservice.PathParameter("pipelineName", "pipeline name")). + Param(webservice.PathParameter("projectName", "devops project name"))) + + // match Jenkisn api: "jenkins_api/blue/rest/search" + webservice.Route(webservice.GET("/devops/search"). + To(devops.SearchPipelines). + Metadata(restfulspec.KeyOpenAPITags, tags). + Doc("Search DevOps resource."). + Param(webservice.QueryParameter("q", "query pipelines"). + Required(false)). + Param(webservice.QueryParameter("filter", "filter resource"). + Required(false)). + Param(webservice.QueryParameter("start", "start page"). + Required(false)). + Param(webservice.QueryParameter("limit", "limit count"). + Required(false))) + + // match Jenkisn api "/blue/rest/organizations/jenkins/pipelines/{projectName}/{pipelineName}/runs/" + webservice.Route(webservice.GET("/devops/{projectName}/pipelines/{pipelineName}/runs"). + To(devops.SearchPipelineRuns). + Metadata(restfulspec.KeyOpenAPITags, tags). + Doc("Search DevOps Pipelines runs."). + Param(webservice.PathParameter("pipelineName", "pipeline name")). + Param(webservice.PathParameter("projectName", "devops project name")). + Param(webservice.QueryParameter("start", "start page"). + Required(false)). + Param(webservice.QueryParameter("limit", "limit count"). + Required(false))) + + // match Jenkins api "/blue/rest/organizations/jenkins/pipelines/{projectName}/{pipelineName}/branches/{branchName}/runs/{runId}/" + webservice.Route(webservice.GET("/devops/{projectName}/pipelines/{pipelineName}/branches/{branchName}/runs/{runId}"). + To(devops.GetPipelineRun). + Metadata(restfulspec.KeyOpenAPITags, tags). + Doc("Get DevOps Pipelines run."). + Param(webservice.PathParameter("pipelineName", "pipeline name")). + Param(webservice.PathParameter("projectName", "devops project name")). + Param(webservice.PathParameter("branchName", "pipeline branch name")). + Param(webservice.PathParameter("runId", "pipeline runs id"))) + + // match Jenkins api "/blue/rest/organizations/jenkins/pipelines/{projectName}/{pipelineName}/branches/{branchName}/runs/{runId}/nodes" + webservice.Route(webservice.GET("/devops/{projectName}/pipelines/{pipelineName}/branches/{branchName}/runs/{runId}/nodes"). + To(devops.GetPipelineRunNodes). + Metadata(restfulspec.KeyOpenAPITags, tags). + Doc("Get node on DevOps Pipelines run."). + Param(webservice.PathParameter("projectName", "devops project name")). + Param(webservice.PathParameter("pipelineName", "pipeline name")). + Param(webservice.PathParameter("branchName", "pipeline branch name")). + Param(webservice.PathParameter("runId", "pipeline runs id")). + Param(webservice.QueryParameter("limit", "limit"). + Required(false). + DataFormat("limit=%d"). + DefaultValue("limit=10000"))) + + // match "/blue/rest/organizations/jenkins/pipelines/{projectName}/{pipelineName}/branches/{branchName}/runs/{runId}/nodes/{nodeId}/steps/{stepId}/log/?start=0" + webservice.Route(webservice.GET("/devops/{projectName}/pipelines/{pipelineName}/branches/{branchName}/runs/{runId}/nodes/{nodeId}/steps/{stepId}/log"). + To(devops.GetStepLog). + Metadata(restfulspec.KeyOpenAPITags, tags). + Doc("Get Pipelines step log."). + Param(webservice.PathParameter("projectName", "devops project name")). + Param(webservice.PathParameter("pipelineName", "pipeline name")). + Param(webservice.PathParameter("branchName", "pipeline branch name")). + Param(webservice.PathParameter("runId", "pipeline runs id")). + Param(webservice.PathParameter("nodeId", "pipeline runs node id")). + Param(webservice.PathParameter("stepId", "pipeline runs step id")). + Param(webservice.QueryParameter("start", "start"). + Required(true). + DataFormat("start=%d"). + DefaultValue("start=0"))) + + c.Add(webservice) + + return nil +} diff --git a/pkg/apiserver/devops/devops.go b/pkg/apiserver/devops/devops.go new file mode 100644 index 000000000..95b36a49b --- /dev/null +++ b/pkg/apiserver/devops/devops.go @@ -0,0 +1,120 @@ +/* + + Copyright 2019 The KubeSphere Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + */ +package devops + +import ( + "github.com/emicklei/go-restful" + "kubesphere.io/kubesphere/pkg/errors" + "kubesphere.io/kubesphere/pkg/models/devops" + "net/http" +) + +func GetPipeline(req *restful.Request, resp *restful.Response) { + projectName := req.PathParameter("projectName") + pipelineName := req.PathParameter("pipelineName") + + res, err := devops.GetPipeline(projectName, pipelineName, req.Request) + if err != nil { + parseErr(err, resp) + return + } + + _ = resp.WriteAsJson(res) +} + +func SearchPipelines(req *restful.Request, resp *restful.Response) { + + res, err := devops.SearchPipelines(req.Request) + if err != nil { + parseErr(err, resp) + return + } + + _ = resp.WriteAsJson(res) +} + +func SearchPipelineRuns(req *restful.Request, resp *restful.Response) { + projectName := req.PathParameter("projectName") + pipelineName := req.PathParameter("pipelineName") + + res, err := devops.SearchPipelineRuns(projectName, pipelineName, req.Request) + if err != nil { + parseErr(err, resp) + return + } + + _ = resp.WriteAsJson(res) + +} + +func GetPipelineRun(req *restful.Request, resp *restful.Response) { + projectName := req.PathParameter("projectName") + pipelineName := req.PathParameter("pipelineName") + branchName := req.PathParameter("branchName") + runId := req.PathParameter("runId") + + res, err := devops.GetPipelineRun(projectName, pipelineName, branchName, runId, req.Request) + if err != nil { + parseErr(err, resp) + return + } + + _ = resp.WriteAsJson(res) +} + +func GetPipelineRunNodes(req *restful.Request, resp *restful.Response) { + projectName := req.PathParameter("projectName") + pipelineName := req.PathParameter("pipelineName") + branchName := req.PathParameter("branchName") + runId := req.PathParameter("runId") + + res, err := devops.GetPipelineRunNodes(projectName, pipelineName, branchName, runId, req.Request) + if err != nil { + parseErr(err, resp) + return + } + + _ = resp.WriteAsJson(res) + +} + +func GetStepLog(req *restful.Request, resp *restful.Response) { + projectName := req.PathParameter("projectName") + pipelineName := req.PathParameter("pipelineName") + branchName := req.PathParameter("branchName") + runId := req.PathParameter("runId") + nodeId := req.PathParameter("nodeId") + stepId := req.PathParameter("stepId") + + res, err := devops.GetStepLog(projectName, pipelineName, branchName, runId, nodeId, stepId, req.Request) + if err != nil { + parseErr(err, resp) + return + } + _, _ = resp.Write(res) + +} + +func parseErr(err error, resp *restful.Response) { + if jErr, ok := err.(*devops.JkError); ok { + _ = resp.WriteHeaderAndEntity(jErr.Code, err) + } else { + _ = resp.WriteHeaderAndEntity(http.StatusInternalServerError, errors.Wrap(err)) + } + return +} diff --git a/pkg/models/devops/devops.go b/pkg/models/devops/devops.go new file mode 100644 index 000000000..656de8fb1 --- /dev/null +++ b/pkg/models/devops/devops.go @@ -0,0 +1,196 @@ +/* + + Copyright 2019 The KubeSphere Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + */ +package devops + +import ( + "compress/gzip" + "encoding/json" + "flag" + "fmt" + log "github.com/golang/glog" + "io" + "io/ioutil" + "net/http" + "net/url" + "time" +) + +var JenkinsUrl string + +func init() { + flag.StringVar(&JenkinsUrl, "jenkins-url", "http://ks-jenkins.kubesphere-devops-system.svc.cluster.local:80", "jenkins server host") +} + +func GetPipeline(projectName, pipelineName string, req *http.Request) (*Pipeline, error) { + baseUrl := fmt.Sprintf(JenkinsUrl+GetPipelineUrl, projectName, pipelineName) + log.Infof("Jenkins-url: " + baseUrl) + + resBody, err := jenkinsClient(baseUrl, req) + if err != nil { + return nil, err + } + + var res = new(Pipeline) + err = json.Unmarshal(resBody, &res) + if err != nil { + log.Error(err) + return nil, err + } + + return res, err +} + +func SearchPipelines(req *http.Request) ([]interface{}, error) { + baseUrl := JenkinsUrl + SearchPipelineUrl + req.URL.RawQuery + log.Infof("Jenkins-url: " + baseUrl) + + resBody, err := jenkinsClient(baseUrl, req) + if err != nil { + return nil, err + } + + var res []interface{} + err = json.Unmarshal(resBody, &res) + if err != nil { + log.Error(err) + return nil, err + } + + return res, err +} + +func SearchPipelineRuns(projectName, pipelineName string, req *http.Request) ([]interface{}, error) { + baseUrl := fmt.Sprintf(JenkinsUrl+SearchPipelineRunUrl+req.URL.RawQuery, projectName, pipelineName) + log.Infof("Jenkins-url: " + baseUrl) + + resBody, err := jenkinsClient(baseUrl, req) + if err != nil { + return nil, err + } + + var res []interface{} + err = json.Unmarshal(resBody, &res) + if err != nil { + log.Error(err) + return nil, err + } + + return res, err +} + +func GetPipelineRun(projectName, pipelineName, branchName, runId string, req *http.Request) (*Pipeline, error) { + baseUrl := fmt.Sprintf(JenkinsUrl+GetPipelineRunUrl, projectName, pipelineName, branchName, runId) + log.Infof("Jenkins-url: " + baseUrl) + + resBody, err := jenkinsClient(baseUrl, req) + if err != nil { + return nil, err + } + + var res = new(Pipeline) + err = json.Unmarshal(resBody, &res) + if err != nil { + log.Error(err) + return nil, err + } + + return res, err +} + +func GetPipelineRunNodes(projectName, pipelineName, branchName, runId string, req *http.Request) ([]interface{}, error) { + baseUrl := fmt.Sprintf(JenkinsUrl+GetPipelineRunNodesUrl+req.URL.RawQuery, projectName, pipelineName, branchName, runId) + log.Infof("Jenkins-url: " + baseUrl) + + resBody, err := jenkinsClient(baseUrl, req) + if err != nil { + return nil, err + } + + var res []interface{} + err = json.Unmarshal(resBody, &res) + if err != nil { + log.Error(err) + return nil, err + } + + return res, err +} + +func GetStepLog(projectName, pipelineName, branchName, runId, nodeId, stepId string, req *http.Request) ([]byte, error) { + baseUrl := fmt.Sprintf(JenkinsUrl+GetStepLogUrl+req.URL.RawQuery, projectName, pipelineName, branchName, runId, nodeId, stepId) + log.Infof("Jenkins-url: " + baseUrl) + + resBody, err := jenkinsClient(baseUrl, req) + if err != nil { + return nil, err + } + + return resBody, err +} + +// create jenkins request +func jenkinsClient(baseUrl string, req *http.Request) ([]byte, error) { + newReqUrl, err := url.Parse(baseUrl) + if err != nil { + log.Error(err) + return nil, err + } + + client := &http.Client{Timeout: 30 * time.Second} + + newRequest := &http.Request{ + Method: req.Method, + URL: newReqUrl, + Header: req.Header, + Body: req.Body, + } + + resp, err := client.Do(newRequest) + if err != nil { + log.Error(err) + return nil, err + } + defer resp.Body.Close() + + resBody, _ := getRespBody(resp) + if resp.StatusCode >= http.StatusBadRequest { + jkerr := new(JkError) + _ = json.Unmarshal(resBody, jkerr) + log.Error(nil, jkerr) + return nil, jkerr + } + + return resBody, err +} + +// Decompress response.body of JenkinsAPIResponse +func getRespBody(resp *http.Response) ([]byte, error) { + var reader io.ReadCloser + if resp.Header.Get("Content-Encoding") == "gzip" { + reader, _ = gzip.NewReader(resp.Body) + } else { + reader = resp.Body + } + resBody, err := ioutil.ReadAll(reader) + if err != nil { + log.Error(err) + return nil, err + } + return resBody, err + +} diff --git a/pkg/models/devops/jkerror.go b/pkg/models/devops/jkerror.go new file mode 100644 index 000000000..7a5294ca6 --- /dev/null +++ b/pkg/models/devops/jkerror.go @@ -0,0 +1,34 @@ +/* + + Copyright 2019 The KubeSphere Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + */ +package devops + +type JkError struct { + Message string `json:"message"` + Code int `json:"code"` + Errors []Errors `json:"errors"` +} + +type Errors struct { + Message string `json:"message"` + Code string `json:"code"` + Field string `json:"field"` +} + +func (err *JkError) Error() string { + return err.Message +} diff --git a/pkg/models/devops/json.go b/pkg/models/devops/json.go new file mode 100644 index 000000000..f687709ee --- /dev/null +++ b/pkg/models/devops/json.go @@ -0,0 +1,164 @@ +/* + + Copyright 2019 The KubeSphere Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +*/ +package devops + +type Pipeline struct { + Class string `json:"_class,omitempty"` + Links Links `json:"_links,omitempty"` + Actions []interface{} `json:"actions,omitempty"` + DisplayName string `json:"displayName,omitempty"` + FullDisplayName string `json:"fullDisplayName,omitempty"` + FullName string `json:"fullName,omitempty"` + Name interface{} `json:"name,omitempty"` + Organization string `json:"organization,omitempty"` + Parameters interface{} `json:"parameters,omitempty"` + Permissions Permissions `json:"permissions,omitempty"` + EstimatedDurationInMillis int `json:"estimatedDurationInMillis,omitempty"` + NumberOfFolders int `json:"numberOfFolders,omitempty"` + NumberOfPipelines int `json:"numberOfPipelines,omitempty"` + PipelineFolderNames []interface{} `json:"pipelineFolderNames,omitempty"` + WeatherScore int `json:"weatherScore,omitempty"` + BranchNames []string `json:"branchNames,omitempty"` + NumberOfFailingBranches int `json:"numberOfFailingBranches,omitempty"` + NumberOfFailingPullRequests int `json:"numberOfFailingPullRequests,omitempty"` + NumberOfSuccessfulBranches int `json:"numberOfSuccessfulBranches,omitempty"` + NumberOfSuccessfulPullRequests int `json:"numberOfSuccessfulPullRequests,omitempty"` + ScmSource ScmSource `json:"scmSource,omitempty"` + TotalNumberOfBranches int `json:"totalNumberOfBranches,omitempty"` + TotalNumberOfPullRequests int `json:"totalNumberOfPullRequests,omitempty"` + ArtifactsZipFile interface{} `json:"artifactsZipFile,omitempty"` + CauseOfBlockage interface{} `json:"causeOfBlockage,omitempty"` + Causes []Causes `json:"causes,omitempty"` + ChangeSet []interface{} `json:"changeSet,omitempty"` + Description interface{} `json:"description,omitempty"` + DurationInMillis int `json:"durationInMillis,omitempty"` + EnQueueTime string `json:"enQueueTime,omitempty"` + EndTime string `json:"endTime,omitempty"` + ID string `json:"id,omitempty"` + Pipeline string `json:"pipeline,omitempty"` + Replayable bool `json:"replayable,omitempty"` + Result string `json:"result,omitempty"` + RunSummary string `json:"runSummary,omitempty"` + StartTime string `json:"startTime,omitempty"` + State string `json:"state,omitempty"` + Type string `json:"type,omitempty"` + Branch Branch `json:"branch,omitempty"` + CommitID string `json:"commitId,omitempty"` + CommitURL interface{} `json:"commitUrl,omitempty"` + PullRequest interface{} `json:"pullRequest,omitempty"` +} +type Self struct { + Class string `json:"_class,omitempty"` + Href string `json:"href,omitempty"` +} +type Scm struct { + Class string `json:"_class,omitempty"` + Href string `json:"href,omitempty"` +} +type Branches struct { + Class string `json:"_class,omitempty"` + Href string `json:"href,omitempty"` +} +type Actions struct { + Class string `json:"_class,omitempty"` + Href string `json:"href,omitempty"` +} +type Runs struct { + Class string `json:"_class,omitempty"` + Href string `json:"href,omitempty"` +} +type Trends struct { + Class string `json:"_class,omitempty"` + Href string `json:"href,omitempty"` +} +type Queue struct { + Class string `json:"_class,omitempty"` + Href string `json:"href,omitempty"` +} +type Links struct { + Self Self `json:"self,omitempty"` + Scm Scm `json:"scm,omitempty"` + Branches Branches `json:"branches,omitempty"` + Actions Actions `json:"actions,omitempty"` + Runs Runs `json:"runs,omitempty"` + Trends Trends `json:"trends,omitempty"` + Queue Queue `json:"queue,omitempty"` + PrevRun PrevRun `json:"prevRun"` + Parent Parent `json:"parent"` + Tests Tests `json:"tests"` + Nodes Nodes `json:"nodes"` + Log Log `json:"log"` + BlueTestSummary BlueTestSummary `json:"blueTestSummary"` + Steps Steps `json:"steps"` + Artifacts Artifacts `json:"artifacts"` +} +type Permissions struct { + Create bool `json:"create,omitempty"` + Configure bool `json:"configure,omitempty"` + Read bool `json:"read,omitempty"` + Start bool `json:"start,omitempty"` + Stop bool `json:"stop,omitempty"` +} +type ScmSource struct { + Class string `json:"_class,omitempty"` + APIURL interface{} `json:"apiUrl,omitempty"` + ID string `json:"id,omitempty"` +} +type PrevRun struct { + Class string `json:"_class"` + Href string `json:"href"` +} +type Parent struct { + Class string `json:"_class"` + Href string `json:"href"` +} +type Tests struct { + Class string `json:"_class"` + Href string `json:"href"` +} +type Nodes struct { + Class string `json:"_class"` + Href string `json:"href"` +} +type Log struct { + Class string `json:"_class"` + Href string `json:"href"` +} +type BlueTestSummary struct { + Class string `json:"_class"` + Href string `json:"href"` +} +type Steps struct { + Class string `json:"_class"` + Href string `json:"href"` +} +type Artifacts struct { + Class string `json:"_class"` + Href string `json:"href"` +} +type Causes struct { + Class string `json:"_class"` + ShortDescription string `json:"shortDescription"` + UserID string `json:"userId,omitempty"` + UserName string `json:"userName,omitempty"` +} +type Branch struct { + IsPrimary bool `json:"isPrimary"` + Issues []interface{} `json:"issues"` + URL string `json:"url"` +} diff --git a/pkg/models/devops/urlconfig.go b/pkg/models/devops/urlconfig.go new file mode 100644 index 000000000..a6993f7f0 --- /dev/null +++ b/pkg/models/devops/urlconfig.go @@ -0,0 +1,28 @@ +/* + + Copyright 2019 The KubeSphere Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + */ +package devops + +// Some apis for Jenkins. +const ( + GetPipelineUrl = "/blue/rest/organizations/jenkins/pipelines/%s/%s/" + SearchPipelineUrl = "/blue/rest/search/?" + SearchPipelineRunUrl = "/blue/rest/organizations/jenkins/pipelines/%s/%s/runs/?" + GetPipelineRunUrl = "/blue/rest/organizations/jenkins/pipelines/%s/%s/branches/%s/runs/%s/" + GetPipelineRunNodesUrl = "/blue/rest/organizations/jenkins/pipelines/%s/%s/branches/%s/runs/%s/nodes/?" + GetStepLogUrl = "/blue/rest/organizations/jenkins/pipelines/%s/%s/branches/%s/runs/%s/nodes/%s/steps/%s/log/?" +) diff --git a/tools/cmd/doc-gen/main.go b/tools/cmd/doc-gen/main.go index 29161dd13..74279d9db 100644 --- a/tools/cmd/doc-gen/main.go +++ b/tools/cmd/doc-gen/main.go @@ -31,6 +31,7 @@ import ( "kubesphere.io/kubesphere/pkg/apiserver/runtime" "log" // Install apis + _ "kubesphere.io/kubesphere/pkg/apis/devops/install" _ "kubesphere.io/kubesphere/pkg/apis/metrics/install" _ "kubesphere.io/kubesphere/pkg/apis/monitoring/install" _ "kubesphere.io/kubesphere/pkg/apis/operations/install"