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 2023/05/26 06:29:10 UTC

[incubator-devlake] branch main updated: refactor: rename transformation rule to scope config (#5282)

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 289008f54 refactor: rename transformation rule to scope config (#5282)
289008f54 is described below

commit 289008f544dc22723772937ca5cd9c44a2c9fb6f
Author: Klesh Wong <zh...@merico.dev>
AuthorDate: Fri May 26 14:29:05 2023 +0800

    refactor: rename transformation rule to scope config (#5282)
---
 backend/core/models/common/base.go                 |   5 +
 backend/core/plugin/plugin_blueprint.go            |   6 +-
 backend/core/plugin/plugin_meta.go                 |   3 +-
 .../pluginhelper/api/scope_config_helper.go        | 132 +++++++++++++++++++++
 backend/plugins/bamboo/api/blueprint_V200_test.go  |  50 ++++----
 backend/plugins/bamboo/api/blueprint_v200.go       |  39 +++---
 backend/plugins/bamboo/api/init.go                 |   8 +-
 backend/plugins/bamboo/api/scope.go                |   2 +-
 backend/plugins/bamboo/api/scope_config.go         |  83 +++++++++++++
 backend/plugins/bamboo/api/transformation_rule.go  |  83 -------------
 backend/plugins/bamboo/bamboo.go                   |   2 +-
 backend/plugins/bamboo/e2e/deploy_build_test.go    |   2 +-
 backend/plugins/bamboo/e2e/deploy_test.go          |   6 +-
 backend/plugins/bamboo/e2e/job_build_test.go       |   2 +-
 backend/plugins/bamboo/e2e/job_test.go             |   2 +-
 .../plugins/bamboo/e2e/plan_build_commits_test.go  |   2 +-
 backend/plugins/bamboo/e2e/plan_build_test.go      |   2 +-
 backend/plugins/bamboo/e2e/plan_test.go            |   6 +-
 backend/plugins/bamboo/impl/impl.go                |  52 ++++----
 ...22_add_connection_id_to_transformation_rules.go |   8 +-
 .../migrationscripts/20230518_scope_config.go      |  56 +++++++++
 .../bamboo/models/migrationscripts/register.go     |   1 +
 backend/plugins/bamboo/models/project.go           |  17 +--
 .../{transformation_rule.go => scope_config.go}    |  12 +-
 backend/plugins/bamboo/models/task.go              |  10 +-
 .../plugins/bamboo/tasks/deploy_build_extractor.go |   1 -
 .../plugins/bamboo/tasks/job_build_extractor.go    |   1 -
 .../services/remote/plugin/plugin_extensions.go    |   3 +-
 28 files changed, 396 insertions(+), 200 deletions(-)

diff --git a/backend/core/models/common/base.go b/backend/core/models/common/base.go
index 1f37e73fc..e33631735 100644
--- a/backend/core/models/common/base.go
+++ b/backend/core/models/common/base.go
@@ -28,6 +28,11 @@ type Model struct {
 	UpdatedAt time.Time `json:"updatedAt"`
 }
 
+type ScopeConfig struct {
+	Model
+	Entities []string `gorm:"type:json;serializer:json" json:"entities" mapstructure:"entities"`
+}
+
 type NoPKModel struct {
 	CreatedAt     time.Time `json:"createdAt"`
 	UpdatedAt     time.Time `json:"updatedAt"`
diff --git a/backend/core/plugin/plugin_blueprint.go b/backend/core/plugin/plugin_blueprint.go
index 9487bccb4..644163015 100644
--- a/backend/core/plugin/plugin_blueprint.go
+++ b/backend/core/plugin/plugin_blueprint.go
@@ -124,10 +124,10 @@ type BlueprintConnectionV200 struct {
 }
 
 // BlueprintScopeV200 contains the `id` and `name` for a specific scope
-// transformationRuleId should be deduced by the ScopeId
 type BlueprintScopeV200 struct {
-	Id       string   `json:"id"`
-	Name     string   `json:"name"`
+	Id   string `json:"id"`
+	Name string `json:"name"`
+	// Deprecated: Entities is moved to the ScopeConfig struct
 	Entities []string `json:"entities"`
 }
 
diff --git a/backend/core/plugin/plugin_meta.go b/backend/core/plugin/plugin_meta.go
index 5f8fe41ed..37c135966 100644
--- a/backend/core/plugin/plugin_meta.go
+++ b/backend/core/plugin/plugin_meta.go
@@ -45,5 +45,6 @@ type PluginIcon interface {
 type PluginSource interface {
 	Connection() interface{}
 	Scope() interface{}
-	TransformationRule() interface{}
+	// Deprecated: rename to ScopeConfig
+	// TransformationRule() interface{}
 }
diff --git a/backend/helpers/pluginhelper/api/scope_config_helper.go b/backend/helpers/pluginhelper/api/scope_config_helper.go
new file mode 100644
index 000000000..f2ad2d004
--- /dev/null
+++ b/backend/helpers/pluginhelper/api/scope_config_helper.go
@@ -0,0 +1,132 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package api
+
+import (
+	"net/http"
+	"reflect"
+	"strconv"
+
+	"github.com/apache/incubator-devlake/core/context"
+	"github.com/apache/incubator-devlake/core/dal"
+	"github.com/apache/incubator-devlake/core/errors"
+	"github.com/apache/incubator-devlake/core/log"
+	"github.com/apache/incubator-devlake/core/plugin"
+	"github.com/go-playground/validator/v10"
+)
+
+// ScopeConfigHelper is used to write the CURD of transformation rule
+type ScopeConfigHelper[Tr dal.Tabler] struct {
+	log       log.Logger
+	db        dal.Dal
+	validator *validator.Validate
+}
+
+// NewScopeConfigHelper creates a ScopeConfigHelper for transformation rule management
+func NewScopeConfigHelper[Tr dal.Tabler](
+	basicRes context.BasicRes,
+	vld *validator.Validate,
+) *ScopeConfigHelper[Tr] {
+	if vld == nil {
+		vld = validator.New()
+	}
+	return &ScopeConfigHelper[Tr]{
+		log:       basicRes.GetLogger(),
+		db:        basicRes.GetDal(),
+		validator: vld,
+	}
+}
+
+func (t ScopeConfigHelper[Tr]) Create(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) {
+	connectionId, e := strconv.ParseUint(input.Params["connectionId"], 10, 64)
+	if e != nil || connectionId == 0 {
+		return nil, errors.Default.Wrap(e, "the connection ID should be an non-zero integer")
+	}
+	var rule Tr
+	if err := DecodeMapStruct(input.Body, &rule, false); err != nil {
+		return nil, errors.Default.Wrap(err, "error in decoding transformation rule")
+	}
+	if t.validator != nil {
+		if err := t.validator.Struct(rule); err != nil {
+			return nil, errors.Default.Wrap(err, "error validating transformation rule")
+		}
+	}
+	valueConnectionId := reflect.ValueOf(&rule).Elem().FieldByName("ConnectionId")
+	if valueConnectionId.IsValid() {
+		valueConnectionId.SetUint(connectionId)
+	}
+
+	if err := t.db.Create(&rule); err != nil {
+		if t.db.IsDuplicationError(err) {
+			return nil, errors.BadInput.New("there was a transformation rule with the same name, please choose another name")
+		}
+		return nil, errors.BadInput.Wrap(err, "error on saving ScopeConfig")
+	}
+	return &plugin.ApiResourceOutput{Body: rule, Status: http.StatusOK}, nil
+}
+
+func (t ScopeConfigHelper[Tr]) Update(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) {
+	scopeConfigId, e := strconv.ParseUint(input.Params["id"], 10, 64)
+	if e != nil {
+		return nil, errors.Default.Wrap(e, "the transformation rule ID should be an integer")
+	}
+	var old Tr
+	err := t.db.First(&old, dal.Where("id = ?", scopeConfigId))
+	if err != nil {
+		return nil, errors.Default.Wrap(err, "error on saving ScopeConfig")
+	}
+	err = DecodeMapStruct(input.Body, &old, false)
+	if err != nil {
+		return nil, errors.Default.Wrap(err, "error decoding map into scopeConfig")
+	}
+	err = t.db.Update(&old, dal.Where("id = ?", scopeConfigId))
+	if err != nil {
+		if t.db.IsDuplicationError(err) {
+			return nil, errors.BadInput.New("there was a transformation rule with the same name, please choose another name")
+		}
+		return nil, errors.BadInput.Wrap(err, "error on saving ScopeConfig")
+	}
+	return &plugin.ApiResourceOutput{Body: old, Status: http.StatusOK}, nil
+}
+
+func (t ScopeConfigHelper[Tr]) Get(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) {
+	scopeConfigId, err := strconv.ParseUint(input.Params["id"], 10, 64)
+	if err != nil {
+		return nil, errors.Default.Wrap(err, "the transformation rule ID should be an integer")
+	}
+	var rule Tr
+	err = t.db.First(&rule, dal.Where("id = ?", scopeConfigId))
+	if err != nil {
+		return nil, errors.Default.Wrap(err, "error on get ScopeConfig")
+	}
+	return &plugin.ApiResourceOutput{Body: rule, Status: http.StatusOK}, nil
+}
+
+func (t ScopeConfigHelper[Tr]) List(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) {
+	connectionId, e := strconv.ParseUint(input.Params["connectionId"], 10, 64)
+	if e != nil || connectionId == 0 {
+		return nil, errors.Default.Wrap(e, "the connection ID should be an non-zero integer")
+	}
+	var rules []Tr
+	limit, offset := GetLimitOffset(input.Query, "pageSize", "page")
+	err := t.db.All(&rules, dal.Where("connection_id = ?", connectionId), dal.Limit(limit), dal.Offset(offset))
+	if err != nil {
+		return nil, errors.Default.Wrap(err, "error on get ScopeConfig list")
+	}
+	return &plugin.ApiResourceOutput{Body: rules, Status: http.StatusOK}, nil
+}
diff --git a/backend/plugins/bamboo/api/blueprint_V200_test.go b/backend/plugins/bamboo/api/blueprint_V200_test.go
index e9f1f4b43..4e93e34de 100644
--- a/backend/plugins/bamboo/api/blueprint_V200_test.go
+++ b/backend/plugins/bamboo/api/blueprint_V200_test.go
@@ -38,22 +38,21 @@ import (
 
 func TestMakeDataSourcePipelinePlanV200(t *testing.T) {
 	const testConnectionID uint64 = 1
-	const testTransformationRuleId uint64 = 2
+	const testScopeConfigId uint64 = 2
 	const testKey string = "TEST"
 	const testBambooEndPoint string = "http://mail.nddtf.com:8085/rest/api/latest/"
 	const testLink string = "http://mail.nddtf.com:8085/rest/api/latest/project/TEST"
 	const testUser string = "username"
 	const testPass string = "password"
 	const testName string = "bamboo-test"
-	const testTransformationRuleName string = "bamboo transformation rule"
+	const testScopeConfigName string = "bamboo scope config"
 	const testProxy string = ""
 
 	syncPolicy := &plugin.BlueprintSyncPolicy{}
 	bpScopes := []*plugin.BlueprintScopeV200{
 		{
-			Entities: []string{plugin.DOMAIN_TYPE_CICD},
-			Id:       testKey,
-			Name:     testName,
+			Id:   testKey,
+			Name: testName,
 		},
 	}
 
@@ -63,14 +62,17 @@ func TestMakeDataSourcePipelinePlanV200(t *testing.T) {
 		Name:         testName,
 		Href:         testLink,
 
-		TransformationRuleId: testTransformationRuleId,
+		ScopeConfigId: testScopeConfigId,
 	}
 
-	var testTransformationRule = &models.BambooTransformationRule{
-		Model: common.Model{
-			ID: testTransformationRuleId,
+	var testScopeConfig = &models.BambooScopeConfig{
+		ScopeConfig: common.ScopeConfig{
+			Model: common.Model{
+				ID: testScopeConfigId,
+			},
+			Entities: []string{plugin.DOMAIN_TYPE_CICD},
 		},
-		Name: testTransformationRuleName,
+		Name: testScopeConfigName,
 	}
 
 	var testBambooConnection = &models.BambooConnection{
@@ -107,9 +109,9 @@ func TestMakeDataSourcePipelinePlanV200(t *testing.T) {
 					tasks.ConvertProjectsMeta.Name,
 				},
 				Options: map[string]interface{}{
-					"connectionId":         uint64(1),
-					"projectKey":           testKey,
-					"transformationRuleId": testTransformationRuleId,
+					"connectionId":  uint64(1),
+					"projectKey":    testKey,
+					"scopeConfigId": testScopeConfigId,
 				},
 			},
 		},
@@ -130,19 +132,15 @@ func TestMakeDataSourcePipelinePlanV200(t *testing.T) {
 	// Refresh Global Variables and set the sql mock
 	basicRes = unithelper.DummyBasicRes(func(mockDal *mockdal.Dal) {
 		mockDal.On("First", mock.Anything, mock.Anything).Run(func(args mock.Arguments) {
-			dst := args.Get(0).(*models.BambooConnection)
-			*dst = *testBambooConnection
-		}).Return(nil).Once()
-
-		mockDal.On("First", mock.Anything, mock.Anything).Run(func(args mock.Arguments) {
-			dst := args.Get(0).(*models.BambooProject)
-			*dst = *testBambooProject
-		}).Return(nil).Twice()
-
-		mockDal.On("First", mock.Anything, mock.Anything).Run(func(args mock.Arguments) {
-			dst := args.Get(0).(*models.BambooTransformationRule)
-			*dst = *testTransformationRule
-		}).Return(nil).Once()
+			switch dst := args.Get(0).(type) {
+			case *models.BambooConnection:
+				*dst = *testBambooConnection
+			case *models.BambooProject:
+				*dst = *testBambooProject
+			case *models.BambooScopeConfig:
+				*dst = *testScopeConfig
+			}
+		}).Return(nil)
 	})
 	connectionHelper = helper.NewConnectionHelper(
 		basicRes,
diff --git a/backend/plugins/bamboo/api/blueprint_v200.go b/backend/plugins/bamboo/api/blueprint_v200.go
index 3ce938993..7fdf12f43 100644
--- a/backend/plugins/bamboo/api/blueprint_v200.go
+++ b/backend/plugins/bamboo/api/blueprint_v200.go
@@ -19,6 +19,7 @@ package api
 
 import (
 	"fmt"
+
 	"github.com/apache/incubator-devlake/plugins/bamboo/models"
 
 	"github.com/apache/incubator-devlake/core/errors"
@@ -64,14 +65,19 @@ func makeScopeV200(connectionId uint64, scopes []*plugin.BlueprintScopeV200) ([]
 		id := didgen.NewDomainIdGenerator(&models.BambooProject{}).Generate(connectionId, scope.Id)
 
 		// get project from db
-		BambooProject, err := GetProjectByConnectionIdAndscopeId(connectionId, scope.Id)
+		project, err := GetProjectByConnectionIdAndscopeId(connectionId, scope.Id)
+		if err != nil {
+			return nil, err
+		}
+
+		scopeConfig, err := GetScopeConfigByproject(project)
 		if err != nil {
 			return nil, err
 		}
 
 		// add cicd_scope to scopes
-		if utils.StringsContains(scope.Entities, plugin.DOMAIN_TYPE_CICD) {
-			scopeCICD := devops.NewCicdScope(id, BambooProject.Name)
+		if utils.StringsContains(scopeConfig.Entities, plugin.DOMAIN_TYPE_CICD) {
+			scopeCICD := devops.NewCicdScope(id, project.Name)
 
 			sc = append(sc, scopeCICD)
 		}
@@ -95,8 +101,7 @@ func makePipelinePlanV200(
 			return nil, err
 		}
 
-		// get transformationRuleId
-		transformationRules, err := GetTransformationRuleByproject(project)
+		scopeConfig, err := GetScopeConfigByproject(project)
 		if err != nil {
 			return nil, err
 		}
@@ -105,10 +110,10 @@ func makePipelinePlanV200(
 		options := make(map[string]interface{})
 		options["connectionId"] = connection.ID
 		options["projectKey"] = scope.Id
-		options["transformationRuleId"] = transformationRules.ID
+		options["scopeConfigId"] = scopeConfig.ID
 
 		// construct subtasks
-		subtasks, err := helper.MakePipelinePlanSubtasks(subtaskMetas, scope.Entities)
+		subtasks, err := helper.MakePipelinePlanSubtasks(subtaskMetas, scopeConfig.Entities)
 		if err != nil {
 			return nil, err
 		}
@@ -140,22 +145,22 @@ func GetProjectByConnectionIdAndscopeId(connectionId uint64, scopeId string) (*m
 	return project, nil
 }
 
-// GetTransformationRuleByproject get the GetTransformationRule by project
-func GetTransformationRuleByproject(project *models.BambooProject) (*models.BambooTransformationRule, errors.Error) {
-	transformationRules := &models.BambooTransformationRule{}
-	transformationRuleId := project.TransformationRuleId
-	if transformationRuleId != 0 {
+// GetScopeConfigByproject get the BambooScopeConfig by project
+func GetScopeConfigByproject(project *models.BambooProject) (*models.BambooScopeConfig, errors.Error) {
+	scopeConfig := &models.BambooScopeConfig{}
+	scopeConfigId := project.ScopeConfigId
+	if scopeConfigId != 0 {
 		db := basicRes.GetDal()
-		err := db.First(transformationRules, dal.Where("id = ?", transformationRuleId))
+		err := db.First(scopeConfig, dal.Where("id = ?", scopeConfigId))
 		if err != nil {
 			if db.IsErrorNotFound(err) {
-				return nil, errors.Default.Wrap(err, fmt.Sprintf("can not find transformationRules by transformationRuleId [%d]", transformationRuleId))
+				return nil, errors.Default.Wrap(err, fmt.Sprintf("can not find ScopeConfig by ScopeConfig [%d]", scopeConfigId))
 			}
-			return nil, errors.Default.Wrap(err, fmt.Sprintf("fail to find transformationRules by transformationRuleId [%d]", transformationRuleId))
+			return nil, errors.Default.Wrap(err, fmt.Sprintf("fail to find ScopeConfig by ScopeConfig [%d]", scopeConfigId))
 		}
 	} else {
-		transformationRules.ID = 0
+		scopeConfig.ID = 0
 	}
 
-	return transformationRules, nil
+	return scopeConfig, nil
 }
diff --git a/backend/plugins/bamboo/api/init.go b/backend/plugins/bamboo/api/init.go
index 71b3bd589..e6833f341 100644
--- a/backend/plugins/bamboo/api/init.go
+++ b/backend/plugins/bamboo/api/init.go
@@ -26,9 +26,9 @@ import (
 
 var vld *validator.Validate
 var connectionHelper *api.ConnectionApiHelper
-var scopeHelper *api.ScopeApiHelper[models.BambooConnection, models.BambooProject, models.BambooTransformationRule]
+var scopeHelper *api.ScopeApiHelper[models.BambooConnection, models.BambooProject, models.BambooScopeConfig]
 var remoteHelper *api.RemoteApiHelper[models.BambooConnection, models.BambooProject, models.ApiBambooProject, api.NoRemoteGroupResponse]
-var trHelper *api.TransformationRuleHelper[models.BambooTransformationRule]
+var scopeConfigHelper *api.ScopeConfigHelper[models.BambooScopeConfig]
 
 var basicRes context.BasicRes
 
@@ -39,7 +39,7 @@ func Init(br context.BasicRes) {
 		basicRes,
 		vld,
 	)
-	scopeHelper = api.NewScopeHelper[models.BambooConnection, models.BambooProject, models.BambooTransformationRule](
+	scopeHelper = api.NewScopeHelper[models.BambooConnection, models.BambooProject, models.BambooScopeConfig](
 		basicRes,
 		vld,
 		connectionHelper,
@@ -49,7 +49,7 @@ func Init(br context.BasicRes) {
 		vld,
 		connectionHelper,
 	)
-	trHelper = api.NewTransformationRuleHelper[models.BambooTransformationRule](
+	scopeConfigHelper = api.NewScopeConfigHelper[models.BambooScopeConfig](
 		basicRes,
 		vld,
 	)
diff --git a/backend/plugins/bamboo/api/scope.go b/backend/plugins/bamboo/api/scope.go
index 3b318da8f..0870eabb2 100644
--- a/backend/plugins/bamboo/api/scope.go
+++ b/backend/plugins/bamboo/api/scope.go
@@ -26,7 +26,7 @@ import (
 
 type ScopeRes struct {
 	models.BambooProject
-	TransformationRuleName string `json:"transformationRuleName,omitempty"`
+	ScopeConfigName string `json:"scopeConfigName,omitempty"`
 }
 
 type ScopeReq api.ScopeReq[models.BambooProject]
diff --git a/backend/plugins/bamboo/api/scope_config.go b/backend/plugins/bamboo/api/scope_config.go
new file mode 100644
index 000000000..5890fe3d8
--- /dev/null
+++ b/backend/plugins/bamboo/api/scope_config.go
@@ -0,0 +1,83 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package api
+
+import (
+	"github.com/apache/incubator-devlake/core/errors"
+	"github.com/apache/incubator-devlake/core/plugin"
+)
+
+// CreateScopeConfig create scope config for Bamboo
+// @Summary create scope config for Bamboo
+// @Description create scope config for Bamboo
+// @Tags plugins/bamboo
+// @Accept application/json
+// @Param connectionId path int true "connectionId"
+// @Param scopeConfig body models.BambooScopeConfig true "scope config"
+// @Success 200  {object} models.BambooScopeConfig
+// @Failure 400  {object} shared.ApiBody "Bad Request"
+// @Failure 500  {object} shared.ApiBody "Internal Error"
+// @Router /plugins/bamboo/connections/{connectionId}/scope_configs [POST]
+func CreateScopeConfig(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) {
+	return scopeConfigHelper.Create(input)
+}
+
+// UpdateScopeConfig update scope config for Bamboo
+// @Summary update scope config for Bamboo
+// @Description update scope config for Bamboo
+// @Tags plugins/bamboo
+// @Accept application/json
+// @Param id path int true "id"
+// @Param scopeConfig body models.BambooScopeConfig true "scope config"
+// @Param connectionId path int true "connectionId"
+// @Success 200  {object} models.BambooScopeConfig
+// @Failure 400  {object} shared.ApiBody "Bad Request"
+// @Failure 500  {object} shared.ApiBody "Internal Error"
+// @Router /plugins/bamboo/connections/{connectionId}/scope_configs/{id} [PATCH]
+func UpdateScopeConfig(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) {
+	return scopeConfigHelper.Update(input)
+}
+
+// GetScopeConfig return onescope config
+// @Summary return onescope config
+// @Description return onescope config
+// @Tags plugins/bamboo
+// @Param id path int true "id"
+// @Param connectionId path int true "connectionId"
+// @Success 200  {object} models.BambooScopeConfig
+// @Failure 400  {object} shared.ApiBody "Bad Request"
+// @Failure 500  {object} shared.ApiBody "Internal Error"
+// @Router /plugins/bamboo/connections/{connectionId}/scope_configs/{id} [GET]
+func GetScopeConfig(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) {
+	return scopeConfigHelper.Get(input)
+}
+
+// GetScopeConfigList return all scope configs
+// @Summary return all scope configs
+// @Description return all scope configs
+// @Tags plugins/bamboo
+// @Param pageSize query int false "page size, default 50"
+// @Param page query int false "page size, default 1"
+// @Param connectionId path int true "connectionId"
+// @Success 200  {object} []models.BambooScopeConfig
+// @Failure 400  {object} shared.ApiBody "Bad Request"
+// @Failure 500  {object} shared.ApiBody "Internal Error"
+// @Router /plugins/bamboo/connections/{connectionId}/scope_configs [GET]
+func GetScopeConfigList(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) {
+	return scopeConfigHelper.List(input)
+}
diff --git a/backend/plugins/bamboo/api/transformation_rule.go b/backend/plugins/bamboo/api/transformation_rule.go
deleted file mode 100644
index 99e6812e5..000000000
--- a/backend/plugins/bamboo/api/transformation_rule.go
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one or more
-contributor license agreements.  See the NOTICE file distributed with
-this work for additional information regarding copyright ownership.
-The ASF licenses this file to You under the Apache License, Version 2.0
-(the "License"); you may not use this file except in compliance with
-the License.  You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package api
-
-import (
-	"github.com/apache/incubator-devlake/core/errors"
-	"github.com/apache/incubator-devlake/core/plugin"
-)
-
-// CreateTransformationRule create transformation rule for Bamboo
-// @Summary create transformation rule for Bamboo
-// @Description create transformation rule for Bamboo
-// @Tags plugins/bamboo
-// @Accept application/json
-// @Param connectionId path int true "connectionId"
-// @Param transformationRule body models.BambooTransformationRule true "transformation rule"
-// @Success 200  {object} models.BambooTransformationRule
-// @Failure 400  {object} shared.ApiBody "Bad Request"
-// @Failure 500  {object} shared.ApiBody "Internal Error"
-// @Router /plugins/bamboo/connections/{connectionId}/transformation_rules [POST]
-func CreateTransformationRule(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) {
-	return trHelper.Create(input)
-}
-
-// UpdateTransformationRule update transformation rule for Bamboo
-// @Summary update transformation rule for Bamboo
-// @Description update transformation rule for Bamboo
-// @Tags plugins/bamboo
-// @Accept application/json
-// @Param id path int true "id"
-// @Param transformationRule body models.BambooTransformationRule true "transformation rule"
-// @Param connectionId path int true "connectionId"
-// @Success 200  {object} models.BambooTransformationRule
-// @Failure 400  {object} shared.ApiBody "Bad Request"
-// @Failure 500  {object} shared.ApiBody "Internal Error"
-// @Router /plugins/bamboo/connections/{connectionId}/transformation_rules/{id} [PATCH]
-func UpdateTransformationRule(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) {
-	return trHelper.Update(input)
-}
-
-// GetTransformationRule return one transformation rule
-// @Summary return one transformation rule
-// @Description return one transformation rule
-// @Tags plugins/bamboo
-// @Param id path int true "id"
-// @Param connectionId path int true "connectionId"
-// @Success 200  {object} models.BambooTransformationRule
-// @Failure 400  {object} shared.ApiBody "Bad Request"
-// @Failure 500  {object} shared.ApiBody "Internal Error"
-// @Router /plugins/bamboo/connections/{connectionId}/transformation_rules/{id} [GET]
-func GetTransformationRule(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) {
-	return trHelper.Get(input)
-}
-
-// GetTransformationRuleList return all transformation rules
-// @Summary return all transformation rules
-// @Description return all transformation rules
-// @Tags plugins/bamboo
-// @Param pageSize query int false "page size, default 50"
-// @Param page query int false "page size, default 1"
-// @Param connectionId path int true "connectionId"
-// @Success 200  {object} []models.BambooTransformationRule
-// @Failure 400  {object} shared.ApiBody "Bad Request"
-// @Failure 500  {object} shared.ApiBody "Internal Error"
-// @Router /plugins/bamboo/connections/{connectionId}/transformation_rules [GET]
-func GetTransformationRuleList(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) {
-	return trHelper.List(input)
-}
diff --git a/backend/plugins/bamboo/bamboo.go b/backend/plugins/bamboo/bamboo.go
index 72233823e..c89d0bc63 100644
--- a/backend/plugins/bamboo/bamboo.go
+++ b/backend/plugins/bamboo/bamboo.go
@@ -38,7 +38,7 @@ func main() {
 		runner.DirectRun(cmd, args, PluginEntry, map[string]interface{}{
 			"connectionId": *connectionId,
 			"projectKey":   *projectKey,
-			"transformationRules": map[string]string{
+			"scopeConfig": map[string]string{
 				"deploymentPattern": *deploymentPattern,
 				"productionPattern": *productionPattern,
 			},
diff --git a/backend/plugins/bamboo/e2e/deploy_build_test.go b/backend/plugins/bamboo/e2e/deploy_build_test.go
index e5ea6657a..8fac7a33e 100644
--- a/backend/plugins/bamboo/e2e/deploy_build_test.go
+++ b/backend/plugins/bamboo/e2e/deploy_build_test.go
@@ -36,7 +36,7 @@ func TestBambooDeployBuildDataFlow(t *testing.T) {
 		Options: &models.BambooOptions{
 			ConnectionId: 1,
 			ProjectKey:   "TEST1",
-			BambooTransformationRule: &models.BambooTransformationRule{
+			BambooScopeConfig: &models.BambooScopeConfig{
 				DeploymentPattern: "(?i)release",
 				ProductionPattern: "(?i)release",
 			},
diff --git a/backend/plugins/bamboo/e2e/deploy_test.go b/backend/plugins/bamboo/e2e/deploy_test.go
index 7d809a4e8..079043a94 100644
--- a/backend/plugins/bamboo/e2e/deploy_test.go
+++ b/backend/plugins/bamboo/e2e/deploy_test.go
@@ -31,9 +31,9 @@ func TestBambooDeployDataFlow(t *testing.T) {
 	dataflowTester := e2ehelper.NewDataFlowTester(t, "bamboo", bamboo)
 	taskData := &tasks.BambooTaskData{
 		Options: &models.BambooOptions{
-			ConnectionId:             3,
-			ProjectKey:               "TEST1",
-			BambooTransformationRule: new(models.BambooTransformationRule),
+			ConnectionId:      3,
+			ProjectKey:        "TEST1",
+			BambooScopeConfig: new(models.BambooScopeConfig),
 		},
 	}
 
diff --git a/backend/plugins/bamboo/e2e/job_build_test.go b/backend/plugins/bamboo/e2e/job_build_test.go
index 82677f2f5..1c8ef1c6c 100644
--- a/backend/plugins/bamboo/e2e/job_build_test.go
+++ b/backend/plugins/bamboo/e2e/job_build_test.go
@@ -37,7 +37,7 @@ func TestBambooJobBuildDataFlow(t *testing.T) {
 		Options: &models.BambooOptions{
 			ConnectionId: 3,
 			ProjectKey:   "TEST1",
-			BambooTransformationRule: &models.BambooTransformationRule{
+			BambooScopeConfig: &models.BambooScopeConfig{
 				DeploymentPattern: "(?i)compile",
 				ProductionPattern: "(?i)compile",
 			},
diff --git a/backend/plugins/bamboo/e2e/job_test.go b/backend/plugins/bamboo/e2e/job_test.go
index 7dab01e9a..c1a32db8c 100644
--- a/backend/plugins/bamboo/e2e/job_test.go
+++ b/backend/plugins/bamboo/e2e/job_test.go
@@ -35,7 +35,7 @@ func TestBambooJobDataFlow(t *testing.T) {
 		Options: &models.BambooOptions{
 			ConnectionId: 3,
 			ProjectKey:   "TEST1",
-			BambooTransformationRule: &models.BambooTransformationRule{
+			BambooScopeConfig: &models.BambooScopeConfig{
 				DeploymentPattern: "(?i)compile",
 				ProductionPattern: "(?i)compile",
 			},
diff --git a/backend/plugins/bamboo/e2e/plan_build_commits_test.go b/backend/plugins/bamboo/e2e/plan_build_commits_test.go
index cf695f845..35a40b42d 100644
--- a/backend/plugins/bamboo/e2e/plan_build_commits_test.go
+++ b/backend/plugins/bamboo/e2e/plan_build_commits_test.go
@@ -36,7 +36,7 @@ func TestBambooPlanBuildCommitsDataFlow(t *testing.T) {
 		Options: &models.BambooOptions{
 			ConnectionId: 3,
 			ProjectKey:   "TEST1",
-			BambooTransformationRule: &models.BambooTransformationRule{
+			BambooScopeConfig: &models.BambooScopeConfig{
 				DeploymentPattern: "(?i)compile",
 				ProductionPattern: "(?i)compile",
 			},
diff --git a/backend/plugins/bamboo/e2e/plan_build_test.go b/backend/plugins/bamboo/e2e/plan_build_test.go
index 5e1bd9d8d..775b668de 100644
--- a/backend/plugins/bamboo/e2e/plan_build_test.go
+++ b/backend/plugins/bamboo/e2e/plan_build_test.go
@@ -38,7 +38,7 @@ func TestBambooPlanBuildDataFlow(t *testing.T) {
 		Options: &models.BambooOptions{
 			ConnectionId: 3,
 			ProjectKey:   "TEST1",
-			BambooTransformationRule: &models.BambooTransformationRule{
+			BambooScopeConfig: &models.BambooScopeConfig{
 				DeploymentPattern: "(?i)compile",
 				ProductionPattern: "(?i)compile",
 			},
diff --git a/backend/plugins/bamboo/e2e/plan_test.go b/backend/plugins/bamboo/e2e/plan_test.go
index 648b46c45..361f27b42 100644
--- a/backend/plugins/bamboo/e2e/plan_test.go
+++ b/backend/plugins/bamboo/e2e/plan_test.go
@@ -33,9 +33,9 @@ func TestBambooPlanDataFlow(t *testing.T) {
 
 	taskData := &tasks.BambooTaskData{
 		Options: &models.BambooOptions{
-			ConnectionId:             3,
-			ProjectKey:               "TEST1",
-			BambooTransformationRule: new(models.BambooTransformationRule),
+			ConnectionId:      3,
+			ProjectKey:        "TEST1",
+			BambooScopeConfig: new(models.BambooScopeConfig),
 		},
 	}
 	// import raw data table
diff --git a/backend/plugins/bamboo/impl/impl.go b/backend/plugins/bamboo/impl/impl.go
index 499e81947..dc19f9e54 100644
--- a/backend/plugins/bamboo/impl/impl.go
+++ b/backend/plugins/bamboo/impl/impl.go
@@ -33,17 +33,15 @@ import (
 )
 
 // make sure interface is implemented
-var _ interface {
-	plugin.PluginMeta
-	plugin.PluginInit
-	plugin.PluginTask
-	plugin.PluginModel
-	plugin.PluginMigration
-	plugin.PluginBlueprintV100
-	plugin.DataSourcePluginBlueprintV200
-	plugin.CloseablePluginTask
-	plugin.PluginSource
-} = (*Bamboo)(nil)
+var _ plugin.PluginMeta = (*Bamboo)(nil)
+var _ plugin.PluginInit = (*Bamboo)(nil)
+var _ plugin.PluginTask = (*Bamboo)(nil)
+var _ plugin.PluginModel = (*Bamboo)(nil)
+var _ plugin.PluginMigration = (*Bamboo)(nil)
+var _ plugin.PluginBlueprintV100 = (*Bamboo)(nil)
+var _ plugin.DataSourcePluginBlueprintV200 = (*Bamboo)(nil)
+var _ plugin.CloseablePluginTask = (*Bamboo)(nil)
+var _ plugin.PluginSource = (*Bamboo)(nil)
 
 type Bamboo struct{}
 
@@ -60,7 +58,7 @@ func (p Bamboo) Scope() interface{} {
 	return nil
 }
 
-func (p Bamboo) TransformationRule() interface{} {
+func (p Bamboo) ScopeConfig() interface{} {
 	return nil
 }
 
@@ -150,26 +148,26 @@ func (p Bamboo) PrepareTaskData(taskCtx plugin.TaskContext, options map[string]i
 				return nil, err
 			}
 		}
-		op.TransformationRuleId = scope.TransformationRuleId
+		op.ScopeConfigId = scope.ScopeConfigId
 		if err != nil {
 			return nil, errors.Default.Wrap(err, fmt.Sprintf("fail to find project: %s", op.ProjectKey))
 		}
 	}
 
-	if op.BambooTransformationRule == nil && op.TransformationRuleId != 0 {
-		var transformationRule models.BambooTransformationRule
+	if op.BambooScopeConfig == nil && op.ScopeConfigId != 0 {
+		var scopeConfig models.BambooScopeConfig
 		db := taskCtx.GetDal()
-		err = db.First(&transformationRule, dal.Where("id = ?", op.TransformationRuleId))
+		err = db.First(&scopeConfig, dal.Where("id = ?", op.ScopeConfigId))
 		if err != nil {
 			if db.IsErrorNotFound(err) {
-				return nil, errors.Default.Wrap(err, fmt.Sprintf("can not find transformationRules by transformationRuleId [%d]", op.TransformationRuleId))
+				return nil, errors.Default.Wrap(err, fmt.Sprintf("can not find scopeConfig by scopeConfigId [%d]", op.ScopeConfigId))
 			}
-			return nil, errors.Default.Wrap(err, fmt.Sprintf("fail to find transformationRules by transformationRuleId [%d]", op.TransformationRuleId))
+			return nil, errors.Default.Wrap(err, fmt.Sprintf("fail to find scopeConfig by scopeConfigId [%d]", op.ScopeConfigId))
 		}
-		op.BambooTransformationRule = &transformationRule
+		op.BambooScopeConfig = &scopeConfig
 	}
-	if op.BambooTransformationRule == nil && op.TransformationRuleId == 0 {
-		op.BambooTransformationRule = new(models.BambooTransformationRule)
+	if op.BambooScopeConfig == nil && op.ScopeConfigId == 0 {
+		op.BambooScopeConfig = new(models.BambooScopeConfig)
 	}
 	regexEnricher := helper.NewRegexEnricher()
 	if err := regexEnricher.TryAdd(devops.DEPLOYMENT, op.DeploymentPattern); err != nil {
@@ -208,13 +206,13 @@ func (p Bamboo) ApiResources() map[string]map[string]plugin.ApiResourceHandler {
 			"PATCH":  api.PatchConnection,
 			"DELETE": api.DeleteConnection,
 		},
-		"connections/:connectionId/transformation_rules": {
-			"POST": api.CreateTransformationRule,
-			"GET":  api.GetTransformationRuleList,
+		"connections/:connectionId/scope_configs": {
+			"POST": api.CreateScopeConfig,
+			"GET":  api.GetScopeConfigList,
 		},
-		"connections/:connectionId/transformation_rules/:id": {
-			"PATCH": api.UpdateTransformationRule,
-			"GET":   api.GetTransformationRule,
+		"connections/:connectionId/scope_configs/:id": {
+			"PATCH": api.UpdateScopeConfig,
+			"GET":   api.GetScopeConfig,
 		},
 		"connections/:connectionId/scopes": {
 			"GET": api.GetScopeList,
diff --git a/backend/plugins/bamboo/models/migrationscripts/20230322_add_connection_id_to_transformation_rules.go b/backend/plugins/bamboo/models/migrationscripts/20230322_add_connection_id_to_transformation_rules.go
index a72397df0..95d637750 100644
--- a/backend/plugins/bamboo/models/migrationscripts/20230322_add_connection_id_to_transformation_rules.go
+++ b/backend/plugins/bamboo/models/migrationscripts/20230322_add_connection_id_to_transformation_rules.go
@@ -22,7 +22,7 @@ import (
 	"github.com/apache/incubator-devlake/core/dal"
 	"github.com/apache/incubator-devlake/core/errors"
 	"github.com/apache/incubator-devlake/helpers/migrationhelper"
-	"github.com/apache/incubator-devlake/plugins/bamboo/models"
+	"github.com/apache/incubator-devlake/plugins/bamboo/models/migrationscripts/archived"
 )
 
 type addConnectionIdToTransformationRule struct{}
@@ -39,7 +39,7 @@ func (u *addConnectionIdToTransformationRule) Up(baseRes context.BasicRes) error
 	if err != nil {
 		return err
 	}
-	var scopes []models.BambooProject
+	var scopes []archived.BambooProject
 	err = baseRes.GetDal().All(&scopes)
 	if err != nil {
 		return err
@@ -54,14 +54,14 @@ func (u *addConnectionIdToTransformationRule) Up(baseRes context.BasicRes) error
 	// set connection_id for rules
 	for trId, cId := range idMap {
 		err = baseRes.GetDal().UpdateColumn(
-			&models.BambooTransformationRule{}, "connection_id", cId,
+			&archived.BambooTransformationRule{}, "connection_id", cId,
 			dal.Where("id = ?", trId))
 		if err != nil {
 			return err
 		}
 	}
 	// delete all rules that are not referenced.
-	return baseRes.GetDal().Delete(&models.BambooTransformationRule{}, dal.Where("connection_id = ? OR connection_id = ?", nil, 0))
+	return baseRes.GetDal().Delete(&archived.BambooTransformationRule{}, dal.Where("connection_id = ? OR connection_id = ?", nil, 0))
 }
 
 func (*addConnectionIdToTransformationRule) Version() uint64 {
diff --git a/backend/plugins/bamboo/models/migrationscripts/20230518_scope_config.go b/backend/plugins/bamboo/models/migrationscripts/20230518_scope_config.go
new file mode 100644
index 000000000..847a5a0fd
--- /dev/null
+++ b/backend/plugins/bamboo/models/migrationscripts/20230518_scope_config.go
@@ -0,0 +1,56 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package migrationscripts
+
+import (
+	"github.com/apache/incubator-devlake/core/context"
+	"github.com/apache/incubator-devlake/core/errors"
+	"github.com/apache/incubator-devlake/helpers/migrationhelper"
+)
+
+type renameTr2ScopeConfig struct {
+}
+
+type scopeConfig20230518 struct {
+	Entities []string `gorm:"type:json" json:"entities"`
+}
+
+func (scopeConfig20230518) TableName() string {
+	return "_tool_bamboo_scope_configs"
+}
+
+func (u *renameTr2ScopeConfig) Up(baseRes context.BasicRes) errors.Error {
+	db := baseRes.GetDal()
+	err := db.RenameColumn("_tool_bamboo_projects", "transformation_rule_id", "scope_config_id")
+	if err != nil {
+		return err
+	}
+	err = db.RenameTable("_tool_bamboo_transformation_rules", "_tool_bamboo_scope_configs")
+	if err != nil {
+		return err
+	}
+	return migrationhelper.AutoMigrateTables(baseRes, &scopeConfig20230518{})
+}
+
+func (*renameTr2ScopeConfig) Version() uint64 {
+	return 20230518141352
+}
+
+func (*renameTr2ScopeConfig) Name() string {
+	return "rename transformation rule to scope config"
+}
diff --git a/backend/plugins/bamboo/models/migrationscripts/register.go b/backend/plugins/bamboo/models/migrationscripts/register.go
index 1d63cccba..a8b234e29 100644
--- a/backend/plugins/bamboo/models/migrationscripts/register.go
+++ b/backend/plugins/bamboo/models/migrationscripts/register.go
@@ -27,5 +27,6 @@ func All() []plugin.MigrationScript {
 		new(addInitTables),
 		new(addConnectionIdToTransformationRule),
 		new(addTypeAndEnvironment),
+		new(renameTr2ScopeConfig),
 	}
 }
diff --git a/backend/plugins/bamboo/models/project.go b/backend/plugins/bamboo/models/project.go
index 56fe9879d..d7b745eea 100644
--- a/backend/plugins/bamboo/models/project.go
+++ b/backend/plugins/bamboo/models/project.go
@@ -19,6 +19,7 @@ package models
 
 import (
 	"encoding/json"
+
 	"github.com/apache/incubator-devlake/core/models/common"
 	"github.com/apache/incubator-devlake/core/plugin"
 	"github.com/apache/incubator-devlake/helpers/pluginhelper/api"
@@ -29,14 +30,14 @@ var _ plugin.ApiGroup = (*api.NoRemoteGroupResponse)(nil)
 var _ plugin.ApiScope = (*ApiBambooProject)(nil)
 
 type BambooProject struct {
-	ConnectionId         uint64 `json:"connectionId" mapstructure:"connectionId" validate:"required" gorm:"primaryKey"`
-	ProjectKey           string `json:"projectKey" gorm:"primaryKey;type:varchar(256)" validate:"required"`
-	TransformationRuleId uint64 `json:"transformationRuleId,omitempty" mapstructure:"transformationRuleId"`
-	Name                 string `json:"name" gorm:"index;type:varchar(256)"`
-	Description          string `json:"description"`
-	Href                 string `json:"link"`
-	Rel                  string `json:"rel" gorm:"type:varchar(100)"`
-	common.NoPKModel     `json:"-" mapstructure:"-"`
+	ConnectionId     uint64 `json:"connectionId" mapstructure:"connectionId" validate:"required" gorm:"primaryKey"`
+	ProjectKey       string `json:"projectKey" gorm:"primaryKey;type:varchar(256)" validate:"required"`
+	ScopeConfigId    uint64 `json:"scopeConfigId,omitempty" mapstructure:"scopeConfigId"`
+	Name             string `json:"name" gorm:"index;type:varchar(256)"`
+	Description      string `json:"description"`
+	Href             string `json:"link"`
+	Rel              string `json:"rel" gorm:"type:varchar(100)"`
+	common.NoPKModel `json:"-" mapstructure:"-"`
 }
 
 func (p BambooProject) ScopeId() string {
diff --git a/backend/plugins/bamboo/models/transformation_rule.go b/backend/plugins/bamboo/models/scope_config.go
similarity index 74%
rename from backend/plugins/bamboo/models/transformation_rule.go
rename to backend/plugins/bamboo/models/scope_config.go
index d4be4e9a5..66d424303 100644
--- a/backend/plugins/bamboo/models/transformation_rule.go
+++ b/backend/plugins/bamboo/models/scope_config.go
@@ -22,16 +22,16 @@ import (
 	"gorm.io/datatypes"
 )
 
-type BambooTransformationRule struct {
-	common.Model
-	ConnectionId uint64 `mapstructure:"connectionId" json:"connectionId"`
-	Name         string `gorm:"type:varchar(255);index:idx_name_gitlab,unique" validate:"required" mapstructure:"name" json:"name"`
+type BambooScopeConfig struct {
+	common.ScopeConfig `mapstructure:",squash" json:",inline" gorm:"embedded"`
+	ConnectionId       uint64 `mapstructure:"connectionId" json:"connectionId"`
+	Name               string `gorm:"type:varchar(255);index:idx_name_gitlab,unique" validate:"required" mapstructure:"name" json:"name"`
 	// should be {realRepoName: [bamboo_repoId]}
 	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)"`
 }
 
-func (BambooTransformationRule) TableName() string {
-	return "_tool_bamboo_transformation_rules"
+func (BambooScopeConfig) TableName() string {
+	return "_tool_bamboo_scope_configs"
 }
diff --git a/backend/plugins/bamboo/models/task.go b/backend/plugins/bamboo/models/task.go
index 827f37110..84dc69648 100644
--- a/backend/plugins/bamboo/models/task.go
+++ b/backend/plugins/bamboo/models/task.go
@@ -27,9 +27,9 @@ type BambooOptions struct {
 	// options means some custom params required by plugin running.
 	// Such As How many rows do your want
 	// You can use it in sub tasks and you need pass it in main.go and pipelines.
-	ConnectionId              uint64   `json:"connectionId"`
-	ProjectKey                string   `json:"projectKey"`
-	Tasks                     []string `json:"tasks,omitempty"`
-	TransformationRuleId      uint64   `mapstructure:"transformationRuleId" json:"transformationRuleId"`
-	*BambooTransformationRule `mapstructure:"transformationRules" json:"transformationRules"`
+	ConnectionId       uint64   `json:"connectionId"`
+	ProjectKey         string   `json:"projectKey"`
+	Tasks              []string `json:"tasks,omitempty"`
+	ScopeConfigId      uint64   `mapstructure:"scopeConfigId" json:"scopeConfigId"`
+	*BambooScopeConfig `mapstructure:"scopeConfig" json:"scopeConfig"`
 }
diff --git a/backend/plugins/bamboo/tasks/deploy_build_extractor.go b/backend/plugins/bamboo/tasks/deploy_build_extractor.go
index 7c8da8e7f..01022c312 100644
--- a/backend/plugins/bamboo/tasks/deploy_build_extractor.go
+++ b/backend/plugins/bamboo/tasks/deploy_build_extractor.go
@@ -31,7 +31,6 @@ var _ plugin.SubTaskEntryPoint = ExtractDeployBuild
 
 func ExtractDeployBuild(taskCtx plugin.SubTaskContext) errors.Error {
 	rawDataSubTaskArgs, data := CreateRawDataSubTaskArgs(taskCtx, RAW_DEPLOY_BUILD_TABLE)
-	//repoMap := getRepoMap(data.Options.BambooTransformationRule.RepoMap)
 	extractor, err := helper.NewApiExtractor(helper.ApiExtractorArgs{
 		RawDataSubTaskArgs: *rawDataSubTaskArgs,
 
diff --git a/backend/plugins/bamboo/tasks/job_build_extractor.go b/backend/plugins/bamboo/tasks/job_build_extractor.go
index 6d6608297..2cca09dc9 100644
--- a/backend/plugins/bamboo/tasks/job_build_extractor.go
+++ b/backend/plugins/bamboo/tasks/job_build_extractor.go
@@ -32,7 +32,6 @@ var _ plugin.SubTaskEntryPoint = ExtractJobBuild
 
 func ExtractJobBuild(taskCtx plugin.SubTaskContext) errors.Error {
 	rawDataSubTaskArgs, data := CreateRawDataSubTaskArgs(taskCtx, RAW_JOB_BUILD_TABLE)
-	//repoMap := getRepoMap(data.Options.BambooTransformationRule.RepoMap)
 	extractor, err := helper.NewApiExtractor(helper.ApiExtractorArgs{
 		RawDataSubTaskArgs: *rawDataSubTaskArgs,
 
diff --git a/backend/server/services/remote/plugin/plugin_extensions.go b/backend/server/services/remote/plugin/plugin_extensions.go
index 538e50f38..73cc68220 100644
--- a/backend/server/services/remote/plugin/plugin_extensions.go
+++ b/backend/server/services/remote/plugin/plugin_extensions.go
@@ -69,7 +69,8 @@ func (p remoteDatasourcePlugin) MakeDataSourcePipelinePlanV200(connectionId uint
 		toolScopeTxRulePairs[i] = []interface{}{wrappedToolScope.Unwrap(), txRule}
 	}
 
-	entities := bpScopes[0].Entities
+	// TODO: @camille: no need to pass the entities separately as they are already in the scope config (tx rule)
+	entities := []string{}
 
 	plan_data := models.PipelineData{}
 	err = p.invoker.Call("make-pipeline", bridge.DefaultContext, toolScopeTxRulePairs, entities, connection.Unwrap()).Get(&plan_data)