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

mintsweet pushed a commit to branch feat-dora-config
in repository https://gitbox.apache.org/repos/asf/incubator-devlake.git

commit 82e325e41f4ff344662b9995f83435e3e753f105
Author: abeizn <zikuan...@merico.dev>
AuthorDate: Wed Sep 18 15:14:13 2024 +0800

    fix: update bamboo/bitbuctet/jenkins trans-to-deployment scope config… 
(#8065)
    
    * fix: update bamboo/bitbuctet/jenkins trans-to-deployment scope config to 
pointer
    
    * fix: update circleci trans-to-deployment scope config to pointer
    
    * fix: bamboo lint
---
 backend/plugins/bamboo/e2e/deploy_build_test.go    | 10 ++++---
 backend/plugins/bamboo/e2e/job_build_test.go       | 11 ++++----
 backend/plugins/bamboo/e2e/job_test.go             |  7 +++--
 .../plugins/bamboo/e2e/plan_build_commits_test.go  |  8 +++---
 backend/plugins/bamboo/e2e/plan_build_test.go      | 12 ++++----
 backend/plugins/bamboo/impl/impl.go                | 12 +++++---
 backend/plugins/bamboo/models/scope_config.go      |  4 +--
 .../plugins/bamboo/tasks/job_build_extractor.go    |  6 ++--
 .../plugins/bamboo/tasks/plan_build_extractor.go   |  7 +++--
 backend/plugins/bamboo/tasks/plan_convertor.go     |  3 +-
 backend/plugins/bitbucket/e2e/deployments_test.go  |  7 +++--
 backend/plugins/bitbucket/impl/impl.go             | 12 +++++---
 backend/plugins/bitbucket/models/scope_config.go   |  4 +--
 .../plugins/bitbucket/tasks/pipeline_extractor.go  |  6 ++--
 .../bitbucket/tasks/pipeline_steps_extractor.go    |  6 ++--
 backend/plugins/circleci/impl/impl.go              | 12 +++++---
 backend/plugins/circleci/models/scope_config.go    |  4 +--
 backend/plugins/circleci/tasks/job_converter.go    |  6 ++--
 .../plugins/circleci/tasks/workflow_converter.go   |  6 ++--
 backend/plugins/jenkins/impl/impl.go               | 33 +++++++++++++---------
 backend/plugins/jenkins/models/scope_config.go     |  4 +--
 .../plugins/jenkins/tasks/build_cicd_convertor.go  | 12 +++++---
 backend/plugins/jenkins/tasks/stage_convertor.go   |  6 ++--
 23 files changed, 119 insertions(+), 79 deletions(-)

diff --git a/backend/plugins/bamboo/e2e/deploy_build_test.go 
b/backend/plugins/bamboo/e2e/deploy_build_test.go
index 380d4e26e..9d2102a3a 100644
--- a/backend/plugins/bamboo/e2e/deploy_build_test.go
+++ b/backend/plugins/bamboo/e2e/deploy_build_test.go
@@ -41,20 +41,22 @@ func getFakeAPIClient() *helper.ApiAsyncClient {
 func TestBambooDeployBuildDataFlow(t *testing.T) {
        var bamboo impl.Bamboo
        dataflowTester := e2ehelper.NewDataFlowTester(t, "bamboo", bamboo)
+       dPattern := "(?i)release"
+       pPattern := "(?i)release"
        taskData := &tasks.BambooOptions{
                Options: &models.BambooOptions{
                        ConnectionId: 1,
                        PlanKey:      "TEST-PLA2",
                        BambooScopeConfig: &models.BambooScopeConfig{
-                               DeploymentPattern: "(?i)release",
-                               ProductionPattern: "(?i)release",
+                               DeploymentPattern: &dPattern,
+                               ProductionPattern: &pPattern,
                        },
                },
                RegexEnricher: helper.NewRegexEnricher(),
                ApiClient:     getFakeAPIClient(),
        }
-       taskData.RegexEnricher.TryAdd(devops.DEPLOYMENT, 
taskData.Options.DeploymentPattern)
-       taskData.RegexEnricher.TryAdd(devops.PRODUCTION, 
taskData.Options.ProductionPattern)
+       taskData.RegexEnricher.TryAdd(devops.DEPLOYMENT, 
*taskData.Options.DeploymentPattern)
+       taskData.RegexEnricher.TryAdd(devops.PRODUCTION, 
*taskData.Options.ProductionPattern)
        // import raw data table
        
dataflowTester.ImportCsvIntoRawTable("./raw_tables/_raw_bamboo_api_deploy_builds.csv",
 "_raw_bamboo_api_deploy_builds")
 
diff --git a/backend/plugins/bamboo/e2e/job_build_test.go 
b/backend/plugins/bamboo/e2e/job_build_test.go
index 7ed7709bc..4914a5bb9 100644
--- a/backend/plugins/bamboo/e2e/job_build_test.go
+++ b/backend/plugins/bamboo/e2e/job_build_test.go
@@ -30,22 +30,23 @@ import (
 )
 
 func TestBambooJobBuildDataFlow(t *testing.T) {
-
        var bamboo impl.Bamboo
        dataflowTester := e2ehelper.NewDataFlowTester(t, "bamboo", bamboo)
+       dPattern := "(?i)release"
+       pPattern := "(?i)release"
        taskData := &tasks.BambooOptions{
                Options: &models.BambooOptions{
                        ConnectionId: 1,
                        PlanKey:      "TEST-PLA3",
                        BambooScopeConfig: &models.BambooScopeConfig{
-                               DeploymentPattern: "(?i)compile",
-                               ProductionPattern: "(?i)compile",
+                               DeploymentPattern: &dPattern,
+                               ProductionPattern: &pPattern,
                        },
                },
                RegexEnricher: helper.NewRegexEnricher(),
                ApiClient:     getFakeAPIClient(),
        }
-       taskData.RegexEnricher.TryAdd(devops.DEPLOYMENT, 
taskData.Options.DeploymentPattern)
+       taskData.RegexEnricher.TryAdd(devops.DEPLOYMENT, 
*taskData.Options.DeploymentPattern)
        // import raw data table
        // SELECT * FROM _raw_bamboo_api_job_build INTO OUTFILE 
"/tmp/_raw_bamboo_api_job_builds.csv" FIELDS TERMINATED BY ',' OPTIONALLY 
ENCLOSED BY '"' LINES TERMINATED BY '\r\n';
        
dataflowTester.ImportCsvIntoRawTable("./raw_tables/_raw_bamboo_api_job_builds.csv",
 "_raw_bamboo_api_job_builds")
@@ -63,7 +64,7 @@ func TestBambooJobBuildDataFlow(t *testing.T) {
        )
 
        // verify extraction
-       taskData.RegexEnricher.TryAdd(devops.PRODUCTION, 
taskData.Options.ProductionPattern)
+       taskData.RegexEnricher.TryAdd(devops.PRODUCTION, 
*taskData.Options.ProductionPattern)
        dataflowTester.FlushTabler(&models.BambooJobBuild{})
        dataflowTester.Subtask(tasks.ExtractJobBuildMeta, taskData)
        dataflowTester.VerifyTable(
diff --git a/backend/plugins/bamboo/e2e/job_test.go 
b/backend/plugins/bamboo/e2e/job_test.go
index 8d3a29b0b..c3efc372a 100644
--- a/backend/plugins/bamboo/e2e/job_test.go
+++ b/backend/plugins/bamboo/e2e/job_test.go
@@ -30,14 +30,15 @@ func TestBambooJobDataFlow(t *testing.T) {
 
        var bamboo impl.Bamboo
        dataflowTester := e2ehelper.NewDataFlowTester(t, "bamboo", bamboo)
-
+       dPattern := "(?i)release"
+       pPattern := "(?i)release"
        taskData := &tasks.BambooOptions{
                Options: &models.BambooOptions{
                        ConnectionId: 1,
                        PlanKey:      "TEST-PLA1",
                        BambooScopeConfig: &models.BambooScopeConfig{
-                               DeploymentPattern: "(?i)compile",
-                               ProductionPattern: "(?i)compile",
+                               DeploymentPattern: &dPattern,
+                               ProductionPattern: &pPattern,
                        },
                },
                ApiClient: getFakeAPIClient(),
diff --git a/backend/plugins/bamboo/e2e/plan_build_commits_test.go 
b/backend/plugins/bamboo/e2e/plan_build_commits_test.go
index 99294fd8b..2a489d1b8 100644
--- a/backend/plugins/bamboo/e2e/plan_build_commits_test.go
+++ b/backend/plugins/bamboo/e2e/plan_build_commits_test.go
@@ -29,17 +29,17 @@ import (
 )
 
 func TestBambooPlanBuildCommitsDataFlow(t *testing.T) {
-
        var bamboo impl.Bamboo
        dataflowTester := e2ehelper.NewDataFlowTester(t, "bamboo", bamboo)
-
+       dPattern := "(?i)release"
+       pPattern := "(?i)release"
        taskData := &tasks.BambooOptions{
                Options: &models.BambooOptions{
                        ConnectionId: 1,
                        PlanKey:      "TEST-PLA2",
                        BambooScopeConfig: &models.BambooScopeConfig{
-                               DeploymentPattern: "(?i)compile",
-                               ProductionPattern: "(?i)compile",
+                               DeploymentPattern: &dPattern,
+                               ProductionPattern: &pPattern,
                        },
                },
                ApiClient: getFakeAPIClient(),
diff --git a/backend/plugins/bamboo/e2e/plan_build_test.go 
b/backend/plugins/bamboo/e2e/plan_build_test.go
index 67584f8f1..9db7b9ecc 100644
--- a/backend/plugins/bamboo/e2e/plan_build_test.go
+++ b/backend/plugins/bamboo/e2e/plan_build_test.go
@@ -30,24 +30,24 @@ import (
 )
 
 func TestBambooPlanBuildDataFlow(t *testing.T) {
-
        var bamboo impl.Bamboo
        dataflowTester := e2ehelper.NewDataFlowTester(t, "bamboo", bamboo)
-
+       dPattern := "(?i)release"
+       pPattern := "(?i)release"
        taskData := &tasks.BambooOptions{
                Options: &models.BambooOptions{
                        ConnectionId: 1,
                        PlanKey:      "TEST-PLA2",
                        BambooScopeConfig: &models.BambooScopeConfig{
-                               DeploymentPattern: "(?i)compile",
-                               ProductionPattern: "(?i)compile",
+                               DeploymentPattern: &dPattern,
+                               ProductionPattern: &pPattern,
                        },
                },
                RegexEnricher: helper.NewRegexEnricher(),
                ApiClient:     getFakeAPIClient(),
        }
-       taskData.RegexEnricher.TryAdd(devops.DEPLOYMENT, 
taskData.Options.DeploymentPattern)
-       taskData.RegexEnricher.TryAdd(devops.PRODUCTION, 
taskData.Options.ProductionPattern)
+       taskData.RegexEnricher.TryAdd(devops.DEPLOYMENT, 
*taskData.Options.DeploymentPattern)
+       taskData.RegexEnricher.TryAdd(devops.PRODUCTION, 
*taskData.Options.ProductionPattern)
        // import raw data table
        // SELECT * FROM _raw_bamboo_api_job_build INTO OUTFILE 
"/tmp/_raw_bamboo_api_job_builds.csv" FIELDS TERMINATED BY ',' OPTIONALLY 
ENCLOSED BY '"' LINES TERMINATED BY '\r\n';
        
dataflowTester.ImportCsvIntoRawTable("./raw_tables/_raw_bamboo_api_plan_builds.csv",
 "_raw_bamboo_api_plan_builds")
diff --git a/backend/plugins/bamboo/impl/impl.go 
b/backend/plugins/bamboo/impl/impl.go
index 15a140165..0ac41bbd8 100644
--- a/backend/plugins/bamboo/impl/impl.go
+++ b/backend/plugins/bamboo/impl/impl.go
@@ -183,11 +183,15 @@ func (p Bamboo) PrepareTaskData(taskCtx 
plugin.TaskContext, options map[string]i
                op.BambooScopeConfig = new(models.BambooScopeConfig)
        }
        regexEnricher := helper.NewRegexEnricher()
-       if err := regexEnricher.TryAdd(devops.DEPLOYMENT, 
op.DeploymentPattern); err != nil {
-               return nil, errors.BadInput.Wrap(err, "invalid value for 
`deploymentPattern`")
+       if op.DeploymentPattern != nil {
+               if err := regexEnricher.TryAdd(devops.DEPLOYMENT, 
*op.DeploymentPattern); err != nil {
+                       return nil, errors.BadInput.Wrap(err, "invalid value 
for `deploymentPattern`")
+               }
        }
-       if err := regexEnricher.TryAdd(devops.PRODUCTION, 
op.ProductionPattern); err != nil {
-               return nil, errors.BadInput.Wrap(err, "invalid value for 
`productionPattern`")
+       if op.ProductionPattern != nil {
+               if err := regexEnricher.TryAdd(devops.PRODUCTION, 
*op.ProductionPattern); err != nil {
+                       return nil, errors.BadInput.Wrap(err, "invalid value 
for `productionPattern`")
+               }
        }
        if len(op.BambooScopeConfig.EnvNameList) > 0 || 
(len(op.BambooScopeConfig.EnvNameList) == 0 && 
op.BambooScopeConfig.EnvNamePattern == "") {
                if err = regexEnricher.TryAddList(devops.ENV_NAME_PATTERN, 
op.BambooScopeConfig.EnvNameList...); err != nil {
diff --git a/backend/plugins/bamboo/models/scope_config.go 
b/backend/plugins/bamboo/models/scope_config.go
index 1ec217baa..46703664a 100644
--- a/backend/plugins/bamboo/models/scope_config.go
+++ b/backend/plugins/bamboo/models/scope_config.go
@@ -24,8 +24,8 @@ import (
 type BambooScopeConfig struct {
        common.ScopeConfig `mapstructure:",squash" json:",inline" 
gorm:"embedded"`
        RepoMap            map[string][]int `json:"repoMap" 
gorm:"type:json;serializer:json"` // should be {realRepoName: [bamboo_repoId, 
...]}
-       DeploymentPattern  string           
`mapstructure:"deploymentPattern,omitempty" json:"deploymentPattern" 
gorm:"type:varchar(255)"`
-       ProductionPattern  string           
`mapstructure:"productionPattern,omitempty" json:"productionPattern" 
gorm:"type:varchar(255)"`
+       DeploymentPattern  *string          
`mapstructure:"deploymentPattern,omitempty" json:"deploymentPattern" 
gorm:"type:varchar(255)"`
+       ProductionPattern  *string          
`mapstructure:"productionPattern,omitempty" json:"productionPattern" 
gorm:"type:varchar(255)"`
        EnvNamePattern     string           
`mapstructure:"envNamePattern,omitempty" json:"envNamePattern" 
gorm:"type:varchar(255)"`
        EnvNameList        []string         `gorm:"type:json;serializer:json" 
json:"envNameList" mapstructure:"envNameList"`
 }
diff --git a/backend/plugins/bamboo/tasks/job_build_extractor.go 
b/backend/plugins/bamboo/tasks/job_build_extractor.go
index 2077aa467..23bbb04f0 100644
--- a/backend/plugins/bamboo/tasks/job_build_extractor.go
+++ b/backend/plugins/bamboo/tasks/job_build_extractor.go
@@ -52,8 +52,10 @@ func ExtractJobBuild(taskCtx plugin.SubTaskContext) 
errors.Error {
                        body.PlanKey = data.Options.PlanKey
                        body.PlanName = plan.PlanName
                        body.PlanBuildKey = fmt.Sprintf("%s-%v", plan.PlanKey, 
body.Number)
-                       body.Type = 
data.RegexEnricher.ReturnNameIfMatched(devops.DEPLOYMENT, body.JobName)
-                       body.Environment = 
data.RegexEnricher.ReturnNameIfOmittedOrMatched(devops.PRODUCTION, body.JobName)
+                       if data.Options.DeploymentPattern != nil || 
data.Options.ProductionPattern != nil {
+                               body.Type = 
data.RegexEnricher.ReturnNameIfMatched(devops.DEPLOYMENT, body.JobName)
+                               body.Environment = 
data.RegexEnricher.ReturnNameIfOmittedOrMatched(devops.PRODUCTION, body.JobName)
+                       }
                        results := make([]interface{}, 0)
                        results = append(results, body)
                        return results, nil
diff --git a/backend/plugins/bamboo/tasks/plan_build_extractor.go 
b/backend/plugins/bamboo/tasks/plan_build_extractor.go
index 2ce1eeb86..386ec2856 100644
--- a/backend/plugins/bamboo/tasks/plan_build_extractor.go
+++ b/backend/plugins/bamboo/tasks/plan_build_extractor.go
@@ -45,9 +45,10 @@ func ExtractPlanBuild(taskCtx plugin.SubTaskContext) 
errors.Error {
                        body := res.Convert()
                        body.ConnectionId = data.Options.ConnectionId
                        body.PlanKey = data.Options.PlanKey
-                       body.Type = 
data.RegexEnricher.ReturnNameIfMatched(devops.DEPLOYMENT, body.PlanName)
-                       body.Environment = 
data.RegexEnricher.ReturnNameIfOmittedOrMatched(devops.PRODUCTION, 
body.PlanName)
-
+                       if data.Options.DeploymentPattern != nil || 
data.Options.ProductionPattern != nil {
+                               body.Type = 
data.RegexEnricher.ReturnNameIfMatched(devops.DEPLOYMENT, body.PlanName)
+                               body.Environment = 
data.RegexEnricher.ReturnNameIfOmittedOrMatched(devops.PRODUCTION, 
body.PlanName)
+                       }
                        var url string
                        homepage, errGetHomePage := 
GetBambooHomePage(body.LinkHref)
                        if errGetHomePage != nil {
diff --git a/backend/plugins/bamboo/tasks/plan_convertor.go 
b/backend/plugins/bamboo/tasks/plan_convertor.go
index 261e6dfb3..5125b6c78 100644
--- a/backend/plugins/bamboo/tasks/plan_convertor.go
+++ b/backend/plugins/bamboo/tasks/plan_convertor.go
@@ -18,6 +18,8 @@ limitations under the License.
 package tasks
 
 import (
+       "reflect"
+
        "github.com/apache/incubator-devlake/core/dal"
        "github.com/apache/incubator-devlake/core/errors"
        "github.com/apache/incubator-devlake/core/models/domainlayer"
@@ -26,7 +28,6 @@ import (
        "github.com/apache/incubator-devlake/core/plugin"
        "github.com/apache/incubator-devlake/helpers/pluginhelper/api"
        bambooModels "github.com/apache/incubator-devlake/plugins/bamboo/models"
-       "reflect"
 )
 
 const RAW_PLAN_TABLE = "bamboo_plan"
diff --git a/backend/plugins/bitbucket/e2e/deployments_test.go 
b/backend/plugins/bitbucket/e2e/deployments_test.go
index 8d68a0dff..9e060d19c 100644
--- a/backend/plugins/bitbucket/e2e/deployments_test.go
+++ b/backend/plugins/bitbucket/e2e/deployments_test.go
@@ -31,14 +31,15 @@ import (
 func TestDeloymentsDataFlow(t *testing.T) {
        var bitbucket impl.Bitbucket
        dataflowTester := e2ehelper.NewDataFlowTester(t, "bitbucket", bitbucket)
-
+       dPattern := ""
+       pPattern := ""
        taskData := &tasks.BitbucketTaskData{
                Options: &tasks.BitbucketOptions{
                        ConnectionId: 1,
                        FullName:     "likyh/likyhphp",
                        BitbucketScopeConfig: &models.BitbucketScopeConfig{
-                               DeploymentPattern: "",
-                               ProductionPattern: "",
+                               DeploymentPattern: &dPattern,
+                               ProductionPattern: &pPattern,
                        },
                },
        }
diff --git a/backend/plugins/bitbucket/impl/impl.go 
b/backend/plugins/bitbucket/impl/impl.go
index 953819024..dd917790c 100644
--- a/backend/plugins/bitbucket/impl/impl.go
+++ b/backend/plugins/bitbucket/impl/impl.go
@@ -176,11 +176,15 @@ func (p Bitbucket) PrepareTaskData(taskCtx 
plugin.TaskContext, options map[strin
        }
 
        regexEnricher := helper.NewRegexEnricher()
-       if err := regexEnricher.TryAdd(devops.DEPLOYMENT, 
op.DeploymentPattern); err != nil {
-               return nil, errors.BadInput.Wrap(err, "invalid value for 
`deploymentPattern`")
+       if op.DeploymentPattern != nil {
+               if err := regexEnricher.TryAdd(devops.DEPLOYMENT, 
*op.DeploymentPattern); err != nil {
+                       return nil, errors.BadInput.Wrap(err, "invalid value 
for `deploymentPattern`")
+               }
        }
-       if err := regexEnricher.TryAdd(devops.PRODUCTION, 
op.ProductionPattern); err != nil {
-               return nil, errors.BadInput.Wrap(err, "invalid value for 
`productionPattern`")
+       if op.ProductionPattern != nil {
+               if err := regexEnricher.TryAdd(devops.PRODUCTION, 
*op.ProductionPattern); err != nil {
+                       return nil, errors.BadInput.Wrap(err, "invalid value 
for `productionPattern`")
+               }
        }
        taskData := &tasks.BitbucketTaskData{
                Options:       op,
diff --git a/backend/plugins/bitbucket/models/scope_config.go 
b/backend/plugins/bitbucket/models/scope_config.go
index 207485a10..ca4811f05 100644
--- a/backend/plugins/bitbucket/models/scope_config.go
+++ b/backend/plugins/bitbucket/models/scope_config.go
@@ -24,8 +24,8 @@ import (
 
 type BitbucketScopeConfig struct {
        common.ScopeConfig `mapstructure:",squash" json:",inline" 
gorm:"embedded"`
-       DeploymentPattern  string            
`mapstructure:"deploymentPattern,omitempty" json:"deploymentPattern" 
gorm:"type:varchar(255)"`
-       ProductionPattern  string            
`mapstructure:"productionPattern,omitempty" json:"productionPattern" 
gorm:"type:varchar(255)"`
+       DeploymentPattern  *string           
`mapstructure:"deploymentPattern,omitempty" json:"deploymentPattern" 
gorm:"type:varchar(255)"`
+       ProductionPattern  *string           
`mapstructure:"productionPattern,omitempty" json:"productionPattern" 
gorm:"type:varchar(255)"`
        Refdiff            datatypes.JSONMap `mapstructure:"refdiff,omitempty" 
json:"refdiff" swaggertype:"object" format:"json"`
 
        // a string array, split by `,`.
diff --git a/backend/plugins/bitbucket/tasks/pipeline_extractor.go 
b/backend/plugins/bitbucket/tasks/pipeline_extractor.go
index ec924db8d..c0e23ec7e 100644
--- a/backend/plugins/bitbucket/tasks/pipeline_extractor.go
+++ b/backend/plugins/bitbucket/tasks/pipeline_extractor.go
@@ -103,8 +103,10 @@ func ExtractApiPipelines(taskCtx plugin.SubTaskContext) 
errors.Error {
                                DurationInSeconds:   
bitbucketApiPipeline.DurationInSeconds,
                                BitbucketCreatedOn:  
common.Iso8601TimeToTime(bitbucketApiPipeline.CreatedOn),
                                BitbucketCompleteOn: 
common.Iso8601TimeToTime(bitbucketApiPipeline.CompletedOn),
-                               Type:                
data.RegexEnricher.ReturnNameIfMatched(devops.DEPLOYMENT, 
bitbucketApiPipeline.Target.RefName),
-                               Environment:         
data.RegexEnricher.ReturnNameIfOmittedOrMatched(devops.PRODUCTION, 
bitbucketApiPipeline.Target.RefName),
+                       }
+                       if data.Options.DeploymentPattern != nil || 
data.Options.ProductionPattern != nil {
+                               bitbucketPipeline.Type = 
data.RegexEnricher.ReturnNameIfMatched(devops.DEPLOYMENT, 
bitbucketApiPipeline.Target.RefName)
+                               bitbucketPipeline.Environment = 
data.RegexEnricher.ReturnNameIfOmittedOrMatched(devops.PRODUCTION, 
bitbucketApiPipeline.Target.RefName)
                        }
                        if bitbucketApiPipeline.State.Result != nil {
                                bitbucketPipeline.Result = 
bitbucketApiPipeline.State.Result.Name
diff --git a/backend/plugins/bitbucket/tasks/pipeline_steps_extractor.go 
b/backend/plugins/bitbucket/tasks/pipeline_steps_extractor.go
index 82bd93bd4..684ada923 100644
--- a/backend/plugins/bitbucket/tasks/pipeline_steps_extractor.go
+++ b/backend/plugins/bitbucket/tasks/pipeline_steps_extractor.go
@@ -93,8 +93,10 @@ func ExtractPipelineSteps(taskCtx plugin.SubTaskContext) 
errors.Error {
                                DurationInSeconds: 
apiPipelineStep.DurationInSeconds,
                                BuildSecondsUsed:  
apiPipelineStep.BuildSecondsUsed,
                                RunNumber:         apiPipelineStep.RunNumber,
-                               Type:              
data.RegexEnricher.ReturnNameIfMatched(devops.DEPLOYMENT, apiPipelineStep.Name),
-                               Environment:       
data.RegexEnricher.ReturnNameIfOmittedOrMatched(devops.PRODUCTION, 
apiPipelineStep.Name),
+                       }
+                       if data.Options.DeploymentPattern != nil || 
data.Options.ProductionPattern != nil {
+                               bitbucketStep.Type = 
data.RegexEnricher.ReturnNameIfMatched(devops.DEPLOYMENT, apiPipelineStep.Name)
+                               bitbucketStep.Environment = 
data.RegexEnricher.ReturnNameIfOmittedOrMatched(devops.PRODUCTION, 
apiPipelineStep.Name)
                        }
                        return []interface{}{
                                bitbucketStep,
diff --git a/backend/plugins/circleci/impl/impl.go 
b/backend/plugins/circleci/impl/impl.go
index c2ae4a8bf..8cca5895d 100644
--- a/backend/plugins/circleci/impl/impl.go
+++ b/backend/plugins/circleci/impl/impl.go
@@ -153,11 +153,15 @@ func (p Circleci) PrepareTaskData(taskCtx 
plugin.TaskContext, options map[string
                op.ScopeConfig = new(models.CircleciScopeConfig)
        }
        regexEnricher := helper.NewRegexEnricher()
-       if err := regexEnricher.TryAdd(devops.DEPLOYMENT, 
op.ScopeConfig.DeploymentPattern); err != nil {
-               return nil, errors.BadInput.Wrap(err, "invalid value for 
`deploymentPattern`")
+       if op.ScopeConfig.DeploymentPattern != nil {
+               if err := regexEnricher.TryAdd(devops.DEPLOYMENT, 
*op.ScopeConfig.DeploymentPattern); err != nil {
+                       return nil, errors.BadInput.Wrap(err, "invalid value 
for `deploymentPattern`")
+               }
        }
-       if err := regexEnricher.TryAdd(devops.PRODUCTION, 
op.ScopeConfig.ProductionPattern); err != nil {
-               return nil, errors.BadInput.Wrap(err, "invalid value for 
`productionPattern`")
+       if op.ScopeConfig.ProductionPattern != nil {
+               if err := regexEnricher.TryAdd(devops.PRODUCTION, 
*op.ScopeConfig.ProductionPattern); err != nil {
+                       return nil, errors.BadInput.Wrap(err, "invalid value 
for `productionPattern`")
+               }
        }
        taskData.RegexEnricher = regexEnricher
        return taskData, nil
diff --git a/backend/plugins/circleci/models/scope_config.go 
b/backend/plugins/circleci/models/scope_config.go
index 8d6a433bd..5b7ed1b46 100644
--- a/backend/plugins/circleci/models/scope_config.go
+++ b/backend/plugins/circleci/models/scope_config.go
@@ -23,8 +23,8 @@ import (
 
 type CircleciScopeConfig struct {
        common.ScopeConfig `mapstructure:",squash" json:",inline" 
gorm:"embedded"`
-       DeploymentPattern  string `gorm:"type:varchar(255)" 
mapstructure:"deploymentPattern,omitempty" json:"deploymentPattern"`
-       ProductionPattern  string `gorm:"type:varchar(255)" 
mapstructure:"productionPattern,omitempty" json:"productionPattern"`
+       DeploymentPattern  *string `gorm:"type:varchar(255)" 
mapstructure:"deploymentPattern,omitempty" json:"deploymentPattern"`
+       ProductionPattern  *string `gorm:"type:varchar(255)" 
mapstructure:"productionPattern,omitempty" json:"productionPattern"`
 }
 
 func (t CircleciScopeConfig) TableName() string {
diff --git a/backend/plugins/circleci/tasks/job_converter.go 
b/backend/plugins/circleci/tasks/job_converter.go
index 2cb8de120..accfa0ce5 100644
--- a/backend/plugins/circleci/tasks/job_converter.go
+++ b/backend/plugins/circleci/tasks/job_converter.go
@@ -86,8 +86,10 @@ func ConvertJobs(taskCtx plugin.SubTaskContext) errors.Error 
{
                                        Failure: []string{"failed", "failing", 
"error"}, // not_run,canceled
                                        Default: devops.RESULT_DEFAULT,
                                }, userTool.Status),
-                               Type:        
data.RegexEnricher.ReturnNameIfMatched(devops.DEPLOYMENT, userTool.Name),
-                               Environment: 
data.RegexEnricher.ReturnNameIfOmittedOrMatched(devops.PRODUCTION, 
userTool.Name),
+                       }
+                       if data.Options.ScopeConfig.DeploymentPattern != nil || 
data.Options.ScopeConfig.ProductionPattern != nil {
+                               task.Type = 
data.RegexEnricher.ReturnNameIfMatched(devops.DEPLOYMENT, userTool.Name)
+                               task.Environment = 
data.RegexEnricher.ReturnNameIfOmittedOrMatched(devops.PRODUCTION, 
userTool.Name)
                        }
                        if task.DurationSec == 0 {
                                task.DurationSec = userTool.DurationSec
diff --git a/backend/plugins/circleci/tasks/workflow_converter.go 
b/backend/plugins/circleci/tasks/workflow_converter.go
index 78223f5cf..7389b2271 100644
--- a/backend/plugins/circleci/tasks/workflow_converter.go
+++ b/backend/plugins/circleci/tasks/workflow_converter.go
@@ -81,10 +81,12 @@ func ConvertWorkflows(taskCtx plugin.SubTaskContext) 
errors.Error {
                                        Failure: []string{"failed", "failing", 
"error"}, // not_run,canceled
                                        Default: devops.RESULT_DEFAULT,
                                }, userTool.Status),
-                               Type:         
data.RegexEnricher.ReturnNameIfMatched(devops.DEPLOYMENT, userTool.Name),
-                               Environment:  
data.RegexEnricher.ReturnNameIfOmittedOrMatched(devops.PRODUCTION, 
userTool.Name),
                                DisplayTitle: fmt.Sprintf("%s#%d", 
userTool.Name, userTool.PipelineNumber),
                        }
+                       if data.Options.ScopeConfig.DeploymentPattern != nil || 
data.Options.ScopeConfig.ProductionPattern != nil {
+                               pipeline.Type = 
data.RegexEnricher.ReturnNameIfMatched(devops.DEPLOYMENT, userTool.Name)
+                               pipeline.Environment = 
data.RegexEnricher.ReturnNameIfOmittedOrMatched(devops.PRODUCTION, 
userTool.Name)
+                       }
                        result := make([]interface{}, 0, 2)
                        result = append(result, pipeline)
 
diff --git a/backend/plugins/jenkins/impl/impl.go 
b/backend/plugins/jenkins/impl/impl.go
index 7be75a8e1..be9589152 100644
--- a/backend/plugins/jenkins/impl/impl.go
+++ b/backend/plugins/jenkins/impl/impl.go
@@ -144,11 +144,15 @@ func (p Jenkins) PrepareTaskData(taskCtx 
plugin.TaskContext, options map[string]
        }
 
        regexEnricher := helper.NewRegexEnricher()
-       if err := regexEnricher.TryAdd(devops.DEPLOYMENT, 
op.ScopeConfig.DeploymentPattern); err != nil {
-               return nil, errors.BadInput.Wrap(err, "invalid value for 
`deploymentPattern`")
+       if op.ScopeConfig.DeploymentPattern != nil {
+               if err := regexEnricher.TryAdd(devops.DEPLOYMENT, 
*op.ScopeConfig.DeploymentPattern); err != nil {
+                       return nil, errors.BadInput.Wrap(err, "invalid value 
for `deploymentPattern`")
+               }
        }
-       if err := regexEnricher.TryAdd(devops.PRODUCTION, 
op.ScopeConfig.ProductionPattern); err != nil {
-               return nil, errors.BadInput.Wrap(err, "invalid value for 
`productionPattern`")
+       if op.ScopeConfig.ProductionPattern != nil {
+               if err := regexEnricher.TryAdd(devops.PRODUCTION, 
*op.ScopeConfig.ProductionPattern); err != nil {
+                       return nil, errors.BadInput.Wrap(err, "invalid value 
for `productionPattern`")
+               }
        }
        taskData := &tasks.JenkinsTaskData{
                Options:       op,
@@ -291,18 +295,19 @@ func EnrichOptions(taskCtx plugin.TaskContext,
                op.JobPath = fmt.Sprintf("%s/", op.JobPath)
        }
        // We only set op.JenkinsScopeConfig when it's nil and we have 
op.ScopeConfigId != 0
-       if op.ScopeConfig.DeploymentPattern == "" && 
op.ScopeConfig.ProductionPattern == "" && op.ScopeConfigId != 0 {
-               var scopeConfig models.JenkinsScopeConfig
-               err = taskCtx.GetDal().First(&scopeConfig, dal.Where("id = ?", 
op.ScopeConfigId))
-               if err != nil {
-                       return errors.BadInput.Wrap(err, "fail to get 
scopeConfig")
+       if op.ScopeConfig.DeploymentPattern != nil && 
op.ScopeConfig.ProductionPattern != nil {
+               if *op.ScopeConfig.DeploymentPattern == "" && 
*op.ScopeConfig.ProductionPattern == "" && op.ScopeConfigId != 0 {
+                       var scopeConfig models.JenkinsScopeConfig
+                       err = taskCtx.GetDal().First(&scopeConfig, 
dal.Where("id = ?", op.ScopeConfigId))
+                       if err != nil {
+                               return errors.BadInput.Wrap(err, "fail to get 
scopeConfig")
+                       }
+                       op.ScopeConfig = &scopeConfig
                }
-               op.ScopeConfig = &scopeConfig
-       }
 
-       if op.ScopeConfig.DeploymentPattern == "" && 
op.ScopeConfig.ProductionPattern == "" && op.ScopeConfigId == 0 {
-               op.ScopeConfig = new(models.JenkinsScopeConfig)
+               if *op.ScopeConfig.DeploymentPattern == "" && 
*op.ScopeConfig.ProductionPattern == "" && op.ScopeConfigId == 0 {
+                       op.ScopeConfig = new(models.JenkinsScopeConfig)
+               }
        }
-
        return nil
 }
diff --git a/backend/plugins/jenkins/models/scope_config.go 
b/backend/plugins/jenkins/models/scope_config.go
index 1eb889ca4..7f7b90039 100644
--- a/backend/plugins/jenkins/models/scope_config.go
+++ b/backend/plugins/jenkins/models/scope_config.go
@@ -23,8 +23,8 @@ import (
 
 type JenkinsScopeConfig struct {
        common.ScopeConfig `mapstructure:",squash" json:",inline" 
gorm:"embedded"`
-       DeploymentPattern  string `gorm:"type:varchar(255)" 
mapstructure:"deploymentPattern,omitempty" json:"deploymentPattern"`
-       ProductionPattern  string `gorm:"type:varchar(255)" 
mapstructure:"productionPattern,omitempty" json:"productionPattern"`
+       DeploymentPattern  *string `gorm:"type:varchar(255)" 
mapstructure:"deploymentPattern,omitempty" json:"deploymentPattern"`
+       ProductionPattern  *string `gorm:"type:varchar(255)" 
mapstructure:"productionPattern,omitempty" json:"productionPattern"`
 }
 
 func (t JenkinsScopeConfig) TableName() string {
diff --git a/backend/plugins/jenkins/tasks/build_cicd_convertor.go 
b/backend/plugins/jenkins/tasks/build_cicd_convertor.go
index 34ec88d57..f09f27b75 100644
--- a/backend/plugins/jenkins/tasks/build_cicd_convertor.go
+++ b/backend/plugins/jenkins/tasks/build_cicd_convertor.go
@@ -128,8 +128,10 @@ func ConvertBuildsToCicdTasks(taskCtx 
plugin.SubTaskContext) (err errors.Error)
                                },
                                DurationSec: durationSec,
                                CicdScopeId: 
jobIdGen.Generate(jenkinsBuild.ConnectionId, data.Options.JobFullName),
-                               Type:        
data.RegexEnricher.ReturnNameIfMatched(devops.DEPLOYMENT, 
jenkinsBuild.FullName),
-                               Environment: 
data.RegexEnricher.ReturnNameIfOmittedOrMatched(devops.PRODUCTION, 
jenkinsBuild.FullName),
+                       }
+                       if data.Options.ScopeConfig.DeploymentPattern != nil || 
data.Options.ScopeConfig.ProductionPattern != nil {
+                               jenkinsPipeline.Type = 
data.RegexEnricher.ReturnNameIfMatched(devops.DEPLOYMENT, jenkinsBuild.FullName)
+                               jenkinsPipeline.Environment = 
data.RegexEnricher.ReturnNameIfOmittedOrMatched(devops.PRODUCTION, 
jenkinsBuild.FullName)
                        }
                        jenkinsPipeline.RawDataOrigin = 
jenkinsBuild.RawDataOrigin
                        results = append(results, jenkinsPipeline)
@@ -151,10 +153,12 @@ func ConvertBuildsToCicdTasks(taskCtx 
plugin.SubTaskContext) (err errors.Error)
                                                FinishedDate: 
jenkinsPipelineFinishedDate,
                                        },
                                        CicdScopeId: 
jobIdGen.Generate(jenkinsBuild.ConnectionId, data.Options.JobFullName),
-                                       Type:        
data.RegexEnricher.ReturnNameIfMatched(devops.DEPLOYMENT, 
jenkinsBuild.FullName),
-                                       Environment: 
data.RegexEnricher.ReturnNameIfOmittedOrMatched(devops.PRODUCTION, 
jenkinsBuild.FullName),
                                        PipelineId:  
buildIdGen.Generate(jenkinsBuild.ConnectionId, jenkinsBuild.FullName),
                                }
+                               if data.Options.ScopeConfig.DeploymentPattern 
!= nil || data.Options.ScopeConfig.ProductionPattern != nil {
+                                       jenkinsTask.Type = 
data.RegexEnricher.ReturnNameIfMatched(devops.DEPLOYMENT, jenkinsBuild.FullName)
+                                       jenkinsTask.Environment = 
data.RegexEnricher.ReturnNameIfOmittedOrMatched(devops.PRODUCTION, 
jenkinsBuild.FullName)
+                               }
                                // if the task is not executed, set the result 
to default, so that it will not be calculated in the dora
                                if jenkinsTask.OriginalStatus == "NOT_EXECUTED" 
{
                                        jenkinsTask.Result = 
devops.RESULT_DEFAULT
diff --git a/backend/plugins/jenkins/tasks/stage_convertor.go 
b/backend/plugins/jenkins/tasks/stage_convertor.go
index 35c31fade..83a053ecf 100644
--- a/backend/plugins/jenkins/tasks/stage_convertor.go
+++ b/backend/plugins/jenkins/tasks/stage_convertor.go
@@ -152,8 +152,10 @@ func ConvertStages(taskCtx plugin.SubTaskContext) (err 
errors.Error) {
                                OriginalResult: body.Result,
                                OriginalStatus: body.Status,
                                CicdScopeId:    
jobIdGen.Generate(body.ConnectionId, data.Options.JobFullName),
-                               Type:           
data.RegexEnricher.ReturnNameIfMatched(devops.DEPLOYMENT, body.Name),
-                               Environment:    
data.RegexEnricher.ReturnNameIfOmittedOrMatched(devops.PRODUCTION, body.Name),
+                       }
+                       if data.Options.ScopeConfig.DeploymentPattern != nil || 
data.Options.ScopeConfig.ProductionPattern != nil {
+                               jenkinsTask.Type = 
data.RegexEnricher.ReturnNameIfMatched(devops.DEPLOYMENT, body.Name)
+                               jenkinsTask.Environment = 
data.RegexEnricher.ReturnNameIfOmittedOrMatched(devops.PRODUCTION, body.Name)
                        }
                        // if the task is not executed, set the result to 
default, so that it will not be calculated in the dora
                        if jenkinsTask.OriginalStatus == "NOT_EXECUTED" {

Reply via email to