diff --git a/backend/plugins/dora/tasks/deployment_commits_generator.go b/backend/plugins/dora/tasks/deployment_commits_generator.go index 9fc53c4790c..85da0e5fe52 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 b52c99191ea..3ae9da7e631 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 20047bb5f5f..69c68a9f68a 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 150b2a0f168..0af005446d4 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 {