This is an automated email from the ASF dual-hosted git repository.
abeizn pushed a commit to branch zk-dc-0911
in repository https://gitbox.apache.org/repos/asf/incubator-devlake.git
The following commit(s) were added to refs/heads/zk-dc-0911 by this push:
new 528af8ba6 feat: jenkins dora config
528af8ba6 is described below
commit 528af8ba68510726606483090f2134f9e1e098d0
Author: abeizn <[email protected]>
AuthorDate: Wed Sep 11 16:16:19 2024 +0800
feat: jenkins dora config
---
backend/plugins/github/api/connection_api.go | 4 +-
backend/plugins/jenkins/api/connection_api.go | 94 ++++++++++++++++++++++
backend/plugins/jenkins/impl/impl.go | 3 +
backend/plugins/jenkins/models/build.go | 20 ++---
...{register.go => 20240911_add_url_for_builds.go} | 40 +++++----
.../jenkins/models/migrationscripts/register.go | 1 +
backend/plugins/jenkins/models/response.go | 1 +
backend/plugins/jenkins/tasks/build_collector.go | 2 +-
backend/plugins/jenkins/tasks/build_extractor.go | 1 +
9 files changed, 137 insertions(+), 29 deletions(-)
diff --git a/backend/plugins/github/api/connection_api.go
b/backend/plugins/github/api/connection_api.go
index 02c0265de..de0991ef6 100644
--- a/backend/plugins/github/api/connection_api.go
+++ b/backend/plugins/github/api/connection_api.go
@@ -410,7 +410,7 @@ func TestExistingConnection(input *plugin.ApiResourceInput)
(*plugin.ApiResource
// @Tags plugins/github
// @Param id path int true "id"
// @Param connectionId path int true "connectionId"
-// @Success 200 {object} models.GithubScopeConfigDeployment
+// @Success 200 {array} string "List of Environment Names"
// @Failure 400 {object} shared.ApiBody "Bad Request"
// @Failure 500 {object} shared.ApiBody "Internal Error"
// @Router /plugins/github/connections/{connectionId}/deployments [GET]
@@ -437,7 +437,7 @@ func GetConnectionDeployments(input
*plugin.ApiResourceInput) (*plugin.ApiResour
// @Tags plugins/github
// @Param id path int true "id"
// @Param connectionId path int true "connectionId"
-// @Success 200 {object} models.GithubScopeConfigDeployment
+// @Success 200 {object} map[string]interface{}
// @Failure 400 {object} shared.ApiBody "Bad Request"
// @Failure 500 {object} shared.ApiBody "Internal Error"
// @Router /plugins/github/connections/{connectionId}/transform-to-deployments
[POST]
diff --git a/backend/plugins/jenkins/api/connection_api.go
b/backend/plugins/jenkins/api/connection_api.go
index b213bb068..4b5dd5ceb 100644
--- a/backend/plugins/jenkins/api/connection_api.go
+++ b/backend/plugins/jenkins/api/connection_api.go
@@ -19,6 +19,7 @@ package api
import (
"context"
+ "fmt"
"net/http"
"strings"
@@ -176,3 +177,96 @@ func ListConnections(input *plugin.ApiResourceInput)
(*plugin.ApiResourceOutput,
func GetConnection(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput,
errors.Error) {
return dsHelper.ConnApi.GetDetail(input)
}
+
+// GetConnectionTransformToDeployments return one connection deployments
+// @Summary return one connection deployments
+// @Description return one connection deployments
+// @Tags plugins/jenkins
+// @Param id path int true "id"
+// @Param connectionId path int true "connectionId"
+// @Success 200 {object} map[string]interface{}
+// @Failure 400 {object} shared.ApiBody "Bad Request"
+// @Failure 500 {object} shared.ApiBody "Internal Error"
+// @Router
/plugins/jenkins/connections/{connectionId}/transform-to-deployments [POST]
+func GetConnectionTransformToDeployments(input *plugin.ApiResourceInput)
(*plugin.ApiResourceOutput, errors.Error) {
+ db := basicRes.GetDal()
+ connectionId := input.Params["connectionId"]
+ deploymentPattern := input.Body["deploymentPattern"]
+ productionPattern := input.Body["productionPattern"]
+ page, err := api.ParsePageParam(input.Body, "page", 1)
+ if err != nil {
+ return nil, errors.Default.New("invalid page value")
+ }
+ pageSize, err := api.ParsePageParam(input.Body, "pageSize", 10)
+ if err != nil {
+ return nil, errors.Default.New("invalid pageSize value")
+ }
+
+ cursor, err := db.RawCursor(`
+ SELECT DISTINCT number, job_name, full_name, url, start_time
+ FROM(
+ SELECT number, job_name, full_name, url, start_time
+ FROM _tool_jenkins_builds
+ WHERE connection_id = ? AND full_name REGEXP ?
+ AND full_name REGEXP ?
+ UNION
+ SELECT number, job_name, full_name, url, start_time
+ FROM _tool_jenkins_stages s
+ LEFT JOIN _tool_jenkins_builds b ON b.full_name =
s.build_name
+ WHERE s.connection_id = ? AND s.name REGEXP ?
+ AND s.name REGEXP ?
+ ) AS t
+ ORDER BY start_time DESC
+ `, connectionId, deploymentPattern, productionPattern, connectionId,
deploymentPattern, productionPattern)
+ if err != nil {
+ return nil, errors.Default.Wrap(err, "error on get")
+ }
+ defer cursor.Close()
+
+ type selectFileds struct {
+ Number int
+ JobName string
+ FullName string
+ URL string
+ }
+ type transformedFields struct {
+ Name string
+ URL string
+ }
+ var allRuns []transformedFields
+ for cursor.Next() {
+ sf := &selectFileds{}
+ err = db.Fetch(cursor, sf)
+ if err != nil {
+ return nil, errors.Default.Wrap(err, "error on fetch")
+ }
+ // Directly transform and append to allRuns
+ transformed := transformedFields{
+ Name: fmt.Sprintf("#%d - %s", sf.Number, sf.JobName),
+ URL: sf.URL,
+ }
+ allRuns = append(allRuns, transformed)
+ }
+ // Calculate total count
+ totalCount := len(allRuns)
+
+ // Paginate in memory
+ start := (page - 1) * pageSize
+ end := start + pageSize
+ if start > totalCount {
+ start = totalCount
+ }
+ if end > totalCount {
+ end = totalCount
+ }
+ pagedRuns := allRuns[start:end]
+
+ // Return result containing paged runs and total count
+ result := map[string]interface{}{
+ "total": totalCount,
+ "data": pagedRuns,
+ }
+ return &plugin.ApiResourceOutput{
+ Body: result,
+ }, nil
+}
diff --git a/backend/plugins/jenkins/impl/impl.go
b/backend/plugins/jenkins/impl/impl.go
index 297d9e4b3..ef091a9c7 100644
--- a/backend/plugins/jenkins/impl/impl.go
+++ b/backend/plugins/jenkins/impl/impl.go
@@ -211,6 +211,9 @@ func (p Jenkins) ApiResources()
map[string]map[string]plugin.ApiResourceHandler
"POST": api.CreateScopeConfig,
"GET": api.GetScopeConfigList,
},
+ "connections/:connectionId/transform-to-deployments": {
+ "POST": api.GetConnectionTransformToDeployments,
+ },
"connections/:connectionId/scope-configs/:scopeConfigId": {
"PATCH": api.UpdateScopeConfig,
"GET": api.GetScopeConfig,
diff --git a/backend/plugins/jenkins/models/build.go
b/backend/plugins/jenkins/models/build.go
index 203d81d00..804c5521c 100644
--- a/backend/plugins/jenkins/models/build.go
+++ b/backend/plugins/jenkins/models/build.go
@@ -18,22 +18,24 @@ limitations under the License.
package models
import (
- "github.com/apache/incubator-devlake/core/models/common"
"time"
+
+ "github.com/apache/incubator-devlake/core/models/common"
)
// JenkinsBuild db entity for jenkins build
type JenkinsBuild struct {
common.NoPKModel
// collected fields
- ConnectionId uint64 `gorm:"primaryKey"`
- JobName string `gorm:"index;type:varchar(255)"`
- JobPath string `gorm:"index;type:varchar(255)"`
- Duration float64 // build time
- FullName string `gorm:"primaryKey;type:varchar(255)"` //
"path/job name#7"
- EstimatedDuration float64 // EstimatedDuration
- Number int64 `gorm:"index"`
- Result string // Result
+ ConnectionId uint64 `gorm:"primaryKey"`
+ JobName string `gorm:"index;type:varchar(255)"`
+ JobPath string `gorm:"index;type:varchar(255)"`
+ Duration float64 // build time
+ FullName string `gorm:"primaryKey;type:varchar(255)"` //
"path/job name#7"
+ EstimatedDuration float64 // EstimatedDuration
+ Number int64 `gorm:"index"`
+ Result string // Result
+ Url string
Timestamp int64 // start time
StartTime time.Time // convered by timestamp
Type string `gorm:"index;type:varchar(255)"`
diff --git a/backend/plugins/jenkins/models/migrationscripts/register.go
b/backend/plugins/jenkins/models/migrationscripts/20240911_add_url_for_builds.go
similarity index 59%
copy from backend/plugins/jenkins/models/migrationscripts/register.go
copy to
backend/plugins/jenkins/models/migrationscripts/20240911_add_url_for_builds.go
index 1dc1eb84b..d3959b55a 100644
--- a/backend/plugins/jenkins/models/migrationscripts/register.go
+++
b/backend/plugins/jenkins/models/migrationscripts/20240911_add_url_for_builds.go
@@ -18,23 +18,29 @@ limitations under the License.
package migrationscripts
import (
- "github.com/apache/incubator-devlake/core/plugin"
+ "github.com/apache/incubator-devlake/core/context"
+ "github.com/apache/incubator-devlake/core/errors"
)
-// All return all the migration scripts
-func All() []plugin.MigrationScript {
- return []plugin.MigrationScript{
- new(addInitTables),
- new(modifyAllEntities),
- new(modifyJenkinsBuild),
- new(addJobFields),
- new(addJobPathForBuilds),
- new(changeIndexOfJobPath),
- new(addTransformationRule20221128),
- new(addFullNameForBuilds),
- new(addConnectionIdToTransformationRule),
- new(renameTr2ScopeConfig),
- new(addRawParamTableForScope),
- new(addNumberToJenkinsBuildCommit),
- }
+type addUrlForBuilds struct{}
+
+type jenkinsBuild20240911 struct {
+ Url string
+}
+
+func (jenkinsBuild20240911) TableName() string {
+ return "_tool_jenkins_builds"
+}
+
+func (script *addUrlForBuilds) Up(basicRes context.BasicRes) errors.Error {
+ db := basicRes.GetDal()
+ return db.AutoMigrate(&jenkinsBuild20240911{})
+}
+
+func (*addUrlForBuilds) Version() uint64 {
+ return 20240911231237
+}
+
+func (*addUrlForBuilds) Name() string {
+ return "add url for builds"
}
diff --git a/backend/plugins/jenkins/models/migrationscripts/register.go
b/backend/plugins/jenkins/models/migrationscripts/register.go
index 1dc1eb84b..ff2c9ac7a 100644
--- a/backend/plugins/jenkins/models/migrationscripts/register.go
+++ b/backend/plugins/jenkins/models/migrationscripts/register.go
@@ -36,5 +36,6 @@ func All() []plugin.MigrationScript {
new(renameTr2ScopeConfig),
new(addRawParamTableForScope),
new(addNumberToJenkinsBuildCommit),
+ new(addUrlForBuilds),
}
}
diff --git a/backend/plugins/jenkins/models/response.go
b/backend/plugins/jenkins/models/response.go
index 643bec691..962a875af 100644
--- a/backend/plugins/jenkins/models/response.go
+++ b/backend/plugins/jenkins/models/response.go
@@ -102,6 +102,7 @@ type ApiBuildResponse struct {
Class string `json:"_class"`
Number int64 `json:"number"`
Result string `json:"result"`
+ Url string `json:"url"`
Building bool `json:"building"`
Actions []Action `json:"actions"`
Duration float64 `json:"duration"`
diff --git a/backend/plugins/jenkins/tasks/build_collector.go
b/backend/plugins/jenkins/tasks/build_collector.go
index 0d792c614..c0b47f95f 100644
--- a/backend/plugins/jenkins/tasks/build_collector.go
+++ b/backend/plugins/jenkins/tasks/build_collector.go
@@ -90,7 +90,7 @@ func collectSingleJobApiBuilds(taskCtx plugin.SubTaskContext)
errors.Error {
Query: func(reqData *helper.RequestData,
createdAfter *time.Time) (url.Values, errors.Error) {
query := url.Values{}
treeValue := fmt.Sprintf(
-
"allBuilds[timestamp,number,duration,building,estimatedDuration,fullDisplayName,result,actions[lastBuiltRevision[SHA1,branch[name]],remoteUrls,mercurialRevisionNumber,causes[*]],changeSet[kind,revisions[revision]]]{%d,%d}",
+
"allBuilds[timestamp,number,duration,building,estimatedDuration,fullDisplayName,result,url,actions[lastBuiltRevision[SHA1,branch[name]],remoteUrls,mercurialRevisionNumber,causes[*]],changeSet[kind,revisions[revision]]]{%d,%d}",
reqData.Pager.Skip,
reqData.Pager.Skip+reqData.Pager.Size)
query.Set("tree", treeValue)
return query, nil
diff --git a/backend/plugins/jenkins/tasks/build_extractor.go
b/backend/plugins/jenkins/tasks/build_extractor.go
index d039034ab..842c46d2c 100644
--- a/backend/plugins/jenkins/tasks/build_extractor.go
+++ b/backend/plugins/jenkins/tasks/build_extractor.go
@@ -81,6 +81,7 @@ func ExtractApiBuilds(taskCtx plugin.SubTaskContext)
errors.Error {
EstimatedDuration: body.EstimatedDuration,
Number: body.Number,
Result: body.Result,
+ Url: body.Url,
Timestamp: body.Timestamp,
Class: class,
Building: body.Building,