You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@devlake.apache.org by kl...@apache.org on 2024/02/20 11:58:53 UTC

(incubator-devlake) branch main updated: feat(cicd): generate deployment in cicd plugin (#6965)

This is an automated email from the ASF dual-hosted git repository.

klesh pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-devlake.git


The following commit(s) were added to refs/heads/main by this push:
     new 32543102b feat(cicd): generate deployment in cicd plugin (#6965)
32543102b is described below

commit 32543102bc1f40eec7b5c6667fe6a1549cb87af8
Author: Leric Zhang <li...@merico.dev>
AuthorDate: Tue Feb 20 19:58:48 2024 +0800

    feat(cicd): generate deployment in cicd plugin (#6965)
---
 .../dora/tasks/deployment_commits_generator.go     | 34 ++++++++++++----------
 backend/plugins/dora/tasks/deployment_generator.go | 33 ++++++++++++---------
 .../dora/tasks/prev_deployment_commit_enricher.go  | 33 ++++++++++++++-------
 backend/plugins/dora/tasks/task_data.go            |  3 +-
 4 files changed, 62 insertions(+), 41 deletions(-)

diff --git a/backend/plugins/dora/tasks/deployment_commits_generator.go b/backend/plugins/dora/tasks/deployment_commits_generator.go
index 9fc53c479..85da0e5fe 100644
--- a/backend/plugins/dora/tasks/deployment_commits_generator.go
+++ b/backend/plugins/dora/tasks/deployment_commits_generator.go
@@ -62,7 +62,7 @@ func GenerateDeploymentCommits(taskCtx plugin.SubTaskContext) errors.Error {
 	// select all cicd_pipeline_commits from all "Deployments" in the project
 	// Note that failed records shall be included as well
 	noneSkippedResult := []string{devops.RESULT_FAILURE, devops.RESULT_SUCCESS}
-	cursor, err := db.Cursor(
+	var clauses = []dal.Clause{
 		dal.Select(
 			`
 				pc.*,
@@ -77,12 +77,9 @@ func GenerateDeploymentCommits(taskCtx plugin.SubTaskContext) errors.Error {
 				p.cicd_scope_id,
 				p.original_status,
 				p.original_result,
-				EXISTS(SELECT 1 FROM cicd_tasks t WHERE t.pipeline_id = p.id AND t.environment = ? AND t.result IN ?)
-				as has_testing_tasks,
-				EXISTS(SELECT 1 FROM cicd_tasks t WHERE t.pipeline_id = p.id AND t.environment = ? AND t.result IN ?)
-				as has_staging_tasks,
-				EXISTS( SELECT 1 FROM cicd_tasks t WHERE t.pipeline_id = p.id AND t.environment = ? AND t.result IN ?)
-				as has_production_tasks
+				EXISTS(SELECT 1 FROM cicd_tasks t WHERE t.pipeline_id = p.id AND t.environment = ? AND t.result IN ?) as has_testing_tasks,
+				EXISTS(SELECT 1 FROM cicd_tasks t WHERE t.pipeline_id = p.id AND t.environment = ? AND t.result IN ?) as has_staging_tasks,
+				EXISTS( SELECT 1 FROM cicd_tasks t WHERE t.pipeline_id = p.id AND t.environment = ? AND t.result IN ?) as has_production_tasks
 			`,
 			devops.TESTING, noneSkippedResult,
 			devops.STAGING, noneSkippedResult,
@@ -90,22 +87,27 @@ func GenerateDeploymentCommits(taskCtx plugin.SubTaskContext) errors.Error {
 		),
 		dal.From("cicd_pipeline_commits pc"),
 		dal.Join("LEFT JOIN cicd_pipelines p ON (p.id = pc.pipeline_id)"),
-		dal.Join("LEFT JOIN project_mapping pm ON (pm.table = 'cicd_scopes' AND pm.row_id = p.cicd_scope_id)"),
 		dal.Where(
 			`
-			pm.project_name = ? AND (
-				p.type = ? OR EXISTS(
-					SELECT 1 FROM cicd_tasks t WHERE t.pipeline_id = p.id AND t.type = ? AND t.result IN ?
-				)
-			) AND p.result IN ?
+			p.result IN ? AND (
+				p.type = ? OR EXISTS(SELECT 1 FROM cicd_tasks t WHERE t.pipeline_id = p.id AND t.type = ? AND t.result IN ?)
+			)
 			`,
-			data.Options.ProjectName,
+			noneSkippedResult,
 			devops.DEPLOYMENT,
 			devops.DEPLOYMENT,
 			noneSkippedResult,
-			noneSkippedResult,
 		),
-	)
+	}
+	if data.Options.ScopeId != nil {
+		clauses = append(clauses, dal.Where(`p.cicd_scope_id = ?`, data.Options.ScopeId))
+	} else {
+		clauses = append(clauses,
+			dal.Join("LEFT JOIN project_mapping pm ON (pm.table = 'cicd_scopes' AND pm.row_id = p.cicd_scope_id)"),
+			dal.Where(`pm.project_name = ?`, data.Options.ProjectName),
+		)
+	}
+	cursor, err := db.Cursor(clauses...)
 	if err != nil {
 		return err
 	}
diff --git a/backend/plugins/dora/tasks/deployment_generator.go b/backend/plugins/dora/tasks/deployment_generator.go
index b52c99191..3ae9da7e6 100644
--- a/backend/plugins/dora/tasks/deployment_generator.go
+++ b/backend/plugins/dora/tasks/deployment_generator.go
@@ -49,7 +49,7 @@ func GenerateDeployment(taskCtx plugin.SubTaskContext) errors.Error {
 	data := taskCtx.GetData().(*DoraTaskData)
 	// Note that failed records shall be included as well
 	noneSkippedResult := []string{devops.RESULT_FAILURE, devops.RESULT_SUCCESS}
-	cursor, err := db.Cursor(
+	var clauses = []dal.Clause{
 		dal.Select(
 			`
 				p.*,
@@ -57,7 +57,7 @@ func GenerateDeployment(taskCtx plugin.SubTaskContext) errors.Error {
 				as has_testing_tasks,
 				EXISTS(SELECT 1 FROM cicd_tasks t WHERE t.pipeline_id = p.id AND t.environment = ? AND t.result IN ?)
 				as has_staging_tasks,
-				EXISTS( SELECT 1 FROM cicd_tasks t WHERE t.pipeline_id = p.id AND t.environment = ? AND t.result IN ?)
+				EXISTS(SELECT 1 FROM cicd_tasks t WHERE t.pipeline_id = p.id AND t.environment = ? AND t.result IN ?)
 				as has_production_tasks
 			`,
 			devops.TESTING, noneSkippedResult,
@@ -65,22 +65,27 @@ func GenerateDeployment(taskCtx plugin.SubTaskContext) errors.Error {
 			devops.PRODUCTION, noneSkippedResult,
 		),
 		dal.From("cicd_pipelines p"),
-		dal.Join("LEFT JOIN project_mapping pm ON (pm.table = 'cicd_scopes' AND pm.row_id = p.cicd_scope_id)"),
-		dal.Where(
-			`
-			pm.project_name = ? AND (
-				p.type = ? OR EXISTS(
-					SELECT 1 FROM cicd_tasks t WHERE t.pipeline_id = p.id AND t.type = ? AND t.result IN ?
-				)
-			) AND p.result IN ?
-			`,
-			data.Options.ProjectName,
+		dal.Where(`
+			p.result IN ? AND (
+				p.type = ? OR EXISTS(SELECT 1 FROM cicd_tasks t WHERE t.pipeline_id = p.id AND t.type = ? AND t.result IN ?)
+			)`,
+			noneSkippedResult,
 			devops.DEPLOYMENT,
 			devops.DEPLOYMENT,
 			noneSkippedResult,
-			noneSkippedResult,
 		),
-	)
+	}
+	if data.Options.ScopeId != nil {
+		clauses = append(clauses,
+			dal.Where("p.cicd_scope_id = ?", data.Options.ScopeId),
+		)
+	} else {
+		clauses = append(clauses,
+			dal.Join("LEFT JOIN project_mapping pm ON (pm.table = 'cicd_scopes' AND pm.row_id = p.cicd_scope_id)"),
+			dal.Where("pm.project_name = ?", data.Options.ProjectName),
+		)
+	}
+	cursor, err := db.Cursor(clauses...)
 	if err != nil {
 		return err
 	}
diff --git a/backend/plugins/dora/tasks/prev_deployment_commit_enricher.go b/backend/plugins/dora/tasks/prev_deployment_commit_enricher.go
index 20047bb5f..69c68a9f6 100644
--- a/backend/plugins/dora/tasks/prev_deployment_commit_enricher.go
+++ b/backend/plugins/dora/tasks/prev_deployment_commit_enricher.go
@@ -47,21 +47,34 @@ func EnrichPrevSuccessDeploymentCommit(taskCtx plugin.SubTaskContext) errors.Err
 	data := taskCtx.GetData().(*DoraTaskData)
 	// step 1. select all successful deployments in the project and sort them by cicd_scope_id, repo_url, env
 	// and finished_date
-	cursor, err := db.Cursor(
+	var clauses = []dal.Clause{
 		dal.Select("dc.*"),
 		dal.From("cicd_deployment_commits dc"),
-		dal.Join("LEFT JOIN project_mapping pm ON (pm.table = 'cicd_scopes' AND pm.row_id = dc.cicd_scope_id)"),
-		dal.Where(
-			`
+		dal.Where(`
 			dc.finished_date IS NOT NULL
-			AND dc.environment IS NOT NULL AND dc.environment != ''
-			AND dc.repo_url IS NOT NULL AND dc.repo_url != ''
-			AND pm.project_name = ? AND dc.result = ?
+			AND dc.environment IS NOT NULL
+			AND dc.environment != ''
+			AND dc.repo_url IS NOT NULL
+			AND dc.repo_url != ''
+			AND dc.result = ?
 			`,
-			data.Options.ProjectName, devops.RESULT_SUCCESS,
+			devops.RESULT_SUCCESS,
 		),
-		dal.Orderby(`dc.cicd_scope_id, dc.repo_url, dc.environment, dc.finished_date`),
-	)
+	}
+	if data.Options.ScopeId != nil {
+		clauses = append(clauses,
+			dal.Where("dc.cicd_scope_id = ?", data.Options.ScopeId),
+			dal.Orderby("dc.repo_url, dc.environment, dc.finished_date"),
+		)
+	} else {
+		clauses = append(clauses,
+			dal.Join("LEFT JOIN project_mapping pm ON (pm.table = 'cicd_scopes' AND pm.row_id = dc.cicd_scope_id)"),
+			dal.Where("pm.project_name = ?", data.Options.ProjectName),
+			dal.Orderby("dc.cicd_scope_id, dc.repo_url, dc.environment, dc.finished_date"),
+		)
+	}
+
+	cursor, err := db.Cursor(clauses...)
 	if err != nil {
 		return err
 	}
diff --git a/backend/plugins/dora/tasks/task_data.go b/backend/plugins/dora/tasks/task_data.go
index 150b2a0f1..0af005446 100644
--- a/backend/plugins/dora/tasks/task_data.go
+++ b/backend/plugins/dora/tasks/task_data.go
@@ -29,7 +29,8 @@ type DoraApiParams struct {
 type DoraOptions struct {
 	Tasks       []string `json:"tasks,omitempty"`
 	Since       string
-	ProjectName string `json:"projectName"`
+	ProjectName string  `json:"projectName"`
+	ScopeId     *string `json:"scopeId,omitempty"`
 }
 
 type DoraTaskData struct {