You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@devlake.apache.org by ab...@apache.org on 2023/08/02 07:36:49 UTC

[incubator-devlake] branch main updated: feat: collect bamboo deployment (#5784)

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

abeizn 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 aa89a44a4 feat: collect bamboo deployment (#5784)
aa89a44a4 is described below

commit aa89a44a4a3b056a970cb9e2974d87e36e60f5fa
Author: Liang Zhang <li...@merico.dev>
AuthorDate: Wed Aug 2 15:36:43 2023 +0800

    feat: collect bamboo deployment (#5784)
    
    * feat: collect bamboo deployment
    
    * fix: e2e test
---
 backend/plugins/bamboo/e2e/deploy_build_test.go    |  1 +
 .../snapshot_tables/_tool_bamboo_deploy_build.csv  | 18 +++++-----
 .../e2e/snapshot_tables/cicd_tasks_deploy.csv      | 18 +++++-----
 backend/plugins/bamboo/impl/impl.go                |  3 ++
 .../20230725_add_scopeConfigId_to_plan.go          |  2 +-
 ...to_plan.go => 20230801_add_env_name_pattern.go} | 24 +++++++-------
 .../bamboo/models/migrationscripts/register.go     |  1 +
 backend/plugins/bamboo/models/scope_config.go      |  3 ++
 .../plugins/bamboo/tasks/deploy_build_collector.go |  3 +-
 .../plugins/bamboo/tasks/deploy_build_convertor.go | 38 ++++++++++++++++------
 .../plugins/bamboo/tasks/deploy_build_extractor.go |  3 +-
 .../plugins/bamboo/tasks/plan_build_convertor.go   |  7 ----
 .../plugins/bamboo/tasks/plan_commit_convertor.go  |  7 ----
 13 files changed, 70 insertions(+), 58 deletions(-)

diff --git a/backend/plugins/bamboo/e2e/deploy_build_test.go b/backend/plugins/bamboo/e2e/deploy_build_test.go
index b3c913b95..3ef21ea2d 100644
--- a/backend/plugins/bamboo/e2e/deploy_build_test.go
+++ b/backend/plugins/bamboo/e2e/deploy_build_test.go
@@ -80,6 +80,7 @@ func TestBambooDeployBuildDataFlow(t *testing.T) {
 
 	// verify conversion
 	dataflowTester.FlushTabler(&devops.CICDTask{})
+	dataflowTester.FlushTabler(&devops.CICDPipeline{})
 	dataflowTester.Subtask(tasks.ConvertDeployBuildsMeta, taskData)
 	dataflowTester.VerifyTableWithOptions(&devops.CICDTask{}, e2ehelper.TableOptions{
 		CSVRelPath:  "./snapshot_tables/cicd_tasks_deploy.csv",
diff --git a/backend/plugins/bamboo/e2e/snapshot_tables/_tool_bamboo_deploy_build.csv b/backend/plugins/bamboo/e2e/snapshot_tables/_tool_bamboo_deploy_build.csv
index 80cfa6463..84e390def 100644
--- a/backend/plugins/bamboo/e2e/snapshot_tables/_tool_bamboo_deploy_build.csv
+++ b/backend/plugins/bamboo/e2e/snapshot_tables/_tool_bamboo_deploy_build.csv
@@ -1,10 +1,10 @@
 connection_id,deploy_build_id,deployment_version_name,deployment_state,life_cycle_state,started_date,queued_date,executed_date,finished_date,reason_summary,plan_key,project_key,can_view,can_edit,can_delete,allowed_to_execute,can_execute,allowed_to_create_version,allowed_to_set_version_status,environment,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark
-1,1769473,release-2,FAILED,FINISHED,2023-03-10T12:15:45.000+00:00,2023-03-10T12:15:45.000+00:00,2023-03-10T12:15:46.000+00:00,2023-03-10T12:15:46.000+00:00,"Manual run by <a href=""http://54.172.92.89:8085/browse/user/bamboo"">devlake</a>",TEST1,"",1,1,1,1,1,0,0,PRODUCTION,"{""connectionId"":1,""PlanKey"":""TEST1""}",_raw_bamboo_api_deploy_build,9,
-1,1769474,release-2,FAILED,FINISHED,2023-03-10T12:27:28.000+00:00,2023-03-10T12:27:28.000+00:00,2023-03-10T12:27:28.000+00:00,2023-03-10T12:27:28.000+00:00,"Manual run by <a href=""http://54.172.92.89:8085/browse/user/bamboo"">devlake</a>",TEST1,"",1,1,1,1,1,0,0,PRODUCTION,"{""connectionId"":1,""PlanKey"":""TEST1""}",_raw_bamboo_api_deploy_build,8,
-1,1769475,release-2,FAILED,FINISHED,2023-03-10T12:27:56.000+00:00,2023-03-10T12:27:56.000+00:00,2023-03-10T12:27:56.000+00:00,2023-03-10T12:27:56.000+00:00,"Manual run by <a href=""http://54.172.92.89:8085/browse/user/bamboo"">devlake</a>",TEST1,"",1,1,1,1,1,0,0,PRODUCTION,"{""connectionId"":1,""PlanKey"":""TEST1""}",_raw_bamboo_api_deploy_build,7,
-1,1769476,release-2,FAILED,FINISHED,2023-03-10T12:28:12.000+00:00,2023-03-10T12:28:12.000+00:00,2023-03-10T12:28:12.000+00:00,2023-03-10T12:28:12.000+00:00,"Manual run by <a href=""http://54.172.92.89:8085/browse/user/bamboo"">devlake</a>",TEST1,"",1,1,1,1,1,0,0,PRODUCTION,"{""connectionId"":1,""PlanKey"":""TEST1""}",_raw_bamboo_api_deploy_build,6,
-1,1769477,release-1,FAILED,FINISHED,2023-03-10T12:29:08.000+00:00,2023-03-10T12:29:09.000+00:00,2023-03-10T12:29:09.000+00:00,2023-03-10T12:29:09.000+00:00,"Manual run by <a href=""http://54.172.92.89:8085/browse/user/bamboo"">devlake</a>",TEST1,"",1,1,1,1,1,0,0,PRODUCTION,"{""connectionId"":1,""PlanKey"":""TEST1""}",_raw_bamboo_api_deploy_build,4,
-1,1769478,release-1,FAILED,FINISHED,2023-03-10T12:29:28.000+00:00,2023-03-10T12:29:28.000+00:00,2023-03-10T12:29:28.000+00:00,2023-03-10T12:29:28.000+00:00,"Manual run by <a href=""http://54.172.92.89:8085/browse/user/bamboo"">devlake</a>",TEST1,"",1,1,1,1,1,0,0,PRODUCTION,"{""connectionId"":1,""PlanKey"":""TEST1""}",_raw_bamboo_api_deploy_build,3,
-1,1769479,release-3,FAILED,FINISHED,2023-03-10T12:30:37.000+00:00,2023-03-10T12:30:37.000+00:00,2023-03-10T12:30:37.000+00:00,2023-03-10T12:30:37.000+00:00,"Manual run by <a href=""http://54.172.92.89:8085/browse/user/bamboo"">devlake</a>",TEST1,"",1,1,1,1,1,0,0,PRODUCTION,"{""connectionId"":1,""PlanKey"":""TEST1""}",_raw_bamboo_api_deploy_build,2,
-1,1769480,release-3,FAILED,FINISHED,2023-03-10T12:30:49.000+00:00,2023-03-10T12:30:49.000+00:00,2023-03-10T12:30:49.000+00:00,2023-03-10T12:30:49.000+00:00,"Manual run by <a href=""http://54.172.92.89:8085/browse/user/bamboo"">devlake</a>",TEST1,"",1,1,1,1,1,0,0,PRODUCTION,"{""connectionId"":1,""PlanKey"":""TEST1""}",_raw_bamboo_api_deploy_build,1,
-1,1769481,release-2,FAILED,FINISHED,2023-03-13T09:43:26.000+00:00,2023-03-13T09:43:26.000+00:00,2023-03-13T09:43:26.000+00:00,2023-03-13T09:43:26.000+00:00,"Manual run by <a href=""http://54.172.92.89:8085/browse/user/bamboo"">devlake</a>",TEST1,"",1,1,1,1,1,0,0,PRODUCTION,"{""connectionId"":1,""PlanKey"":""TEST1""}",_raw_bamboo_api_deploy_build,5,
+1,1769473,release-2,FAILED,FINISHED,2023-03-10T12:15:45.000+00:00,2023-03-10T12:15:45.000+00:00,2023-03-10T12:15:46.000+00:00,2023-03-10T12:15:46.000+00:00,"Manual run by <a href=""http://54.172.92.89:8085/browse/user/bamboo"">devlake</a>",TEST1,,1,1,1,1,1,0,0,,"{""connectionId"":1,""PlanKey"":""TEST1""}",_raw_bamboo_api_deploy_build,9,
+1,1769474,release-2,FAILED,FINISHED,2023-03-10T12:27:28.000+00:00,2023-03-10T12:27:28.000+00:00,2023-03-10T12:27:28.000+00:00,2023-03-10T12:27:28.000+00:00,"Manual run by <a href=""http://54.172.92.89:8085/browse/user/bamboo"">devlake</a>",TEST1,,1,1,1,1,1,0,0,,"{""connectionId"":1,""PlanKey"":""TEST1""}",_raw_bamboo_api_deploy_build,8,
+1,1769475,release-2,FAILED,FINISHED,2023-03-10T12:27:56.000+00:00,2023-03-10T12:27:56.000+00:00,2023-03-10T12:27:56.000+00:00,2023-03-10T12:27:56.000+00:00,"Manual run by <a href=""http://54.172.92.89:8085/browse/user/bamboo"">devlake</a>",TEST1,,1,1,1,1,1,0,0,,"{""connectionId"":1,""PlanKey"":""TEST1""}",_raw_bamboo_api_deploy_build,7,
+1,1769476,release-2,FAILED,FINISHED,2023-03-10T12:28:12.000+00:00,2023-03-10T12:28:12.000+00:00,2023-03-10T12:28:12.000+00:00,2023-03-10T12:28:12.000+00:00,"Manual run by <a href=""http://54.172.92.89:8085/browse/user/bamboo"">devlake</a>",TEST1,,1,1,1,1,1,0,0,,"{""connectionId"":1,""PlanKey"":""TEST1""}",_raw_bamboo_api_deploy_build,6,
+1,1769477,release-1,FAILED,FINISHED,2023-03-10T12:29:08.000+00:00,2023-03-10T12:29:09.000+00:00,2023-03-10T12:29:09.000+00:00,2023-03-10T12:29:09.000+00:00,"Manual run by <a href=""http://54.172.92.89:8085/browse/user/bamboo"">devlake</a>",TEST1,,1,1,1,1,1,0,0,,"{""connectionId"":1,""PlanKey"":""TEST1""}",_raw_bamboo_api_deploy_build,4,
+1,1769478,release-1,FAILED,FINISHED,2023-03-10T12:29:28.000+00:00,2023-03-10T12:29:28.000+00:00,2023-03-10T12:29:28.000+00:00,2023-03-10T12:29:28.000+00:00,"Manual run by <a href=""http://54.172.92.89:8085/browse/user/bamboo"">devlake</a>",TEST1,,1,1,1,1,1,0,0,,"{""connectionId"":1,""PlanKey"":""TEST1""}",_raw_bamboo_api_deploy_build,3,
+1,1769479,release-3,FAILED,FINISHED,2023-03-10T12:30:37.000+00:00,2023-03-10T12:30:37.000+00:00,2023-03-10T12:30:37.000+00:00,2023-03-10T12:30:37.000+00:00,"Manual run by <a href=""http://54.172.92.89:8085/browse/user/bamboo"">devlake</a>",TEST1,,1,1,1,1,1,0,0,,"{""connectionId"":1,""PlanKey"":""TEST1""}",_raw_bamboo_api_deploy_build,2,
+1,1769480,release-3,FAILED,FINISHED,2023-03-10T12:30:49.000+00:00,2023-03-10T12:30:49.000+00:00,2023-03-10T12:30:49.000+00:00,2023-03-10T12:30:49.000+00:00,"Manual run by <a href=""http://54.172.92.89:8085/browse/user/bamboo"">devlake</a>",TEST1,,1,1,1,1,1,0,0,,"{""connectionId"":1,""PlanKey"":""TEST1""}",_raw_bamboo_api_deploy_build,1,
+1,1769481,release-2,FAILED,FINISHED,2023-03-13T09:43:26.000+00:00,2023-03-13T09:43:26.000+00:00,2023-03-13T09:43:26.000+00:00,2023-03-13T09:43:26.000+00:00,"Manual run by <a href=""http://54.172.92.89:8085/browse/user/bamboo"">devlake</a>",TEST1,,1,1,1,1,1,0,0,,"{""connectionId"":1,""PlanKey"":""TEST1""}",_raw_bamboo_api_deploy_build,5,
diff --git a/backend/plugins/bamboo/e2e/snapshot_tables/cicd_tasks_deploy.csv b/backend/plugins/bamboo/e2e/snapshot_tables/cicd_tasks_deploy.csv
index 69500534a..9de77368b 100644
--- a/backend/plugins/bamboo/e2e/snapshot_tables/cicd_tasks_deploy.csv
+++ b/backend/plugins/bamboo/e2e/snapshot_tables/cicd_tasks_deploy.csv
@@ -1,10 +1,10 @@
 id,name,pipeline_id,result,status,type,environment,duration_sec,started_date,finished_date,cicd_scope_id
-bamboo:BambooDeployBuild:1:1769473,release-2,bamboo:BambooPlanBuild:1:TEST1,,IN_PROGRESS,DEPLOYMENT,PRODUCTION,0,2023-03-10T12:15:45.000+00:00,2023-03-10T12:15:46.000+00:00,bamboo:BambooPlan:1:TEST1
-bamboo:BambooDeployBuild:1:1769474,release-2,bamboo:BambooPlanBuild:1:TEST1,,IN_PROGRESS,DEPLOYMENT,PRODUCTION,0,2023-03-10T12:27:28.000+00:00,2023-03-10T12:27:28.000+00:00,bamboo:BambooPlan:1:TEST1
-bamboo:BambooDeployBuild:1:1769475,release-2,bamboo:BambooPlanBuild:1:TEST1,,IN_PROGRESS,DEPLOYMENT,PRODUCTION,0,2023-03-10T12:27:56.000+00:00,2023-03-10T12:27:56.000+00:00,bamboo:BambooPlan:1:TEST1
-bamboo:BambooDeployBuild:1:1769476,release-2,bamboo:BambooPlanBuild:1:TEST1,,IN_PROGRESS,DEPLOYMENT,PRODUCTION,0,2023-03-10T12:28:12.000+00:00,2023-03-10T12:28:12.000+00:00,bamboo:BambooPlan:1:TEST1
-bamboo:BambooDeployBuild:1:1769477,release-1,bamboo:BambooPlanBuild:1:TEST1,,IN_PROGRESS,DEPLOYMENT,PRODUCTION,0,2023-03-10T12:29:08.000+00:00,2023-03-10T12:29:09.000+00:00,bamboo:BambooPlan:1:TEST1
-bamboo:BambooDeployBuild:1:1769478,release-1,bamboo:BambooPlanBuild:1:TEST1,,IN_PROGRESS,DEPLOYMENT,PRODUCTION,0,2023-03-10T12:29:28.000+00:00,2023-03-10T12:29:28.000+00:00,bamboo:BambooPlan:1:TEST1
-bamboo:BambooDeployBuild:1:1769479,release-3,bamboo:BambooPlanBuild:1:TEST1,,IN_PROGRESS,DEPLOYMENT,PRODUCTION,0,2023-03-10T12:30:37.000+00:00,2023-03-10T12:30:37.000+00:00,bamboo:BambooPlan:1:TEST1
-bamboo:BambooDeployBuild:1:1769480,release-3,bamboo:BambooPlanBuild:1:TEST1,,IN_PROGRESS,DEPLOYMENT,PRODUCTION,0,2023-03-10T12:30:49.000+00:00,2023-03-10T12:30:49.000+00:00,bamboo:BambooPlan:1:TEST1
-bamboo:BambooDeployBuild:1:1769481,release-2,bamboo:BambooPlanBuild:1:TEST1,,IN_PROGRESS,DEPLOYMENT,PRODUCTION,0,2023-03-13T09:43:26.000+00:00,2023-03-13T09:43:26.000+00:00,bamboo:BambooPlan:1:TEST1
+bamboo:BambooDeployBuild:1:1769473,release-2,bamboo:BambooDeployBuild:1:1769473,,IN_PROGRESS,DEPLOYMENT,,1,2023-03-10T12:15:45.000+00:00,2023-03-10T12:15:46.000+00:00,bamboo:BambooPlan:1:TEST1
+bamboo:BambooDeployBuild:1:1769474,release-2,bamboo:BambooDeployBuild:1:1769474,,IN_PROGRESS,DEPLOYMENT,,0,2023-03-10T12:27:28.000+00:00,2023-03-10T12:27:28.000+00:00,bamboo:BambooPlan:1:TEST1
+bamboo:BambooDeployBuild:1:1769475,release-2,bamboo:BambooDeployBuild:1:1769475,,IN_PROGRESS,DEPLOYMENT,,0,2023-03-10T12:27:56.000+00:00,2023-03-10T12:27:56.000+00:00,bamboo:BambooPlan:1:TEST1
+bamboo:BambooDeployBuild:1:1769476,release-2,bamboo:BambooDeployBuild:1:1769476,,IN_PROGRESS,DEPLOYMENT,,0,2023-03-10T12:28:12.000+00:00,2023-03-10T12:28:12.000+00:00,bamboo:BambooPlan:1:TEST1
+bamboo:BambooDeployBuild:1:1769477,release-1,bamboo:BambooDeployBuild:1:1769477,,IN_PROGRESS,DEPLOYMENT,,1,2023-03-10T12:29:08.000+00:00,2023-03-10T12:29:09.000+00:00,bamboo:BambooPlan:1:TEST1
+bamboo:BambooDeployBuild:1:1769478,release-1,bamboo:BambooDeployBuild:1:1769478,,IN_PROGRESS,DEPLOYMENT,,0,2023-03-10T12:29:28.000+00:00,2023-03-10T12:29:28.000+00:00,bamboo:BambooPlan:1:TEST1
+bamboo:BambooDeployBuild:1:1769479,release-3,bamboo:BambooDeployBuild:1:1769479,,IN_PROGRESS,DEPLOYMENT,,0,2023-03-10T12:30:37.000+00:00,2023-03-10T12:30:37.000+00:00,bamboo:BambooPlan:1:TEST1
+bamboo:BambooDeployBuild:1:1769480,release-3,bamboo:BambooDeployBuild:1:1769480,,IN_PROGRESS,DEPLOYMENT,,0,2023-03-10T12:30:49.000+00:00,2023-03-10T12:30:49.000+00:00,bamboo:BambooPlan:1:TEST1
+bamboo:BambooDeployBuild:1:1769481,release-2,bamboo:BambooDeployBuild:1:1769481,,IN_PROGRESS,DEPLOYMENT,,0,2023-03-13T09:43:26.000+00:00,2023-03-13T09:43:26.000+00:00,bamboo:BambooPlan:1:TEST1
diff --git a/backend/plugins/bamboo/impl/impl.go b/backend/plugins/bamboo/impl/impl.go
index 120c36294..e60335ac2 100644
--- a/backend/plugins/bamboo/impl/impl.go
+++ b/backend/plugins/bamboo/impl/impl.go
@@ -178,6 +178,9 @@ func (p Bamboo) PrepareTaskData(taskCtx plugin.TaskContext, options map[string]i
 	if err := regexEnricher.TryAdd(devops.PRODUCTION, op.ProductionPattern); err != nil {
 		return nil, errors.BadInput.Wrap(err, "invalid value for `productionPattern`")
 	}
+	if err := regexEnricher.TryAdd(models.ENV_NAME_PATTERN, op.EnvNamePattern); err != nil {
+		return nil, errors.BadInput.Wrap(err, "invalid value for `envNamePattern`")
+	}
 	return &tasks.BambooTaskData{
 		Options:       op,
 		ApiClient:     apiClient,
diff --git a/backend/plugins/bamboo/models/migrationscripts/20230725_add_scopeConfigId_to_plan.go b/backend/plugins/bamboo/models/migrationscripts/20230725_add_scopeConfigId_to_plan.go
index 85aad16c5..dfe34a92a 100644
--- a/backend/plugins/bamboo/models/migrationscripts/20230725_add_scopeConfigId_to_plan.go
+++ b/backend/plugins/bamboo/models/migrationscripts/20230725_add_scopeConfigId_to_plan.go
@@ -23,7 +23,7 @@ import (
 	"github.com/apache/incubator-devlake/core/plugin"
 )
 
-var _ plugin.MigrationScript = (*addRawParamTableForScope)(nil)
+var _ plugin.MigrationScript = (*addScopeConfigId)(nil)
 
 type plan20230725 struct {
 	ScopeConfigId uint64 `json:"scopeConfigId"`
diff --git a/backend/plugins/bamboo/models/migrationscripts/20230725_add_scopeConfigId_to_plan.go b/backend/plugins/bamboo/models/migrationscripts/20230801_add_env_name_pattern.go
similarity index 60%
copy from backend/plugins/bamboo/models/migrationscripts/20230725_add_scopeConfigId_to_plan.go
copy to backend/plugins/bamboo/models/migrationscripts/20230801_add_env_name_pattern.go
index 85aad16c5..c7fd4b531 100644
--- a/backend/plugins/bamboo/models/migrationscripts/20230725_add_scopeConfigId_to_plan.go
+++ b/backend/plugins/bamboo/models/migrationscripts/20230801_add_env_name_pattern.go
@@ -23,26 +23,26 @@ import (
 	"github.com/apache/incubator-devlake/core/plugin"
 )
 
-var _ plugin.MigrationScript = (*addRawParamTableForScope)(nil)
+var _ plugin.MigrationScript = (*addEnvNamePattern)(nil)
 
-type plan20230725 struct {
-	ScopeConfigId uint64 `json:"scopeConfigId"`
+type scopeConfig20230801 struct {
+	EnvNamePattern string `mapstructure:"envNamePattern,omitempty" json:"envNamePattern" gorm:"type:varchar(255)"`
 }
 
-func (plan20230725) TableName() string {
-	return "_tool_bamboo_plans"
+func (scopeConfig20230801) TableName() string {
+	return "_tool_bamboo_scope_configs"
 }
 
-type addScopeConfigId struct{}
+type addEnvNamePattern struct{}
 
-func (script *addScopeConfigId) Up(basicRes context.BasicRes) errors.Error {
-	return basicRes.GetDal().AutoMigrate(&plan20230725{})
+func (script *addEnvNamePattern) Up(basicRes context.BasicRes) errors.Error {
+	return basicRes.GetDal().AutoMigrate(&scopeConfig20230801{})
 }
 
-func (*addScopeConfigId) Version() uint64 {
-	return 20230725093602
+func (*addEnvNamePattern) Version() uint64 {
+	return 20230801213814
 }
 
-func (script *addScopeConfigId) Name() string {
-	return "add scope_config_id to _tool_bamboo_plans"
+func (script *addEnvNamePattern) Name() string {
+	return "add env_name_pattern to _tool_bamboo_scope_configs"
 }
diff --git a/backend/plugins/bamboo/models/migrationscripts/register.go b/backend/plugins/bamboo/models/migrationscripts/register.go
index fc50db127..a55c62c40 100644
--- a/backend/plugins/bamboo/models/migrationscripts/register.go
+++ b/backend/plugins/bamboo/models/migrationscripts/register.go
@@ -30,5 +30,6 @@ func All() []plugin.MigrationScript {
 		new(renameTr2ScopeConfig),
 		new(addRawParamTableForScope),
 		new(addScopeConfigId),
+		new(addEnvNamePattern),
 	}
 }
diff --git a/backend/plugins/bamboo/models/scope_config.go b/backend/plugins/bamboo/models/scope_config.go
index 66d424303..6faf12693 100644
--- a/backend/plugins/bamboo/models/scope_config.go
+++ b/backend/plugins/bamboo/models/scope_config.go
@@ -22,6 +22,8 @@ import (
 	"gorm.io/datatypes"
 )
 
+const ENV_NAME_PATTERN = "ENV_NAME_PATTERN"
+
 type BambooScopeConfig struct {
 	common.ScopeConfig `mapstructure:",squash" json:",inline" gorm:"embedded"`
 	ConnectionId       uint64 `mapstructure:"connectionId" json:"connectionId"`
@@ -30,6 +32,7 @@ type BambooScopeConfig struct {
 	RepoMap           datatypes.JSONMap
 	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)"`
 }
 
 func (BambooScopeConfig) TableName() string {
diff --git a/backend/plugins/bamboo/tasks/deploy_build_collector.go b/backend/plugins/bamboo/tasks/deploy_build_collector.go
index 6d3fbf2c6..976adf6b5 100644
--- a/backend/plugins/bamboo/tasks/deploy_build_collector.go
+++ b/backend/plugins/bamboo/tasks/deploy_build_collector.go
@@ -37,13 +37,14 @@ var _ plugin.SubTaskEntryPoint = CollectDeployBuild
 
 type InputForEnv struct {
 	EnvId uint64 `json:"env_id"`
+	Name  string `json:"name"`
 }
 
 func CollectDeployBuild(taskCtx plugin.SubTaskContext) errors.Error {
 	rawDataSubTaskArgs, data := CreateRawDataSubTaskArgs(taskCtx, RAW_DEPLOY_BUILD_TABLE)
 	db := taskCtx.GetDal()
 	clauses := []dal.Clause{
-		dal.Select("env_id"),
+		dal.Select("env_id, name"),
 		dal.From(models.BambooDeployEnvironment{}.TableName()),
 		dal.Where("plan_key = ? and connection_id=?", data.Options.PlanKey, data.Options.ConnectionId),
 	}
diff --git a/backend/plugins/bamboo/tasks/deploy_build_convertor.go b/backend/plugins/bamboo/tasks/deploy_build_convertor.go
index 930d67cc3..5c3bcfa84 100644
--- a/backend/plugins/bamboo/tasks/deploy_build_convertor.go
+++ b/backend/plugins/bamboo/tasks/deploy_build_convertor.go
@@ -41,13 +41,6 @@ var ConvertDeployBuildsMeta = plugin.SubTaskMeta{
 func ConvertDeployBuilds(taskCtx plugin.SubTaskContext) errors.Error {
 	db := taskCtx.GetDal()
 	rawDataSubTaskArgs, data := CreateRawDataSubTaskArgs(taskCtx, RAW_JOB_BUILD_TABLE)
-	deploymentPattern := data.Options.DeploymentPattern
-	productionPattern := data.Options.ProductionPattern
-	regexEnricher := api.NewRegexEnricher()
-	err := regexEnricher.AddRegexp(deploymentPattern, productionPattern)
-	if err != nil {
-		return err
-	}
 	cursor, err := db.Cursor(
 		dal.From(&models.BambooDeployBuild{}),
 		dal.Where("connection_id = ? and plan_key = ?", data.Options.ConnectionId, data.Options.PlanKey))
@@ -57,7 +50,6 @@ func ConvertDeployBuilds(taskCtx plugin.SubTaskContext) errors.Error {
 	defer cursor.Close()
 
 	deployBuildIdGen := didgen.NewDomainIdGenerator(&models.BambooDeployBuild{})
-	planBuildIdGen := didgen.NewDomainIdGenerator(&models.BambooPlanBuild{})
 	planIdGen := didgen.NewDomainIdGenerator(&models.BambooPlan{})
 
 	converter, err := api.NewDataConverter(api.DataConverterArgs{
@@ -66,11 +58,14 @@ func ConvertDeployBuilds(taskCtx plugin.SubTaskContext) errors.Error {
 		RawDataSubTaskArgs: *rawDataSubTaskArgs,
 		Convert: func(inputRow interface{}) ([]interface{}, errors.Error) {
 			deployBuild := inputRow.(*models.BambooDeployBuild)
+			if deployBuild.StartedDate == nil {
+				return nil, nil
+			}
 			domainTask := &devops.CICDTask{
 				DomainEntity: domainlayer.DomainEntity{
 					Id: deployBuildIdGen.Generate(data.Options.ConnectionId, deployBuild.DeployBuildId),
 				},
-				PipelineId:  planBuildIdGen.Generate(data.Options.ConnectionId, deployBuild.PlanKey),
+				PipelineId:  deployBuildIdGen.Generate(data.Options.ConnectionId, deployBuild.DeployBuildId),
 				CicdScopeId: planIdGen.Generate(data.Options.ConnectionId, data.Options.PlanKey),
 
 				Name: deployBuild.DeploymentVersionName,
@@ -86,16 +81,39 @@ func ConvertDeployBuilds(taskCtx plugin.SubTaskContext) errors.Error {
 					Default: devops.IN_PROGRESS,
 				}, deployBuild.LifeCycleState),
 
-				//DurationSec:  uint64(deployBuild),
 				StartedDate:  *deployBuild.StartedDate,
 				FinishedDate: deployBuild.FinishedDate,
 			}
 
 			domainTask.Type = devops.DEPLOYMENT
 			domainTask.Environment = deployBuild.Environment
+			if data.RegexEnricher.ReturnNameIfMatched(models.ENV_NAME_PATTERN, deployBuild.Environment) != "" {
+				domainTask.Environment = devops.PRODUCTION
+			}
+			if deployBuild.FinishedDate != nil && deployBuild.StartedDate != nil {
+				sec := deployBuild.FinishedDate.Sub(*deployBuild.StartedDate).Seconds()
+				if sec >= 0 {
+					domainTask.DurationSec = uint64(sec)
+				}
+			}
+			pipeline := &devops.CICDPipeline{
+				DomainEntity: domainlayer.DomainEntity{
+					Id: domainTask.PipelineId,
+				},
+				Name:         domainTask.Name,
+				Result:       domainTask.Result,
+				Status:       domainTask.Status,
+				DurationSec:  domainTask.DurationSec,
+				Type:         domainTask.Type,
+				Environment:  domainTask.Environment,
+				CreatedDate:  domainTask.StartedDate,
+				FinishedDate: domainTask.FinishedDate,
+				CicdScopeId:  domainTask.CicdScopeId,
+			}
 
 			return []interface{}{
 				domainTask,
+				pipeline,
 			}, nil
 		},
 	})
diff --git a/backend/plugins/bamboo/tasks/deploy_build_extractor.go b/backend/plugins/bamboo/tasks/deploy_build_extractor.go
index e7a4ba9ba..2a3ee2baa 100644
--- a/backend/plugins/bamboo/tasks/deploy_build_extractor.go
+++ b/backend/plugins/bamboo/tasks/deploy_build_extractor.go
@@ -21,7 +21,6 @@ import (
 	"encoding/json"
 
 	"github.com/apache/incubator-devlake/core/errors"
-	"github.com/apache/incubator-devlake/core/models/domainlayer/devops"
 	"github.com/apache/incubator-devlake/core/plugin"
 	helper "github.com/apache/incubator-devlake/helpers/pluginhelper/api"
 	"github.com/apache/incubator-devlake/plugins/bamboo/models"
@@ -49,7 +48,7 @@ func ExtractDeployBuild(taskCtx plugin.SubTaskContext) errors.Error {
 
 			build := res.Convert(data.Options)
 			build.PlanKey = data.Options.PlanKey
-			build.Environment = data.RegexEnricher.ReturnNameIfMatched(devops.PRODUCTION, build.DeploymentVersionName)
+			build.Environment = input.Name
 
 			return []interface{}{
 				build,
diff --git a/backend/plugins/bamboo/tasks/plan_build_convertor.go b/backend/plugins/bamboo/tasks/plan_build_convertor.go
index cda96e519..3402d1dba 100644
--- a/backend/plugins/bamboo/tasks/plan_build_convertor.go
+++ b/backend/plugins/bamboo/tasks/plan_build_convertor.go
@@ -41,13 +41,6 @@ var ConvertPlanBuildsMeta = plugin.SubTaskMeta{
 func ConvertPlanBuilds(taskCtx plugin.SubTaskContext) errors.Error {
 	db := taskCtx.GetDal()
 	rawDataSubTaskArgs, data := CreateRawDataSubTaskArgs(taskCtx, RAW_PLAN_BUILD_TABLE)
-	deploymentPattern := data.Options.DeploymentPattern
-	productionPattern := data.Options.ProductionPattern
-	regexEnricher := api.NewRegexEnricher()
-	err := regexEnricher.AddRegexp(deploymentPattern, productionPattern)
-	if err != nil {
-		return err
-	}
 	cursor, err := db.Cursor(
 		dal.From(&models.BambooPlanBuild{}),
 		dal.Where("connection_id = ? and plan_key = ?", data.Options.ConnectionId, data.Options.PlanKey))
diff --git a/backend/plugins/bamboo/tasks/plan_commit_convertor.go b/backend/plugins/bamboo/tasks/plan_commit_convertor.go
index 2232ed1b3..6144b082f 100644
--- a/backend/plugins/bamboo/tasks/plan_commit_convertor.go
+++ b/backend/plugins/bamboo/tasks/plan_commit_convertor.go
@@ -40,13 +40,6 @@ var ConvertPlanVcsMeta = plugin.SubTaskMeta{
 func ConvertPlanVcs(taskCtx plugin.SubTaskContext) errors.Error {
 	db := taskCtx.GetDal()
 	rawDataSubTaskArgs, data := CreateRawDataSubTaskArgs(taskCtx, RAW_PLAN_BUILD_TABLE)
-	deploymentPattern := data.Options.DeploymentPattern
-	productionPattern := data.Options.ProductionPattern
-	regexEnricher := api.NewRegexEnricher()
-	err := regexEnricher.AddRegexp(deploymentPattern, productionPattern)
-	if err != nil {
-		return err
-	}
 	cursor, err := db.Cursor(
 		dal.From(&models.BambooPlanBuildVcsRevision{}),
 		dal.Join(`left join _tool_bamboo_plan_builds on _tool_bamboo_plan_builds.plan_build_key = _tool_bamboo_plan_build_commits.plan_build_key`),