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 273209edc refactor: use plan rather than project as bamboo scope 
(#5771)
273209edc is described below

commit 273209edc8a664ed5a814e1bd586f757ac3b7bd5
Author: Liang Zhang <[email protected]>
AuthorDate: Mon Jul 31 18:46:52 2023 +0800

    refactor: use plan rather than project as bamboo scope (#5771)
    
    * refactor: use plan rather than project as bamboo scope
    
    * fix: add ScopeFullName methor to BambooPlan
    
    * fix: lint error
    
    * fix: case issue of scopes API
    
    * fix: the lint error
    
    * fix: e2e test
    
    * fix: e2e test
---
 backend/plugins/bamboo/api/blueprint_V200_test.go  |  20 +--
 backend/plugins/bamboo/api/blueprint_v200.go       |   4 +-
 backend/plugins/bamboo/api/connection.go           |   3 +
 backend/plugins/bamboo/api/init.go                 |  16 +--
 backend/plugins/bamboo/api/remote.go               |  78 +++++------
 backend/plugins/bamboo/api/scope.go                |  57 ++++----
 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       |   6 +-
 backend/plugins/bamboo/e2e/job_test.go             |   4 +-
 .../plugins/bamboo/e2e/plan_build_commits_test.go  |   4 +-
 backend/plugins/bamboo/e2e/plan_build_test.go      |   5 +-
 backend/plugins/bamboo/e2e/plan_test.go            |  40 ++----
 .../e2e/raw_tables/_raw_bamboo_api_deploy.csv      |   8 +-
 .../raw_tables/_raw_bamboo_api_deploy_build.csv    |  18 +--
 .../bamboo/e2e/raw_tables/_raw_bamboo_api_job.csv  |   8 +-
 .../e2e/raw_tables/_raw_bamboo_api_job_build.csv   |  13 +-
 .../bamboo/e2e/raw_tables/_raw_bamboo_api_plan.csv |   5 -
 .../e2e/raw_tables/_raw_bamboo_api_plan_build.csv  |  13 +-
 .../snapshot_tables/_tool_bamboo_deploy_build.csv  |  18 +--
 .../_tool_bamboo_deploy_environment.csv            |  10 +-
 .../snapshot_tables/_tool_bamboo_job_builds.csv    |  11 +-
 .../_tool_bamboo_job_builds_no_prod_env.csv        |  11 +-
 .../e2e/snapshot_tables/_tool_bamboo_jobs.csv      |   5 +-
 .../_tool_bamboo_plan_build_commits.csv            |   4 +-
 .../snapshot_tables/_tool_bamboo_plan_builds.csv   |  11 +-
 .../e2e/snapshot_tables/_tool_bamboo_plans.csv     |   5 +-
 .../e2e/snapshot_tables/cicd_pipeline_commits.csv  |   4 +-
 .../bamboo/e2e/snapshot_tables/cicd_pipelines.csv  |  11 +-
 .../bamboo/e2e/snapshot_tables/cicd_scopes.csv     |   2 +
 .../bamboo/e2e/snapshot_tables/cicd_tasks.csv      |  11 +-
 .../e2e/snapshot_tables/cicd_tasks_deploy.csv      |  18 +--
 backend/plugins/bamboo/impl/impl.go                |  36 ++---
 backend/plugins/bamboo/models/deploy_build.go      |   2 +-
 ...er.go => 20230725_add_scopeConfigId_to_plan.go} |  33 +++--
 .../bamboo/models/migrationscripts/register.go     |   1 +
 backend/plugins/bamboo/models/plan.go              | 152 +++++++++++++--------
 backend/plugins/bamboo/models/project.go           | 118 ----------------
 backend/plugins/bamboo/models/task.go              |   4 +-
 .../plugins/bamboo/tasks/deploy_build_collector.go |   7 +-
 .../plugins/bamboo/tasks/deploy_build_convertor.go |   6 +-
 .../plugins/bamboo/tasks/deploy_build_extractor.go |   2 +-
 backend/plugins/bamboo/tasks/deploy_extractor.go   |  53 ++-----
 .../plugins/bamboo/tasks/job_build_collector.go    |   2 +-
 .../plugins/bamboo/tasks/job_build_convertor.go    |   9 +-
 .../plugins/bamboo/tasks/job_build_extractor.go    |   3 +-
 backend/plugins/bamboo/tasks/job_collector.go      |  31 +----
 backend/plugins/bamboo/tasks/job_extractor.go      |   8 +-
 .../plugins/bamboo/tasks/plan_build_collector.go   |  31 +----
 .../plugins/bamboo/tasks/plan_build_convertor.go   |   9 +-
 .../plugins/bamboo/tasks/plan_build_extractor.go   |   8 +-
 backend/plugins/bamboo/tasks/plan_collector.go     |  83 -----------
 .../plugins/bamboo/tasks/plan_commit_convertor.go  |   2 +-
 .../{project_convertor.go => plan_convertor.go}    |  39 +++---
 backend/plugins/bamboo/tasks/plan_extractor.go     |  61 ---------
 backend/plugins/bamboo/tasks/shared.go             |   2 +-
 56 files changed, 369 insertions(+), 764 deletions(-)

diff --git a/backend/plugins/bamboo/api/blueprint_V200_test.go 
b/backend/plugins/bamboo/api/blueprint_V200_test.go
index ce74bd2b7..113a5e738 100644
--- a/backend/plugins/bamboo/api/blueprint_V200_test.go
+++ b/backend/plugins/bamboo/api/blueprint_V200_test.go
@@ -40,7 +40,7 @@ func TestMakeDataSourcePipelinePlanV200(t *testing.T) {
        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 testLink string = 
"http://mail.nddtf.com:8085/rest/api/latest/plan/TEST";
        const testUser string = "username"
        const testPass string = "password"
        const testName string = "bamboo-test"
@@ -55,9 +55,9 @@ func TestMakeDataSourcePipelinePlanV200(t *testing.T) {
                },
        }
 
-       var testBambooProject = &models.BambooProject{
+       var testBambooPlan = &models.BambooPlan{
                ConnectionId: testConnectionID,
-               ProjectKey:   testKey,
+               PlanKey:      testKey,
                Name:         testName,
                Href:         testLink,
 
@@ -94,10 +94,10 @@ func TestMakeDataSourcePipelinePlanV200(t *testing.T) {
                },
        }
 
-       var expectRepoId = "bamboo:BambooProject:1:TEST"
+       var expectRepoId = "bamboo:BambooPlan:1:TEST"
 
        var testSubTaskMeta = []plugin.SubTaskMeta{
-               tasks.ConvertProjectsMeta,
+               tasks.ConvertPlansMeta,
        }
 
        var expectPlans = plugin.PipelinePlan{
@@ -105,11 +105,11 @@ func TestMakeDataSourcePipelinePlanV200(t *testing.T) {
                        {
                                Plugin: "bamboo",
                                Subtasks: []string{
-                                       tasks.ConvertProjectsMeta.Name,
+                                       tasks.ConvertPlansMeta.Name,
                                },
                                Options: map[string]interface{}{
                                        "connectionId":  uint64(1),
-                                       "projectKey":    testKey,
+                                       "planKey":       testKey,
                                        "scopeConfigId": testScopeConfigId,
                                },
                        },
@@ -136,9 +136,9 @@ func TestMakeDataSourcePipelinePlanV200(t *testing.T) {
                        *dst = *testBambooConnection
                }).Return(nil)
 
-               mockDal.On("First", 
mock.AnythingOfType("*models.BambooProject"), mock.Anything).Run(func(args 
mock.Arguments) {
-                       dst := args.Get(0).(*models.BambooProject)
-                       *dst = *testBambooProject
+               mockDal.On("First", mock.AnythingOfType("*models.BambooPlan"), 
mock.Anything).Run(func(args mock.Arguments) {
+                       dst := args.Get(0).(*models.BambooPlan)
+                       *dst = *testBambooPlan
                }).Return(nil)
 
                mockDal.On("First", 
mock.AnythingOfType("*models.BambooScopeConfig"), mock.Anything).Run(func(args 
mock.Arguments) {
diff --git a/backend/plugins/bamboo/api/blueprint_v200.go 
b/backend/plugins/bamboo/api/blueprint_v200.go
index 88e2d7476..2c5429c31 100644
--- a/backend/plugins/bamboo/api/blueprint_v200.go
+++ b/backend/plugins/bamboo/api/blueprint_v200.go
@@ -61,7 +61,7 @@ func makeScopeV200(connectionId uint64, scopes 
[]*plugin.BlueprintScopeV200) ([]
        sc := make([]plugin.Scope, 0, len(scopes))
 
        for _, scope := range scopes {
-               id := 
didgen.NewDomainIdGenerator(&models.BambooProject{}).Generate(connectionId, 
scope.Id)
+               id := 
didgen.NewDomainIdGenerator(&models.BambooPlan{}).Generate(connectionId, 
scope.Id)
 
                // get project from db
                project, scopeConfig, err := 
scopeHelper.DbHelper().GetScopeAndConfig(connectionId, scope.Id)
@@ -98,7 +98,7 @@ func makePipelinePlanV200(
                // bamboo main part
                options := make(map[string]interface{})
                options["connectionId"] = connection.ID
-               options["projectKey"] = scope.Id
+               options["planKey"] = scope.Id
                options["scopeConfigId"] = scopeConfig.ID
 
                // construct subtasks
diff --git a/backend/plugins/bamboo/api/connection.go 
b/backend/plugins/bamboo/api/connection.go
index 5e6f8f893..91df4cefe 100644
--- a/backend/plugins/bamboo/api/connection.go
+++ b/backend/plugins/bamboo/api/connection.go
@@ -89,6 +89,7 @@ func PostConnections(input *plugin.ApiResourceInput) 
(*plugin.ApiResourceOutput,
 // @Description Patch bamboo connection
 // @Tags plugins/bamboo
 // @Param body body models.BambooConnection true "json body"
+// @Param connectionId path int true "connection ID"
 // @Success 200  {object} models.BambooConnection
 // @Failure 400  {string} errcode.Error "Bad Request"
 // @Failure 500  {string} errcode.Error "Internel Error"
@@ -105,6 +106,7 @@ func PatchConnection(input *plugin.ApiResourceInput) 
(*plugin.ApiResourceOutput,
 // @Summary delete a bamboo connection
 // @Description Delete a bamboo connection
 // @Tags plugins/bamboo
+// @Param connectionId path int true "connection ID"
 // @Success 200  {object} models.BambooConnection
 // @Failure 400  {string} errcode.Error "Bad Request"
 // @Failure 409  {object} services.BlueprintProjectPairs "References exist to 
this connection"
@@ -133,6 +135,7 @@ func ListConnections(input *plugin.ApiResourceInput) 
(*plugin.ApiResourceOutput,
 // @Summary get bamboo connection detail
 // @Description Get bamboo connection detail
 // @Tags plugins/bamboo
+// @Param connectionId path int true "connection ID"
 // @Success 200  {object} models.BambooConnection
 // @Failure 400  {string} errcode.Error "Bad Request"
 // @Failure 500  {string} errcode.Error "Internel Error"
diff --git a/backend/plugins/bamboo/api/init.go 
b/backend/plugins/bamboo/api/init.go
index 3122788a3..91b151f45 100644
--- a/backend/plugins/bamboo/api/init.go
+++ b/backend/plugins/bamboo/api/init.go
@@ -27,8 +27,8 @@ import (
 
 var vld *validator.Validate
 var connectionHelper *api.ConnectionApiHelper
-var scopeHelper *api.ScopeApiHelper[models.BambooConnection, 
models.BambooProject, models.BambooScopeConfig]
-var remoteHelper *api.RemoteApiHelper[models.BambooConnection, 
models.BambooProject, models.ApiBambooProject, api.NoRemoteGroupResponse]
+var scopeHelper *api.ScopeApiHelper[models.BambooConnection, 
models.BambooPlan, models.BambooScopeConfig]
+var remoteHelper *api.RemoteApiHelper[models.BambooConnection, 
models.BambooPlan, models.ApiBambooPlan, api.NoRemoteGroupResponse]
 var scopeConfigHelper *api.ScopeConfigHelper[models.BambooScopeConfig]
 
 var basicRes context.BasicRes
@@ -43,20 +43,20 @@ func Init(br context.BasicRes, p plugin.PluginMeta) {
                p.Name(),
        )
        params := &api.ReflectionParameters{
-               ScopeIdFieldName:  "ProjectKey",
-               ScopeIdColumnName: "project_key",
-               RawScopeParamName: "ProjectKey",
+               ScopeIdFieldName:  "PlanKey",
+               ScopeIdColumnName: "plan_key",
+               RawScopeParamName: "PlanKey",
        }
-       scopeHelper = api.NewScopeHelper[models.BambooConnection, 
models.BambooProject, models.BambooScopeConfig](
+       scopeHelper = api.NewScopeHelper[models.BambooConnection, 
models.BambooPlan, models.BambooScopeConfig](
                basicRes,
                vld,
                connectionHelper,
-               api.NewScopeDatabaseHelperImpl[models.BambooConnection, 
models.BambooProject, models.BambooScopeConfig](
+               api.NewScopeDatabaseHelperImpl[models.BambooConnection, 
models.BambooPlan, models.BambooScopeConfig](
                        basicRes, connectionHelper, params),
                params,
                nil,
        )
-       remoteHelper = api.NewRemoteHelper[models.BambooConnection, 
models.BambooProject, models.ApiBambooProject, api.NoRemoteGroupResponse](
+       remoteHelper = api.NewRemoteHelper[models.BambooConnection, 
models.BambooPlan, models.ApiBambooPlan, api.NoRemoteGroupResponse](
                basicRes,
                vld,
                connectionHelper,
diff --git a/backend/plugins/bamboo/api/remote.go 
b/backend/plugins/bamboo/api/remote.go
index 7e1e8bbfe..54174c7cc 100644
--- a/backend/plugins/bamboo/api/remote.go
+++ b/backend/plugins/bamboo/api/remote.go
@@ -24,9 +24,7 @@ import (
        "github.com/apache/incubator-devlake/core/errors"
        "github.com/apache/incubator-devlake/core/plugin"
        "github.com/apache/incubator-devlake/helpers/pluginhelper/api"
-       aha 
"github.com/apache/incubator-devlake/helpers/pluginhelper/api/apihelperabstract"
        "github.com/apache/incubator-devlake/plugins/bamboo/models"
-       "net/http"
        "net/url"
 )
 
@@ -43,28 +41,7 @@ import (
 // @Failure 500  {object} shared.ApiBody "Internal Error"
 // @Router /plugins/bamboo/connections/{connectionId}/remote-scopes [GET]
 func RemoteScopes(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, 
errors.Error) {
-       return remoteHelper.GetScopesFromRemote(input,
-               nil,
-               func(basicRes context2.BasicRes, gid string, queryData 
*api.RemoteQueryData, connection models.BambooConnection) 
([]models.ApiBambooProject, errors.Error) {
-                       query := initialQuery(queryData)
-                       // create api client
-                       apiClient, err := 
api.NewApiClientFromConnection(context.TODO(), basicRes, &connection)
-                       if err != nil {
-                               return nil, err
-                       }
-                       res, err := apiClient.Get("/project.json", query, nil)
-
-                       if err != nil {
-                               return nil, err
-                       }
-
-                       resBody := models.ApiBambooProjectResponse{}
-                       err = api.UnmarshalResponse(res, &resBody)
-                       if err != nil {
-                               return nil, err
-                       }
-                       return resBody.Projects.Projects, err
-               })
+       return remoteHelper.GetScopesFromRemote(input, nil, getRemotePlans)
 }
 
 // SearchRemoteScopes use the Search API and only return project
@@ -82,7 +59,7 @@ func RemoteScopes(input *plugin.ApiResourceInput) 
(*plugin.ApiResourceOutput, er
 // @Router /plugins/bamboo/connections/{connectionId}/search-remote-scopes 
[GET]
 func SearchRemoteScopes(input *plugin.ApiResourceInput) 
(*plugin.ApiResourceOutput, errors.Error) {
        return remoteHelper.SearchRemoteScopes(input,
-               func(basicRes context2.BasicRes, queryData 
*api.RemoteQueryData, connection models.BambooConnection) 
([]models.ApiBambooProject, errors.Error) {
+               func(basicRes context2.BasicRes, queryData 
*api.RemoteQueryData, connection models.BambooConnection) 
([]models.ApiBambooPlan, errors.Error) {
                        apiClient, err := 
api.NewApiClientFromConnection(context.TODO(), basicRes, &connection)
                        if err != nil {
                                return nil, errors.BadInput.Wrap(err, "failed 
to get create apiClient")
@@ -90,26 +67,21 @@ func SearchRemoteScopes(input *plugin.ApiResourceInput) 
(*plugin.ApiResourceOutp
                        query := initialQuery(queryData)
                        query.Set("searchTerm", queryData.Search[0])
                        // request search
-                       res, err := apiClient.Get("search/projects.json", 
query, nil)
+                       res, err := apiClient.Get("search/plans.json", query, 
nil)
                        if err != nil {
                                return nil, err
                        }
-                       resBody := models.ApiBambooSearchProjectResponse{}
+                       resBody := models.ApiBambooSearchPlanResponse{}
                        err = api.UnmarshalResponse(res, &resBody)
                        if err != nil {
                                return nil, err
                        }
-                       var apiBambooProjects []models.ApiBambooProject
+                       var apiBambooPlans []models.ApiBambooPlan
                        // append project to output
                        for _, apiResult := range resBody.SearchResults {
-                               apiProject, err := 
GetApiProject(apiResult.SearchEntity.Key, apiClient)
-                               if err != nil {
-                                       return nil, err
-                               }
-
-                               apiBambooProjects = append(apiBambooProjects, 
*apiProject)
+                               apiBambooPlans = append(apiBambooPlans, 
apiResult.Entity)
                        }
-                       return apiBambooProjects, err
+                       return apiBambooPlans, err
                })
 }
 
@@ -121,23 +93,35 @@ func initialQuery(queryData *api.RemoteQueryData) 
url.Values {
        return query
 }
 
-// move from blueprint_v200 because of cycle import
-func GetApiProject(
-       projectKey string,
-       apiClient aha.ApiClientAbstract,
-) (*models.ApiBambooProject, errors.Error) {
-       projectRes := &models.ApiBambooProject{}
-       res, err := apiClient.Get(fmt.Sprintf("project/%s.json", projectKey), 
nil, nil)
+func getRemotePlans(basicRes context2.BasicRes, gid string, queryData 
*api.RemoteQueryData, connection models.BambooConnection) 
([]models.ApiBambooPlan, errors.Error) {
+       query := initialQuery(queryData)
+       // create api client
+       apiClient, err := api.NewApiClientFromConnection(context.TODO(), 
basicRes, &connection)
+       if err != nil {
+               return nil, err
+       }
+       res, err := apiClient.Get("plan.json", query, nil)
+
        if err != nil {
                return nil, err
        }
-       defer res.Body.Close()
-       if res.StatusCode != http.StatusOK {
-               return nil, 
errors.HttpStatus(res.StatusCode).New(fmt.Sprintf("unexpected status code when 
requesting project detail from %s", res.Request.URL.String()))
+       var planRes struct {
+               Expand string `json:"expand"`
+               Link   struct {
+                       Href string `json:"href"`
+                       Rel  string `json:"rel"`
+               } `json:"link"`
+               Plans struct {
+                       Size       int                    `json:"size"`
+                       Expand     string                 `json:"expand"`
+                       StartIndex int                    `json:"start-index"`
+                       MaxResult  int                    `json:"max-result"`
+                       Plan       []models.ApiBambooPlan `json:"plan"`
+               } `json:"plans"`
        }
-       err = api.UnmarshalResponse(res, projectRes)
+       err = api.UnmarshalResponse(res, &planRes)
        if err != nil {
                return nil, err
        }
-       return projectRes, nil
+       return planRes.Plans.Plan, err
 }
diff --git a/backend/plugins/bamboo/api/scope.go 
b/backend/plugins/bamboo/api/scope.go
index beffd29fa..526e98ec9 100644
--- a/backend/plugins/bamboo/api/scope.go
+++ b/backend/plugins/bamboo/api/scope.go
@@ -20,25 +20,22 @@ package api
 import (
        "github.com/apache/incubator-devlake/core/errors"
        "github.com/apache/incubator-devlake/core/plugin"
-       "github.com/apache/incubator-devlake/helpers/pluginhelper/api"
        "github.com/apache/incubator-devlake/plugins/bamboo/models"
 )
 
-type ScopeRes struct {
-       models.BambooProject
-       api.ScopeResDoc[models.BambooScopeConfig]
+// nolint
+type scopeReq struct {
+       Data []models.BambooPlan `json:"data"`
 }
 
-type ScopeReq api.ScopeReq[models.BambooProject]
-
-// PutScope create or update bamboo project
-// @Summary create or update bamboo project
-// @Description Create or update bamboo project
+// PutScope create or update bamboo plan
+// @Summary create or update bamboo plan
+// @Description Create or update bamboo plan
 // @Tags plugins/bamboo
 // @Accept application/json
-// @Param connectionId path int false "connection ID"
-// @Param scope body ScopeReq true "json"
-// @Success 200  {object} []models.BambooProject
+// @Param connectionId path int true "connection ID"
+// @Param scope body scopeReq true "json"
+// @Success 200  {object} models.BambooPlan
 // @Failure 400  {object} shared.ApiBody "Bad Request"
 // @Failure 500  {object} shared.ApiBody "Internal Error"
 // @Router /plugins/bamboo/connections/{connectionId}/scopes [PUT]
@@ -46,15 +43,15 @@ func PutScope(input *plugin.ApiResourceInput) 
(*plugin.ApiResourceOutput, errors
        return scopeHelper.Put(input)
 }
 
-// UpdateScope patch to bamboo project
-// @Summary patch to bamboo project
-// @Description patch to bamboo project
+// UpdateScope patch to bamboo plan
+// @Summary patch to bamboo plan
+// @Description patch to bamboo plan
 // @Tags plugins/bamboo
 // @Accept application/json
-// @Param connectionId path int false "connection ID"
-// @Param scopeId path int false "project ID"
-// @Param scope body models.BambooProject true "json"
-// @Success 200  {object} models.BambooProject
+// @Param connectionId path int true "connection ID"
+// @Param scopeId path int true "plan key"
+// @Param scope body models.BambooPlan true "json"
+// @Success 200  {object} models.BambooPlan
 // @Failure 400  {object} shared.ApiBody "Bad Request"
 // @Failure 500  {object} shared.ApiBody "Internal Error"
 // @Router /plugins/bamboo/connections/{connectionId}/scopes/{scopeId} [PATCH]
@@ -62,14 +59,14 @@ func UpdateScope(input *plugin.ApiResourceInput) 
(*plugin.ApiResourceOutput, err
        return scopeHelper.Update(input)
 }
 
-// GetScopeList get Bamboo projects
-// @Summary get Bamboo projects
-// @Description get Bamboo projects
+// GetScopeList get Bamboo plans
+// @Summary get Bamboo plans
+// @Description get Bamboo plans
 // @Tags plugins/bamboo
-// @Param connectionId path int false "connection ID"
+// @Param connectionId path int true "connection ID"
 // @Param searchTerm query string false "search term for scope name"
 // @Param blueprints query bool false "also return blueprints using these 
scopes as part of the payload"
-// @Success 200  {object} []ScopeRes
+// @Success 200  {object} []models.BambooPlan
 // @Failure 400  {object} shared.ApiBody "Bad Request"
 // @Failure 500  {object} shared.ApiBody "Internal Error"
 // @Router /plugins/bamboo/connections/{connectionId}/scopes/ [GET]
@@ -77,15 +74,15 @@ func GetScopeList(input *plugin.ApiResourceInput) 
(*plugin.ApiResourceOutput, er
        return scopeHelper.GetScopeList(input)
 }
 
-// GetScope get one Bamboo project
-// @Summary get one Bamboo project
-// @Description get one Bamboo project
+// GetScope get one Bamboo plan
+// @Summary get one Bamboo plan
+// @Description get one Bamboo plan
 // @Tags plugins/bamboo
-// @Param connectionId path int false "connection ID"
-// @Param scopeId path int false "project ID"
+// @Param connectionId path int true "connection ID"
+// @Param scopeId path int true "plan key"
 // @Param pageSize query int false "page size, default 50"
 // @Param page query int false "page size, default 1"
-// @Success 200  {object} ScopeRes
+// @Success 200  {object} models.BambooPlan
 // @Failure 400  {object} shared.ApiBody "Bad Request"
 // @Failure 500  {object} shared.ApiBody "Internal Error"
 // @Router /plugins/bamboo/connections/{connectionId}/scopes/{scopeId} [GET]
diff --git a/backend/plugins/bamboo/e2e/deploy_build_test.go 
b/backend/plugins/bamboo/e2e/deploy_build_test.go
index 8fac7a33e..b3c913b95 100644
--- a/backend/plugins/bamboo/e2e/deploy_build_test.go
+++ b/backend/plugins/bamboo/e2e/deploy_build_test.go
@@ -35,7 +35,7 @@ func TestBambooDeployBuildDataFlow(t *testing.T) {
        taskData := &tasks.BambooTaskData{
                Options: &models.BambooOptions{
                        ConnectionId: 1,
-                       ProjectKey:   "TEST1",
+                       PlanKey:      "TEST1",
                        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 079043a94..44f34c1df 100644
--- a/backend/plugins/bamboo/e2e/deploy_test.go
+++ b/backend/plugins/bamboo/e2e/deploy_test.go
@@ -31,8 +31,8 @@ func TestBambooDeployDataFlow(t *testing.T) {
        dataflowTester := e2ehelper.NewDataFlowTester(t, "bamboo", bamboo)
        taskData := &tasks.BambooTaskData{
                Options: &models.BambooOptions{
-                       ConnectionId:      3,
-                       ProjectKey:        "TEST1",
+                       ConnectionId:      1,
+                       PlanKey:           "TEST1",
                        BambooScopeConfig: new(models.BambooScopeConfig),
                },
        }
@@ -40,7 +40,7 @@ func TestBambooDeployDataFlow(t *testing.T) {
        // import raw data table
        
dataflowTester.ImportCsvIntoRawTable("./raw_tables/_raw_bamboo_api_deploy.csv", 
"_raw_bamboo_api_deploy")
        // it need import plan data
-       
dataflowTester.ImportCsvIntoTabler("./raw_tables/_tool_bamboo_plans_for_deploy.csv",
 models.BambooPlan{})
+       
//dataflowTester.ImportCsvIntoTabler("./raw_tables/_tool_bamboo_plans_for_deploy.csv",
 models.BambooPlan{})
 
        // verify extraction
        dataflowTester.FlushTabler(&models.BambooDeployEnvironment{})
diff --git a/backend/plugins/bamboo/e2e/job_build_test.go 
b/backend/plugins/bamboo/e2e/job_build_test.go
index 1c8ef1c6c..9d03705f0 100644
--- a/backend/plugins/bamboo/e2e/job_build_test.go
+++ b/backend/plugins/bamboo/e2e/job_build_test.go
@@ -35,8 +35,8 @@ func TestBambooJobBuildDataFlow(t *testing.T) {
        dataflowTester := e2ehelper.NewDataFlowTester(t, "bamboo", bamboo)
        taskData := &tasks.BambooTaskData{
                Options: &models.BambooOptions{
-                       ConnectionId: 3,
-                       ProjectKey:   "TEST1",
+                       ConnectionId: 1,
+                       PlanKey:      "TEST-PLA3",
                        BambooScopeConfig: &models.BambooScopeConfig{
                                DeploymentPattern: "(?i)compile",
                                ProductionPattern: "(?i)compile",
@@ -51,7 +51,7 @@ func TestBambooJobBuildDataFlow(t *testing.T) {
 
        // verify env when production regex is not set
        dataflowTester.FlushTabler(&models.BambooJobBuild{})
-       dataflowTester.Subtask(tasks.ExtractJobBuildMeta, taskData)
+       dataflowTester.FlushTabler(&models.BambooPlanBuildVcsRevision{})
        dataflowTester.Subtask(tasks.ExtractJobBuildMeta, taskData)
        dataflowTester.VerifyTable(
                models.BambooJobBuild{},
diff --git a/backend/plugins/bamboo/e2e/job_test.go 
b/backend/plugins/bamboo/e2e/job_test.go
index c1a32db8c..ee224191d 100644
--- a/backend/plugins/bamboo/e2e/job_test.go
+++ b/backend/plugins/bamboo/e2e/job_test.go
@@ -33,8 +33,8 @@ func TestBambooJobDataFlow(t *testing.T) {
 
        taskData := &tasks.BambooTaskData{
                Options: &models.BambooOptions{
-                       ConnectionId: 3,
-                       ProjectKey:   "TEST1",
+                       ConnectionId: 1,
+                       PlanKey:      "TEST-PLA1",
                        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 35a40b42d..73adc7c7e 100644
--- a/backend/plugins/bamboo/e2e/plan_build_commits_test.go
+++ b/backend/plugins/bamboo/e2e/plan_build_commits_test.go
@@ -34,8 +34,8 @@ func TestBambooPlanBuildCommitsDataFlow(t *testing.T) {
 
        taskData := &tasks.BambooTaskData{
                Options: &models.BambooOptions{
-                       ConnectionId: 3,
-                       ProjectKey:   "TEST1",
+                       ConnectionId: 1,
+                       PlanKey:      "TEST-PLA3",
                        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 775b668de..d0d197e5b 100644
--- a/backend/plugins/bamboo/e2e/plan_build_test.go
+++ b/backend/plugins/bamboo/e2e/plan_build_test.go
@@ -36,8 +36,8 @@ func TestBambooPlanBuildDataFlow(t *testing.T) {
 
        taskData := &tasks.BambooTaskData{
                Options: &models.BambooOptions{
-                       ConnectionId: 3,
-                       ProjectKey:   "TEST1",
+                       ConnectionId: 1,
+                       PlanKey:      "TEST-PLA3",
                        BambooScopeConfig: &models.BambooScopeConfig{
                                DeploymentPattern: "(?i)compile",
                                ProductionPattern: "(?i)compile",
@@ -53,6 +53,7 @@ func TestBambooPlanBuildDataFlow(t *testing.T) {
 
        // verify extraction
        dataflowTester.FlushTabler(&models.BambooPlanBuild{})
+       dataflowTester.FlushTabler(&models.BambooPlanBuildVcsRevision{})
        dataflowTester.Subtask(tasks.ExtractPlanBuildMeta, taskData)
        dataflowTester.VerifyTable(
                models.BambooPlanBuild{},
diff --git a/backend/plugins/bamboo/e2e/plan_test.go 
b/backend/plugins/bamboo/e2e/plan_test.go
index 361f27b42..a8757081a 100644
--- a/backend/plugins/bamboo/e2e/plan_test.go
+++ b/backend/plugins/bamboo/e2e/plan_test.go
@@ -20,6 +20,8 @@ package e2e
 import (
        "testing"
 
+       "github.com/apache/incubator-devlake/core/models/common"
+       "github.com/apache/incubator-devlake/core/models/domainlayer/devops"
        "github.com/apache/incubator-devlake/helpers/e2ehelper"
        "github.com/apache/incubator-devlake/plugins/bamboo/impl"
        "github.com/apache/incubator-devlake/plugins/bamboo/models"
@@ -34,39 +36,17 @@ func TestBambooPlanDataFlow(t *testing.T) {
        taskData := &tasks.BambooTaskData{
                Options: &models.BambooOptions{
                        ConnectionId:      3,
-                       ProjectKey:        "TEST1",
+                       PlanKey:           "TEST1",
                        BambooScopeConfig: new(models.BambooScopeConfig),
                },
        }
-       // import raw data table
-       
dataflowTester.ImportCsvIntoRawTable("./raw_tables/_raw_bamboo_api_plan.csv", 
"_raw_bamboo_api_plan")
 
+       
dataflowTester.ImportCsvIntoTabler("./snapshot_tables/_tool_bamboo_plans.csv", 
models.BambooPlan{})
        // verify extraction
-       dataflowTester.FlushTabler(&models.BambooPlan{})
-       dataflowTester.Subtask(tasks.ExtractPlanMeta, taskData)
-       dataflowTester.VerifyTable(
-               models.BambooPlan{},
-               "./snapshot_tables/_tool_bamboo_plans.csv",
-               e2ehelper.ColumnWithRawData(
-                       "connection_id",
-                       "plan_key",
-                       "name",
-                       "expand",
-                       "project_key",
-                       "project_name",
-                       "description",
-                       "short_name",
-                       "build_name",
-                       "short_key",
-                       "type",
-                       "enabled",
-                       "href",
-                       "rel",
-                       "is_favourite",
-                       "is_active",
-                       "is_building",
-                       "average_build_time_in_seconds",
-               ),
-       )
-
+       dataflowTester.FlushTabler(&devops.CicdScope{})
+       dataflowTester.Subtask(tasks.ConvertPlansMeta, taskData)
+       dataflowTester.VerifyTableWithOptions(&devops.CicdScope{}, 
e2ehelper.TableOptions{
+               CSVRelPath:  "./snapshot_tables/cicd_scopes.csv",
+               IgnoreTypes: []interface{}{common.NoPKModel{}},
+       })
 }
diff --git a/backend/plugins/bamboo/e2e/raw_tables/_raw_bamboo_api_deploy.csv 
b/backend/plugins/bamboo/e2e/raw_tables/_raw_bamboo_api_deploy.csv
index 6f6bf318f..bdf9134dc 100644
--- a/backend/plugins/bamboo/e2e/raw_tables/_raw_bamboo_api_deploy.csv
+++ b/backend/plugins/bamboo/e2e/raw_tables/_raw_bamboo_api_deploy.csv
@@ -1,5 +1,5 @@
 "id","params","data","url","input","created_at"
-39,"{""connectionId"":3,""ProjectKey"":""TEST1""}","{""id"":884737,""oid"":""q3067ilzvtvl"",""key"":{""key"":""884737""},""name"":""deploy-test"",""planKey"":{""key"":""TEST1-TEST1""},""description"":""a
 test deployment 
project."",""environments"":[{""id"":950273,""key"":{""key"":""884737-950273""},""name"":""test-env"",""description"":""a
 test 
environment"",""deploymentProjectId"":884737,""operations"":{""canView"":true,""canEdit"":true,""canDelete"":true,""allowedToExecute"":true,""can
 [...]
-40,"{""connectionId"":3,""ProjectKey"":""TEST1""}","{""id"":1146881,""oid"":""q3067ilzvuo1"",""key"":{""key"":""1146881""},""name"":""deploy-test2"",""planKey"":{""key"":""TEST1-TEST2""},""description"":""other
 test deployment 
project."",""environments"":[],""operations"":{""canView"":true,""canEdit"":true,""canDelete"":true,""allowedToExecute"":false,""canExecute"":false,""allowedToCreateVersion"":true,""allowedToSetVersionStatus"":false}}","http://18.212.108.64:8085/rest/api/latest/dep
 [...]
-41,"{""connectionId"":3,""ProjectKey"":""TEST1""}","{""id"":1146882,""oid"":""q3067ilzvuo2"",""key"":{""key"":""1146882""},""name"":""deploy-test3"",""planKey"":{""key"":""TEST1-TEST3""},""description"":""other
 test deployment project 
again."",""environments"":[{""id"":1310721,""key"":{""key"":""1146882-1310721""},""name"":""environment2"",""description"":""other
 test 
environment"",""deploymentProjectId"":1146882,""operations"":{""canView"":true,""canEdit"":true,""canDelete"":true,""allo
 [...]
-42,"{""connectionId"":3,""ProjectKey"":""TEST1""}","{""id"":1146883,""oid"":""q3067ilzvuo3"",""key"":{""key"":""1146883""},""name"":""deploy-test4"",""planKey"":{""key"":""TEST2-TEST1""},""description"":"""",""environments"":[{""id"":1310726,""key"":{""key"":""1146883-1310726""},""name"":""environment-for_p2"",""description"":"""",""deploymentProjectId"":1146883,""operations"":{""canView"":true,""canEdit"":true,""canDelete"":true,""allowedToExecute"":true,""canExecute"":true,""allowedToC
 [...]
+39,"{""connectionId"":1,""PlanKey"":""TEST1""}","{""id"":884737,""oid"":""q3067ilzvtvl"",""key"":{""key"":""884737""},""name"":""deploy-test"",""planKey"":{""key"":""TEST1""},""description"":""a
 test deployment 
project."",""environments"":[{""id"":950273,""key"":{""key"":""884737-950273""},""name"":""test-env"",""description"":""a
 test 
environment"",""deploymentProjectId"":884737,""operations"":{""canView"":true,""canEdit"":true,""canDelete"":true,""allowedToExecute"":true,""canExecute""
 [...]
+40,"{""connectionId"":1,""PlanKey"":""TEST1""}","{""id"":1146881,""oid"":""q3067ilzvuo1"",""key"":{""key"":""1146881""},""name"":""deploy-test2"",""planKey"":{""key"":""TEST1-TEST2""},""description"":""other
 test deployment 
project."",""environments"":[],""operations"":{""canView"":true,""canEdit"":true,""canDelete"":true,""allowedToExecute"":false,""canExecute"":false,""allowedToCreateVersion"":true,""allowedToSetVersionStatus"":false}}","http://18.212.108.64:8085/rest/api/latest/deploy
 [...]
+41,"{""connectionId"":1,""PlanKey"":""TEST1""}","{""id"":1146882,""oid"":""q3067ilzvuo2"",""key"":{""key"":""1146882""},""name"":""deploy-test3"",""planKey"":{""key"":""TEST1-TEST3""},""description"":""other
 test deployment project 
again."",""environments"":[{""id"":1310721,""key"":{""key"":""1146882-1310721""},""name"":""environment2"",""description"":""other
 test 
environment"",""deploymentProjectId"":1146882,""operations"":{""canView"":true,""canEdit"":true,""canDelete"":true,""allowed
 [...]
+42,"{""connectionId"":1,""PlanKey"":""TEST1""}","{""id"":1146883,""oid"":""q3067ilzvuo3"",""key"":{""key"":""1146883""},""name"":""deploy-test4"",""planKey"":{""key"":""TEST2-TEST1""},""description"":"""",""environments"":[{""id"":1310726,""key"":{""key"":""1146883-1310726""},""name"":""environment-for_p2"",""description"":"""",""deploymentProjectId"":1146883,""operations"":{""canView"":true,""canEdit"":true,""canDelete"":true,""allowedToExecute"":true,""canExecute"":true,""allowedToCrea
 [...]
diff --git 
a/backend/plugins/bamboo/e2e/raw_tables/_raw_bamboo_api_deploy_build.csv 
b/backend/plugins/bamboo/e2e/raw_tables/_raw_bamboo_api_deploy_build.csv
index bbf1f05b5..cea03e0d0 100644
--- a/backend/plugins/bamboo/e2e/raw_tables/_raw_bamboo_api_deploy_build.csv
+++ b/backend/plugins/bamboo/e2e/raw_tables/_raw_bamboo_api_deploy_build.csv
@@ -1,10 +1,10 @@
 "id","params","data","url","input","created_at"
-1,"{""connectionId"":1,""ProjectKey"":""TEST1""}","{""deploymentVersion"":{""id"":1671170,""name"":""release-3"",""creationDate"":1678451437024,""creatorUserName"":""bamboo"",""items"":[],""operations"":{""canView"":true,""canEdit"":true,""canDelete"":true,""allowedToExecute"":false,""canExecute"":false,""allowedToCreateVersion"":true,""allowedToSetVersionStatus"":true},""creatorDisplayName"":""devlake"",""creatorGravatarUrl"":""https://secure.gravatar.com/avatar/324e7f96b867d04ccf353fe0
 [...]
-2,"{""connectionId"":1,""ProjectKey"":""TEST1""}","{""deploymentVersion"":{""id"":1671170,""name"":""release-3"",""creationDate"":1678451437024,""creatorUserName"":""bamboo"",""items"":[],""operations"":{""canView"":true,""canEdit"":true,""canDelete"":true,""allowedToExecute"":false,""canExecute"":false,""allowedToCreateVersion"":true,""allowedToSetVersionStatus"":true},""creatorDisplayName"":""devlake"",""creatorGravatarUrl"":""https://secure.gravatar.com/avatar/324e7f96b867d04ccf353fe0
 [...]
-3,"{""connectionId"":1,""ProjectKey"":""TEST1""}","{""deploymentVersion"":{""id"":983041,""name"":""release-1"",""creationDate"":1676989673661,""creatorUserName"":""bamboo"",""items"":[],""operations"":{""canView"":true,""canEdit"":true,""canDelete"":true,""allowedToExecute"":false,""canExecute"":false,""allowedToCreateVersion"":true,""allowedToSetVersionStatus"":true},""creatorDisplayName"":""devlake"",""creatorGravatarUrl"":""https://secure.gravatar.com/avatar/324e7f96b867d04ccf353fe0f
 [...]
-4,"{""connectionId"":1,""ProjectKey"":""TEST1""}","{""deploymentVersion"":{""id"":983041,""name"":""release-1"",""creationDate"":1676989673661,""creatorUserName"":""bamboo"",""items"":[],""operations"":{""canView"":true,""canEdit"":true,""canDelete"":true,""allowedToExecute"":false,""canExecute"":false,""allowedToCreateVersion"":true,""allowedToSetVersionStatus"":true},""creatorDisplayName"":""devlake"",""creatorGravatarUrl"":""https://secure.gravatar.com/avatar/324e7f96b867d04ccf353fe0f
 [...]
-5,"{""connectionId"":1,""ProjectKey"":""TEST1""}","{""deploymentVersion"":{""id"":1671169,""name"":""release-2"",""creationDate"":1678418543376,""creatorUserName"":""bamboo"",""items"":[],""operations"":{""canView"":true,""canEdit"":true,""canDelete"":true,""allowedToExecute"":false,""canExecute"":false,""allowedToCreateVersion"":true,""allowedToSetVersionStatus"":true},""creatorDisplayName"":""devlake"",""creatorGravatarUrl"":""https://secure.gravatar.com/avatar/324e7f96b867d04ccf353fe0
 [...]
-6,"{""connectionId"":1,""ProjectKey"":""TEST1""}","{""deploymentVersion"":{""id"":1671169,""name"":""release-2"",""creationDate"":1678418543376,""creatorUserName"":""bamboo"",""items"":[],""operations"":{""canView"":true,""canEdit"":true,""canDelete"":true,""allowedToExecute"":false,""canExecute"":false,""allowedToCreateVersion"":true,""allowedToSetVersionStatus"":true},""creatorDisplayName"":""devlake"",""creatorGravatarUrl"":""https://secure.gravatar.com/avatar/324e7f96b867d04ccf353fe0
 [...]
-7,"{""connectionId"":1,""ProjectKey"":""TEST1""}","{""deploymentVersion"":{""id"":1671169,""name"":""release-2"",""creationDate"":1678418543376,""creatorUserName"":""bamboo"",""items"":[],""operations"":{""canView"":true,""canEdit"":true,""canDelete"":true,""allowedToExecute"":false,""canExecute"":false,""allowedToCreateVersion"":true,""allowedToSetVersionStatus"":true},""creatorDisplayName"":""devlake"",""creatorGravatarUrl"":""https://secure.gravatar.com/avatar/324e7f96b867d04ccf353fe0
 [...]
-8,"{""connectionId"":1,""ProjectKey"":""TEST1""}","{""deploymentVersion"":{""id"":1671169,""name"":""release-2"",""creationDate"":1678418543376,""creatorUserName"":""bamboo"",""items"":[],""operations"":{""canView"":true,""canEdit"":true,""canDelete"":true,""allowedToExecute"":false,""canExecute"":false,""allowedToCreateVersion"":true,""allowedToSetVersionStatus"":true},""creatorDisplayName"":""devlake"",""creatorGravatarUrl"":""https://secure.gravatar.com/avatar/324e7f96b867d04ccf353fe0
 [...]
-9,"{""connectionId"":1,""ProjectKey"":""TEST1""}","{""deploymentVersion"":{""id"":1671169,""name"":""release-2"",""creationDate"":1678418543376,""creatorUserName"":""bamboo"",""items"":[],""operations"":{""canView"":true,""canEdit"":true,""canDelete"":true,""allowedToExecute"":false,""canExecute"":false,""allowedToCreateVersion"":true,""allowedToSetVersionStatus"":true},""creatorDisplayName"":""devlake"",""creatorGravatarUrl"":""https://secure.gravatar.com/avatar/324e7f96b867d04ccf353fe0
 [...]
\ No newline at end of file
+1,"{""connectionId"":1,""PlanKey"":""TEST1""}","{""deploymentVersion"":{""id"":1671170,""name"":""release-3"",""creationDate"":1678451437024,""creatorUserName"":""bamboo"",""items"":[],""operations"":{""canView"":true,""canEdit"":true,""canDelete"":true,""allowedToExecute"":false,""canExecute"":false,""allowedToCreateVersion"":true,""allowedToSetVersionStatus"":true},""creatorDisplayName"":""devlake"",""creatorGravatarUrl"":""https://secure.gravatar.com/avatar/324e7f96b867d04ccf353fe0fb4
 [...]
+2,"{""connectionId"":1,""PlanKey"":""TEST1""}","{""deploymentVersion"":{""id"":1671170,""name"":""release-3"",""creationDate"":1678451437024,""creatorUserName"":""bamboo"",""items"":[],""operations"":{""canView"":true,""canEdit"":true,""canDelete"":true,""allowedToExecute"":false,""canExecute"":false,""allowedToCreateVersion"":true,""allowedToSetVersionStatus"":true},""creatorDisplayName"":""devlake"",""creatorGravatarUrl"":""https://secure.gravatar.com/avatar/324e7f96b867d04ccf353fe0fb4
 [...]
+3,"{""connectionId"":1,""PlanKey"":""TEST1""}","{""deploymentVersion"":{""id"":983041,""name"":""release-1"",""creationDate"":1676989673661,""creatorUserName"":""bamboo"",""items"":[],""operations"":{""canView"":true,""canEdit"":true,""canDelete"":true,""allowedToExecute"":false,""canExecute"":false,""allowedToCreateVersion"":true,""allowedToSetVersionStatus"":true},""creatorDisplayName"":""devlake"",""creatorGravatarUrl"":""https://secure.gravatar.com/avatar/324e7f96b867d04ccf353fe0fb41
 [...]
+4,"{""connectionId"":1,""PlanKey"":""TEST1""}","{""deploymentVersion"":{""id"":983041,""name"":""release-1"",""creationDate"":1676989673661,""creatorUserName"":""bamboo"",""items"":[],""operations"":{""canView"":true,""canEdit"":true,""canDelete"":true,""allowedToExecute"":false,""canExecute"":false,""allowedToCreateVersion"":true,""allowedToSetVersionStatus"":true},""creatorDisplayName"":""devlake"",""creatorGravatarUrl"":""https://secure.gravatar.com/avatar/324e7f96b867d04ccf353fe0fb41
 [...]
+5,"{""connectionId"":1,""PlanKey"":""TEST1""}","{""deploymentVersion"":{""id"":1671169,""name"":""release-2"",""creationDate"":1678418543376,""creatorUserName"":""bamboo"",""items"":[],""operations"":{""canView"":true,""canEdit"":true,""canDelete"":true,""allowedToExecute"":false,""canExecute"":false,""allowedToCreateVersion"":true,""allowedToSetVersionStatus"":true},""creatorDisplayName"":""devlake"",""creatorGravatarUrl"":""https://secure.gravatar.com/avatar/324e7f96b867d04ccf353fe0fb4
 [...]
+6,"{""connectionId"":1,""PlanKey"":""TEST1""}","{""deploymentVersion"":{""id"":1671169,""name"":""release-2"",""creationDate"":1678418543376,""creatorUserName"":""bamboo"",""items"":[],""operations"":{""canView"":true,""canEdit"":true,""canDelete"":true,""allowedToExecute"":false,""canExecute"":false,""allowedToCreateVersion"":true,""allowedToSetVersionStatus"":true},""creatorDisplayName"":""devlake"",""creatorGravatarUrl"":""https://secure.gravatar.com/avatar/324e7f96b867d04ccf353fe0fb4
 [...]
+7,"{""connectionId"":1,""PlanKey"":""TEST1""}","{""deploymentVersion"":{""id"":1671169,""name"":""release-2"",""creationDate"":1678418543376,""creatorUserName"":""bamboo"",""items"":[],""operations"":{""canView"":true,""canEdit"":true,""canDelete"":true,""allowedToExecute"":false,""canExecute"":false,""allowedToCreateVersion"":true,""allowedToSetVersionStatus"":true},""creatorDisplayName"":""devlake"",""creatorGravatarUrl"":""https://secure.gravatar.com/avatar/324e7f96b867d04ccf353fe0fb4
 [...]
+8,"{""connectionId"":1,""PlanKey"":""TEST1""}","{""deploymentVersion"":{""id"":1671169,""name"":""release-2"",""creationDate"":1678418543376,""creatorUserName"":""bamboo"",""items"":[],""operations"":{""canView"":true,""canEdit"":true,""canDelete"":true,""allowedToExecute"":false,""canExecute"":false,""allowedToCreateVersion"":true,""allowedToSetVersionStatus"":true},""creatorDisplayName"":""devlake"",""creatorGravatarUrl"":""https://secure.gravatar.com/avatar/324e7f96b867d04ccf353fe0fb4
 [...]
+9,"{""connectionId"":1,""PlanKey"":""TEST1""}","{""deploymentVersion"":{""id"":1671169,""name"":""release-2"",""creationDate"":1678418543376,""creatorUserName"":""bamboo"",""items"":[],""operations"":{""canView"":true,""canEdit"":true,""canDelete"":true,""allowedToExecute"":false,""canExecute"":false,""allowedToCreateVersion"":true,""allowedToSetVersionStatus"":true},""creatorDisplayName"":""devlake"",""creatorGravatarUrl"":""https://secure.gravatar.com/avatar/324e7f96b867d04ccf353fe0fb4
 [...]
\ No newline at end of file
diff --git a/backend/plugins/bamboo/e2e/raw_tables/_raw_bamboo_api_job.csv 
b/backend/plugins/bamboo/e2e/raw_tables/_raw_bamboo_api_job.csv
index 0ad94c146..bcac31058 100644
--- a/backend/plugins/bamboo/e2e/raw_tables/_raw_bamboo_api_job.csv
+++ b/backend/plugins/bamboo/e2e/raw_tables/_raw_bamboo_api_job.csv
@@ -1,5 +1,5 @@
 "id","params","data","url","input","created_at"
-7,"{""connectionId"":3,""ProjectKey"":""TEST1""}","{""id"":""TEST1-TEST1-JOB1"",""type"":""job"",""searchEntity"":{""id"":""TEST1-TEST1-JOB1"",""key"":""TEST1-TEST1-JOB1"",""projectName"":""test_project"",""planName"":""test_plan"",""branchName"":""Default"",""stageName"":""Default
 Stage"",""jobName"":""Default Job"",""description"":""just a test 
plan"",""type"":""job""}}","http://54.172.92.89:8085/rest/api/latest/search/jobs/TEST1-TEST1.json?expand=jobs.job&max-result=100&showEmpty=true
 [...]
-8,"{""connectionId"":3,""ProjectKey"":""TEST1""}","{""id"":""TEST1-TEST2-JOB1"",""type"":""job"",""searchEntity"":{""id"":""TEST1-TEST2-JOB1"",""key"":""TEST1-TEST2-JOB1"",""projectName"":""test_project"",""planName"":""test2"",""branchName"":""Default"",""stageName"":""Default
 Stage"",""jobName"":""Default Job"",""description"":""description 
plan2"",""type"":""job""}}","http://54.172.92.89:8085/rest/api/latest/search/jobs/TEST1-TEST2.json?expand=jobs.job&max-result=100&showEmpty=true&st
 [...]
-9,"{""connectionId"":3,""ProjectKey"":""TEST1""}","{""id"":""TEST1-TEST3-JOB1"",""type"":""job"",""searchEntity"":{""id"":""TEST1-TEST3-JOB1"",""key"":""TEST1-TEST3-JOB1"",""projectName"":""test_project"",""planName"":""test3"",""branchName"":""Default"",""stageName"":""Default
 Stage"",""jobName"":""Default Job"",""description"":""description 
plan23"",""type"":""job""}}","http://54.172.92.89:8085/rest/api/latest/search/jobs/TEST1-TEST3.json?expand=jobs.job&max-result=100&showEmpty=true&s
 [...]
-10,"{""connectionId"":3,""ProjectKey"":""TEST1""}","{""id"":""TEST1-TEST4-JOB1"",""type"":""job"",""searchEntity"":{""id"":""TEST1-TEST4-JOB1"",""key"":""TEST1-TEST4-JOB1"",""projectName"":""test_project"",""planName"":""test4"",""branchName"":""Default"",""stageName"":""Default
 Stage"",""jobName"":""Default Job"",""description"":""description 
plan4"",""type"":""job""}}","http://54.172.92.89:8085/rest/api/latest/search/jobs/TEST1-TEST4.json?expand=jobs.job&max-result=100&showEmpty=true&s
 [...]
+1,"{""connectionId"":1,""PlanKey"":""TEST-PLA1""}","{""id"":""TEST-PLA1-JOB1"",""type"":""job"",""searchEntity"":{""id"":""TEST-PLA1-JOB1"",""key"":""TEST-PLA1-JOB1"",""projectName"":""test"",""planName"":""pla-1"",""branchName"":""main"",""stageName"":""Default
 Stage"",""jobName"":""Default 
Job"",""description"":"""",""type"":""job""}}","http://18.232.129.138:8085/rest/api/latest/search/jobs/TEST-PLA1.json?expand=jobs.job&max-result=100&showEmpty=true&start-index=0","null","2023-07-27
 2 [...]
+2,"{""connectionId"":1,""PlanKey"":""TEST-PLA2""}","{""id"":""TEST-PLA2-AJ"",""type"":""job"",""searchEntity"":{""id"":""TEST-PLA2-AJ"",""key"":""TEST-PLA2-AJ"",""projectName"":""test"",""planName"":""pla-2"",""branchName"":""main"",""stageName"":""Default
 Stage"",""jobName"":""Another 
Job"",""description"":"""",""type"":""job""}}","http://18.232.129.138:8085/rest/api/latest/search/jobs/TEST-PLA2.json?expand=jobs.job&max-result=100&showEmpty=true&start-index=0","null","2023-07-27
 22:37:25.834"
+3,"{""connectionId"":1,""PlanKey"":""TEST-PLA2""}","{""id"":""TEST-PLA2-JOB1"",""type"":""job"",""searchEntity"":{""id"":""TEST-PLA2-JOB1"",""key"":""TEST-PLA2-JOB1"",""projectName"":""test"",""planName"":""pla-2"",""branchName"":""main"",""stageName"":""Default
 Stage"",""jobName"":""Default 
Job"",""description"":"""",""type"":""job""}}","http://18.232.129.138:8085/rest/api/latest/search/jobs/TEST-PLA2.json?expand=jobs.job&max-result=100&showEmpty=true&start-index=0","null","2023-07-27
 2 [...]
+4,"{""connectionId"":1,""PlanKey"":""TEST-PLA3""}","{""id"":""TEST-PLA3-JOB1"",""type"":""job"",""searchEntity"":{""id"":""TEST-PLA3-JOB1"",""key"":""TEST-PLA3-JOB1"",""projectName"":""test"",""planName"":""pla-3"",""branchName"":""main"",""stageName"":""Default
 Stage"",""jobName"":""Default 
Job"",""description"":"""",""type"":""job""}}","http://18.232.129.138:8085/rest/api/latest/search/jobs/TEST-PLA3.json?expand=jobs.job&max-result=100&showEmpty=true&start-index=0","null","2023-07-27
 2 [...]
diff --git 
a/backend/plugins/bamboo/e2e/raw_tables/_raw_bamboo_api_job_build.csv 
b/backend/plugins/bamboo/e2e/raw_tables/_raw_bamboo_api_job_build.csv
index c202e2d05..19c32e46f 100644
--- a/backend/plugins/bamboo/e2e/raw_tables/_raw_bamboo_api_job_build.csv
+++ b/backend/plugins/bamboo/e2e/raw_tables/_raw_bamboo_api_job_build.csv
@@ -1,10 +1,3 @@
-"id","params","data","url","input","created_at"
-122,"{""connectionId"":3,""ProjectKey"":""TEST1""}","{""expand"":""plan,artifacts,comments,labels,jiraIssues,variables"",""link"":{""href"":""http://54.172.92.89:8085/rest/api/latest/result/TEST1-TEST2-JOB1-3"",""rel"":""self""},""plan"":{""shortName"":""Default
 
Job"",""shortKey"":""TEST2-JOB1"",""type"":""job"",""enabled"":true,""link"":{""href"":""http://54.172.92.89:8085/rest/api/latest/plan/TEST1-TEST2-JOB1"",""rel"":""self""},""key"":""TEST1-TEST2-JOB1"",""name"":""test_project
 - te [...]
-123,"{""connectionId"":3,""ProjectKey"":""TEST1""}","{""expand"":""plan,artifacts,comments,labels,jiraIssues,variables"",""link"":{""href"":""http://54.172.92.89:8085/rest/api/latest/result/TEST1-TEST2-JOB1-2"",""rel"":""self""},""plan"":{""shortName"":""Default
 
Job"",""shortKey"":""TEST2-JOB1"",""type"":""job"",""enabled"":true,""link"":{""href"":""http://54.172.92.89:8085/rest/api/latest/plan/TEST1-TEST2-JOB1"",""rel"":""self""},""key"":""TEST1-TEST2-JOB1"",""name"":""test_project
 - te [...]
-137,"{""connectionId"":3,""ProjectKey"":""TEST1""}","{""expand"":""plan,artifacts,comments,labels,jiraIssues,variables"",""link"":{""href"":""http://54.172.92.89:8085/rest/api/latest/result/TEST1-TEST4-JOB1-3"",""rel"":""self""},""plan"":{""shortName"":""Default
 
Job"",""shortKey"":""TEST4-JOB1"",""type"":""job"",""enabled"":true,""link"":{""href"":""http://54.172.92.89:8085/rest/api/latest/plan/TEST1-TEST4-JOB1"",""rel"":""self""},""key"":""TEST1-TEST4-JOB1"",""name"":""test_project
 - te [...]
-138,"{""connectionId"":3,""ProjectKey"":""TEST1""}","{""expand"":""plan,artifacts,comments,labels,jiraIssues,variables"",""link"":{""href"":""http://54.172.92.89:8085/rest/api/latest/result/TEST1-TEST4-JOB1-2"",""rel"":""self""},""plan"":{""shortName"":""Default
 
Job"",""shortKey"":""TEST4-JOB1"",""type"":""job"",""enabled"":true,""link"":{""href"":""http://54.172.92.89:8085/rest/api/latest/plan/TEST1-TEST4-JOB1"",""rel"":""self""},""key"":""TEST1-TEST4-JOB1"",""name"":""test_project
 - te [...]
-139,"{""connectionId"":3,""ProjectKey"":""TEST1""}","{""expand"":""plan,artifacts,comments,labels,jiraIssues,variables"",""link"":{""href"":""http://54.172.92.89:8085/rest/api/latest/result/TEST1-TEST4-JOB1-1"",""rel"":""self""},""plan"":{""shortName"":""Default
 
Job"",""shortKey"":""TEST4-JOB1"",""type"":""job"",""enabled"":true,""link"":{""href"":""http://54.172.92.89:8085/rest/api/latest/plan/TEST1-TEST4-JOB1"",""rel"":""self""},""key"":""TEST1-TEST4-JOB1"",""name"":""test_project
 - te [...]
-153,"{""connectionId"":3,""ProjectKey"":""TEST1""}","{""expand"":""plan,artifacts,comments,labels,jiraIssues,variables"",""link"":{""href"":""http://54.172.92.89:8085/rest/api/latest/result/TEST1-TEST3-JOB1-3"",""rel"":""self""},""plan"":{""shortName"":""Default
 
Job"",""shortKey"":""TEST3-JOB1"",""type"":""job"",""enabled"":true,""link"":{""href"":""http://54.172.92.89:8085/rest/api/latest/plan/TEST1-TEST3-JOB1"",""rel"":""self""},""key"":""TEST1-TEST3-JOB1"",""name"":""test_project
 - te [...]
-154,"{""connectionId"":3,""ProjectKey"":""TEST1""}","{""expand"":""plan,artifacts,comments,labels,jiraIssues,variables"",""link"":{""href"":""http://54.172.92.89:8085/rest/api/latest/result/TEST1-TEST3-JOB1-2"",""rel"":""self""},""plan"":{""shortName"":""Default
 
Job"",""shortKey"":""TEST3-JOB1"",""type"":""job"",""enabled"":true,""link"":{""href"":""http://54.172.92.89:8085/rest/api/latest/plan/TEST1-TEST3-JOB1"",""rel"":""self""},""key"":""TEST1-TEST3-JOB1"",""name"":""test_project
 - te [...]
-198,"{""connectionId"":3,""ProjectKey"":""TEST1""}","{""expand"":""plan,artifacts,comments,labels,jiraIssues,variables"",""link"":{""href"":""http://54.172.92.89:8085/rest/api/latest/result/TEST1-TEST1-JOB1-23"",""rel"":""self""},""plan"":{""shortName"":""Default
 
Job"",""shortKey"":""TEST1-JOB1"",""type"":""job"",""enabled"":true,""link"":{""href"":""http://54.172.92.89:8085/rest/api/latest/plan/TEST1-TEST1-JOB1"",""rel"":""self""},""key"":""TEST1-TEST1-JOB1"",""name"":""test_project
 - t [...]
-199,"{""connectionId"":3,""ProjectKey"":""TEST1""}","{""expand"":""plan,artifacts,comments,labels,jiraIssues,variables"",""link"":{""href"":""http://54.172.92.89:8085/rest/api/latest/result/TEST1-TEST1-JOB1-22"",""rel"":""self""},""plan"":{""shortName"":""Default
 
Job"",""shortKey"":""TEST1-JOB1"",""type"":""job"",""enabled"":true,""link"":{""href"":""http://54.172.92.89:8085/rest/api/latest/plan/TEST1-TEST1-JOB1"",""rel"":""self""},""key"":""TEST1-TEST1-JOB1"",""name"":""test_project
 - t [...]
+"id","params","data","url","input","created_at"
+1,"{""connectionId"":1,""PlanKey"":""TEST-PLA3""}","{""expand"":""plan,vcsRevisions,artifacts,comments,labels,jiraIssues,variables"",""link"":{""href"":""http://18.232.129.138:8085/rest/api/latest/result/TEST-PLA3-JOB1-2"",""rel"":""self""},""plan"":{""shortName"":""Default
 
Job"",""shortKey"":""PLA3-JOB1"",""type"":""job"",""enabled"":true,""link"":{""href"":""http://18.232.129.138:8085/rest/api/latest/plan/TEST-PLA3-JOB1"",""rel"":""self""},""key"":""TEST-PLA3-JOB1"",""name"":""test
 - p [...]
+2,"{""connectionId"":1,""PlanKey"":""TEST-PLA3""}","{""expand"":""plan,vcsRevisions,artifacts,comments,labels,jiraIssues,variables"",""link"":{""href"":""http://18.232.129.138:8085/rest/api/latest/result/TEST-PLA3-JOB1-1"",""rel"":""self""},""plan"":{""shortName"":""Default
 
Job"",""shortKey"":""PLA3-JOB1"",""type"":""job"",""enabled"":true,""link"":{""href"":""http://18.232.129.138:8085/rest/api/latest/plan/TEST-PLA3-JOB1"",""rel"":""self""},""key"":""TEST-PLA3-JOB1"",""name"":""test
 - p [...]
diff --git a/backend/plugins/bamboo/e2e/raw_tables/_raw_bamboo_api_plan.csv 
b/backend/plugins/bamboo/e2e/raw_tables/_raw_bamboo_api_plan.csv
deleted file mode 100644
index 9b0dad34d..000000000
--- a/backend/plugins/bamboo/e2e/raw_tables/_raw_bamboo_api_plan.csv
+++ /dev/null
@@ -1,5 +0,0 @@
-"id","params","data","url","input","created_at"
-19,"{""connectionId"":3,""ProjectKey"":""TEST1""}","{""expand"":""actions,stages,branches"",""projectKey"":""TEST1"",""projectName"":""test_project"",""project"":{""key"":""TEST1"",""name"":""test_project"",""description"":""just
 a test 
project"",""link"":{""href"":""http://54.172.92.89:8085/rest/api/latest/project/TEST1"",""rel"":""self""}},""description"":""description
 
plan2"",""shortName"":""test2"",""buildName"":""test2"",""shortKey"":""TEST2"",""type"":""chain"",""enabled"":true,""l
 [...]
-20,"{""connectionId"":3,""ProjectKey"":""TEST1""}","{""expand"":""actions,stages,branches"",""projectKey"":""TEST1"",""projectName"":""test_project"",""project"":{""key"":""TEST1"",""name"":""test_project"",""description"":""just
 a test 
project"",""link"":{""href"":""http://54.172.92.89:8085/rest/api/latest/project/TEST1"",""rel"":""self""}},""description"":""description
 
plan23"",""shortName"":""test3"",""buildName"":""test3"",""shortKey"":""TEST3"",""type"":""chain"",""enabled"":true,""
 [...]
-21,"{""connectionId"":3,""ProjectKey"":""TEST1""}","{""expand"":""actions,stages,branches"",""projectKey"":""TEST1"",""projectName"":""test_project"",""project"":{""key"":""TEST1"",""name"":""test_project"",""description"":""just
 a test 
project"",""link"":{""href"":""http://54.172.92.89:8085/rest/api/latest/project/TEST1"",""rel"":""self""}},""description"":""description
 
plan4"",""shortName"":""test4"",""buildName"":""test4"",""shortKey"":""TEST4"",""type"":""chain"",""enabled"":true,""l
 [...]
-22,"{""connectionId"":3,""ProjectKey"":""TEST1""}","{""expand"":""actions,stages,branches"",""projectKey"":""TEST1"",""projectName"":""test_project"",""project"":{""key"":""TEST1"",""name"":""test_project"",""description"":""just
 a test 
project"",""link"":{""href"":""http://54.172.92.89:8085/rest/api/latest/project/TEST1"",""rel"":""self""}},""description"":""just
 a test 
plan"",""shortName"":""test_plan"",""buildName"":""test_plan"",""shortKey"":""TEST1"",""type"":""chain"",""enabled"":t
 [...]
diff --git 
a/backend/plugins/bamboo/e2e/raw_tables/_raw_bamboo_api_plan_build.csv 
b/backend/plugins/bamboo/e2e/raw_tables/_raw_bamboo_api_plan_build.csv
index 6976741ff..18d3986c4 100644
--- a/backend/plugins/bamboo/e2e/raw_tables/_raw_bamboo_api_plan_build.csv
+++ b/backend/plugins/bamboo/e2e/raw_tables/_raw_bamboo_api_plan_build.csv
@@ -1,10 +1,3 @@
-"id","params","data","url","input","created_at"
-232,"{""connectionId"":3,""ProjectKey"":""TEST1""}","{""expand"":""plan,artifacts,comments,labels,jiraIssues,variables,stages"",""link"":{""href"":""http://54.172.92.89:8085/rest/api/latest/result/TEST1-TEST2-3"",""rel"":""self""},""plan"":{""shortName"":""test2"",""shortKey"":""TEST2"",""type"":""chain"",""enabled"":true,""link"":{""href"":""http://54.172.92.89:8085/rest/api/latest/plan/TEST1-TEST2"",""rel"":""self""},""key"":""TEST1-TEST2"",""name"":""test_project
 - test2"",""planKey"" [...]
-233,"{""connectionId"":3,""ProjectKey"":""TEST1""}","{""expand"":""plan,artifacts,comments,labels,jiraIssues,variables,stages"",""link"":{""href"":""http://54.172.92.89:8085/rest/api/latest/result/TEST1-TEST2-2"",""rel"":""self""},""plan"":{""shortName"":""test2"",""shortKey"":""TEST2"",""type"":""chain"",""enabled"":true,""link"":{""href"":""http://54.172.92.89:8085/rest/api/latest/plan/TEST1-TEST2"",""rel"":""self""},""key"":""TEST1-TEST2"",""name"":""test_project
 - test2"",""planKey"" [...]
-234,"{""connectionId"":3,""ProjectKey"":""TEST1""}","{""expand"":""plan,artifacts,comments,labels,jiraIssues,variables,stages"",""link"":{""href"":""http://54.172.92.89:8085/rest/api/latest/result/TEST1-TEST2-1"",""rel"":""self""},""plan"":{""shortName"":""test2"",""shortKey"":""TEST2"",""type"":""chain"",""enabled"":true,""link"":{""href"":""http://54.172.92.89:8085/rest/api/latest/plan/TEST1-TEST2"",""rel"":""self""},""key"":""TEST1-TEST2"",""name"":""test_project
 - test2"",""planKey"" [...]
-248,"{""connectionId"":3,""ProjectKey"":""TEST1""}","{""expand"":""plan,artifacts,comments,labels,jiraIssues,variables,stages"",""link"":{""href"":""http://54.172.92.89:8085/rest/api/latest/result/TEST1-TEST4-2"",""rel"":""self""},""plan"":{""shortName"":""test4"",""shortKey"":""TEST4"",""type"":""chain"",""enabled"":true,""link"":{""href"":""http://54.172.92.89:8085/rest/api/latest/plan/TEST1-TEST4"",""rel"":""self""},""key"":""TEST1-TEST4"",""name"":""test_project
 - test4"",""planKey"" [...]
-249,"{""connectionId"":3,""ProjectKey"":""TEST1""}","{""expand"":""plan,artifacts,comments,labels,jiraIssues,variables,stages"",""link"":{""href"":""http://54.172.92.89:8085/rest/api/latest/result/TEST1-TEST4-1"",""rel"":""self""},""plan"":{""shortName"":""test4"",""shortKey"":""TEST4"",""type"":""chain"",""enabled"":true,""link"":{""href"":""http://54.172.92.89:8085/rest/api/latest/plan/TEST1-TEST4"",""rel"":""self""},""key"":""TEST1-TEST4"",""name"":""test_project
 - test4"",""planKey"" [...]
-264,"{""connectionId"":3,""ProjectKey"":""TEST1""}","{""expand"":""plan,artifacts,comments,labels,jiraIssues,variables,stages"",""link"":{""href"":""http://54.172.92.89:8085/rest/api/latest/result/TEST1-TEST3-2"",""rel"":""self""},""plan"":{""shortName"":""test3"",""shortKey"":""TEST3"",""type"":""chain"",""enabled"":true,""link"":{""href"":""http://54.172.92.89:8085/rest/api/latest/plan/TEST1-TEST3"",""rel"":""self""},""key"":""TEST1-TEST3"",""name"":""test_project
 - test3"",""planKey"" [...]
-265,"{""connectionId"":3,""ProjectKey"":""TEST1""}","{""expand"":""plan,artifacts,comments,labels,jiraIssues,variables,stages"",""link"":{""href"":""http://54.172.92.89:8085/rest/api/latest/result/TEST1-TEST3-1"",""rel"":""self""},""plan"":{""shortName"":""test3"",""shortKey"":""TEST3"",""type"":""chain"",""enabled"":true,""link"":{""href"":""http://54.172.92.89:8085/rest/api/latest/plan/TEST1-TEST3"",""rel"":""self""},""key"":""TEST1-TEST3"",""name"":""test_project
 - test3"",""planKey"" [...]
-308,"{""connectionId"":3,""ProjectKey"":""TEST1""}","{""expand"":""plan,artifacts,comments,labels,jiraIssues,variables,stages"",""link"":{""href"":""http://54.172.92.89:8085/rest/api/latest/result/TEST1-TEST1-23"",""rel"":""self""},""plan"":{""shortName"":""test_plan"",""shortKey"":""TEST1"",""type"":""chain"",""enabled"":true,""link"":{""href"":""http://54.172.92.89:8085/rest/api/latest/plan/TEST1-TEST1"",""rel"":""self""},""key"":""TEST1-TEST1"",""name"":""test_project
 - test_plan"","" [...]
-309,"{""connectionId"":3,""ProjectKey"":""TEST1""}","{""expand"":""plan,artifacts,comments,labels,jiraIssues,variables,stages"",""link"":{""href"":""http://54.172.92.89:8085/rest/api/latest/result/TEST1-TEST1-22"",""rel"":""self""},""plan"":{""shortName"":""test_plan"",""shortKey"":""TEST1"",""type"":""chain"",""enabled"":true,""link"":{""href"":""http://54.172.92.89:8085/rest/api/latest/plan/TEST1-TEST1"",""rel"":""self""},""key"":""TEST1-TEST1"",""name"":""test_project
 - test_plan"","" [...]
+"id","params","data","url","input","created_at"
+1,"{""connectionId"":1,""PlanKey"":""TEST-PLA3""}","{""expand"":""plan,vcsRevisions,artifacts,comments,labels,jiraIssues,variables,stages"",""link"":{""href"":""http://18.232.129.138:8085/rest/api/latest/result/TEST-PLA3-2"",""rel"":""self""},""plan"":{""shortName"":""pla-3"",""shortKey"":""PLA3"",""type"":""chain"",""enabled"":true,""link"":{""href"":""http://18.232.129.138:8085/rest/api/latest/plan/TEST-PLA3"",""rel"":""self""},""key"":""TEST-PLA3"",""name"":""test
 - pla-3"",""planKey" [...]
+2,"{""connectionId"":1,""PlanKey"":""TEST-PLA3""}","{""expand"":""plan,vcsRevisions,artifacts,comments,labels,jiraIssues,variables,stages"",""link"":{""href"":""http://18.232.129.138:8085/rest/api/latest/result/TEST-PLA3-1"",""rel"":""self""},""plan"":{""shortName"":""pla-3"",""shortKey"":""PLA3"",""type"":""chain"",""enabled"":true,""link"":{""href"":""http://18.232.129.138:8085/rest/api/latest/plan/TEST-PLA3"",""rel"":""self""},""key"":""TEST-PLA3"",""name"":""test
 - pla-3"",""planKey" [...]
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 838252d57..80cfa6463 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-TEST1,TEST1,1,1,1,1,1,0,0,PRODUCTION,"{""connectionId"":1,""ProjectKey"":""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-TEST1,TEST1,1,1,1,1,1,0,0,PRODUCTION,"{""connectionId"":1,""ProjectKey"":""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-TEST1,TEST1,1,1,1,1,1,0,0,PRODUCTION,"{""connectionId"":1,""ProjectKey"":""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-TEST1,TEST1,1,1,1,1,1,0,0,PRODUCTION,"{""connectionId"":1,""ProjectKey"":""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-TEST1,TEST1,1,1,1,1,1,0,0,PRODUCTION,"{""connectionId"":1,""ProjectKey"":""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-TEST1,TEST1,1,1,1,1,1,0,0,PRODUCTION,"{""connectionId"":1,""ProjectKey"":""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-TEST1,TEST1,1,1,1,1,1,0,0,PRODUCTION,"{""connectionId"":1,""ProjectKey"":""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-TEST1,TEST1,1,1,1,1,1,0,0,PRODUCTION,"{""connectionId"":1,""ProjectKey"":""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-TEST1,TEST1,1,1,1,1,1,0,0,PRODUCTION,"{""connectionId"":1,""ProjectKey"":""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,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,
diff --git 
a/backend/plugins/bamboo/e2e/snapshot_tables/_tool_bamboo_deploy_environment.csv
 
b/backend/plugins/bamboo/e2e/snapshot_tables/_tool_bamboo_deploy_environment.csv
index 4040b177f..89c9fdea8 100644
--- 
a/backend/plugins/bamboo/e2e/snapshot_tables/_tool_bamboo_deploy_environment.csv
+++ 
b/backend/plugins/bamboo/e2e/snapshot_tables/_tool_bamboo_deploy_environment.csv
@@ -1,7 +1,5 @@
 
connection_id,env_id,name,plan_key,description,position,configuration_state,can_view,can_edit,can_delete,allowed_to_execute,can_execute,allowed_to_create_version,allowed_to_set_version_status,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark
-3,950273,test-env,TEST1-TEST1,a test 
environment,0,DETAILED,1,1,1,1,1,0,0,"{""connectionId"":3,""ProjectKey"":""TEST1""}",_raw_bamboo_api_deploy,39,
-3,1310721,environment2,TEST1-TEST3,other test 
environment,0,DETAILED,1,1,1,1,1,0,0,"{""connectionId"":3,""ProjectKey"":""TEST1""}",_raw_bamboo_api_deploy,41,
-3,1310722,lake,TEST1-TEST3,a test 
environment,1,DETAILED,1,1,1,1,1,0,0,"{""connectionId"":3,""ProjectKey"":""TEST1""}",_raw_bamboo_api_deploy,41,
-3,1310723,environment2,TEST1-TEST1,the environment2 for 
project,1,DETAILED,1,1,1,1,1,0,0,"{""connectionId"":3,""ProjectKey"":""TEST1""}",_raw_bamboo_api_deploy,39,
-3,1310724,test-env3,TEST1-TEST1,a test environment 
num3,2,DETAILED,1,1,1,1,1,0,0,"{""connectionId"":3,""ProjectKey"":""TEST1""}",_raw_bamboo_api_deploy,39,
-3,1310725,test-env4,TEST1-TEST1,the 4th test 
environment,3,DETAILED,1,1,1,1,1,0,0,"{""connectionId"":3,""ProjectKey"":""TEST1""}",_raw_bamboo_api_deploy,39,
+1,950273,test-env,TEST1,a test 
environment,0,DETAILED,1,1,1,1,1,0,0,"{""connectionId"":1,""PlanKey"":""TEST1""}",_raw_bamboo_api_deploy,39,
+1,1310723,environment2,TEST1,the environment2 for 
project,1,DETAILED,1,1,1,1,1,0,0,"{""connectionId"":1,""PlanKey"":""TEST1""}",_raw_bamboo_api_deploy,39,
+1,1310724,test-env3,TEST1,a test environment 
num3,2,DETAILED,1,1,1,1,1,0,0,"{""connectionId"":1,""PlanKey"":""TEST1""}",_raw_bamboo_api_deploy,39,
+1,1310725,test-env4,TEST1,the 4th test 
environment,3,DETAILED,1,1,1,1,1,0,0,"{""connectionId"":1,""PlanKey"":""TEST1""}",_raw_bamboo_api_deploy,39,
diff --git 
a/backend/plugins/bamboo/e2e/snapshot_tables/_tool_bamboo_job_builds.csv 
b/backend/plugins/bamboo/e2e/snapshot_tables/_tool_bamboo_job_builds.csv
index c60cf7e82..679f9d93d 100644
--- a/backend/plugins/bamboo/e2e/snapshot_tables/_tool_bamboo_job_builds.csv
+++ b/backend/plugins/bamboo/e2e/snapshot_tables/_tool_bamboo_job_builds.csv
@@ -1,10 +1,3 @@
 
connection_id,job_build_key,job_key,plan_build_key,expand,number,build_number,job_name,plan_name,plan_key,project_name,project_key,build_result_key,life_cycle_state,build_started_time,pretty_build_started_time,build_completed_time,build_completed_date,pretty_build_completed_time,build_duration_in_seconds,build_duration,build_duration_description,build_relative_time,vcs_revision_key,build_test_summary,successful_test_count,failed_test_count,quarantined_test_count,skipped_test_count,contin
 [...]
-3,TEST1-TEST1-JOB1-22,TEST1-TEST1-JOB1,TEST1-TEST1-22,"plan,artifacts,comments,labels,jiraIssues,variables",22,22,Default
 
Job,test_plan,TEST1-TEST1,test_project,TEST1,TEST1-TEST1-JOB1-22,Finished,2023-02-22T08:31:51.580+00:00,"Wed,
 22 Feb, 08:31 
AM",2023-02-22T08:31:51.590+00:00,2023-02-22T08:31:51.590+00:00,"Wed, 22 Feb, 
08:31 AM",0,10,< 1 second,1 hour ago,,No tests found,0,0,0,0,0,0,0,0,"Manual 
run by <a 
href=""http://54.172.92.89:8085/browse/user/bamboo"";>devlake</a>","Manual run 
by  [...]
-3,TEST1-TEST1-JOB1-23,TEST1-TEST1-JOB1,TEST1-TEST1-23,"plan,artifacts,comments,labels,jiraIssues,variables",23,23,Default
 
Job,test_plan,TEST1-TEST1,test_project,TEST1,TEST1-TEST1-JOB1-23,Finished,2023-02-22T08:31:54.768+00:00,"Wed,
 22 Feb, 08:31 
AM",2023-02-22T08:31:54.778+00:00,2023-02-22T08:31:54.778+00:00,"Wed, 22 Feb, 
08:31 AM",0,10,< 1 second,1 hour ago,,No tests found,0,0,0,0,0,0,0,0,"Manual 
run by <a 
href=""http://54.172.92.89:8085/browse/user/bamboo"";>devlake</a>","Manual run 
by  [...]
-3,TEST1-TEST2-JOB1-2,TEST1-TEST2-JOB1,TEST1-TEST2-2,"plan,artifacts,comments,labels,jiraIssues,variables",2,2,Default
 
Job,test2,TEST1-TEST2,test_project,TEST1,TEST1-TEST2-JOB1-2,Finished,2023-02-22T08:57:02.876+00:00,"Wed,
 22 Feb, 08:57 
AM",2023-02-22T08:57:02.879+00:00,2023-02-22T08:57:02.879+00:00,"Wed, 22 Feb, 
08:57 AM",0,3,< 1 second,1 hour ago,,No tests found,0,0,0,0,0,0,0,0,"Manual run 
by <a href=""http://54.172.92.89:8085/browse/user/bamboo"";>devlake</a>","Manual 
run by <a href="" [...]
-3,TEST1-TEST2-JOB1-3,TEST1-TEST2-JOB1,TEST1-TEST2-3,"plan,artifacts,comments,labels,jiraIssues,variables",3,3,compile,test2,TEST1-TEST2,test_project,TEST1,TEST1-TEST2-JOB1-3,Finished,2023-02-22T08:57:06.722+00:00,"Wed,
 22 Feb, 08:57 
AM",2023-02-22T08:57:06.725+00:00,2023-02-22T08:57:06.725+00:00,"Wed, 22 Feb, 
08:57 AM",0,3,< 1 second,1 hour ago,,No tests found,0,0,0,0,0,0,0,0,"Manual run 
by <a href=""http://54.172.92.89:8085/browse/user/bamboo"";>devlake</a>","Manual 
run by <a href=""http [...]
-3,TEST1-TEST3-JOB1-2,TEST1-TEST3-JOB1,TEST1-TEST3-2,"plan,artifacts,comments,labels,jiraIssues,variables",2,2,Default
 
Job,test3,TEST1-TEST3,test_project,TEST1,TEST1-TEST3-JOB1-2,Finished,2023-02-22T08:55:21.897+00:00,"Wed,
 22 Feb, 08:55 
AM",2023-02-22T08:55:21.901+00:00,2023-02-22T08:55:21.901+00:00,"Wed, 22 Feb, 
08:55 AM",0,4,< 1 second,1 hour ago,,No tests found,0,0,0,0,0,0,0,0,"Manual run 
by <a href=""http://54.172.92.89:8085/browse/user/bamboo"";>devlake</a>","Manual 
run by <a href="" [...]
-3,TEST1-TEST3-JOB1-3,TEST1-TEST3-JOB1,TEST1-TEST3-3,"plan,artifacts,comments,labels,jiraIssues,variables",3,3,Default
 
Job,test3,TEST1-TEST3,test_project,TEST1,TEST1-TEST3-JOB1-3,Finished,2023-02-22T08:55:25.123+00:00,"Wed,
 22 Feb, 08:55 
AM",2023-02-22T08:55:25.126+00:00,2023-02-22T08:55:25.126+00:00,"Wed, 22 Feb, 
08:55 AM",0,3,< 1 second,1 hour ago,,No tests found,0,0,0,0,0,0,0,0,"Manual run 
by <a href=""http://54.172.92.89:8085/browse/user/bamboo"";>devlake</a>","Manual 
run by <a href="" [...]
-3,TEST1-TEST4-JOB1-1,TEST1-TEST4-JOB1,TEST1-TEST4-1,"plan,artifacts,comments,labels,jiraIssues,variables",1,1,Default
 
Job,test4,TEST1-TEST4,test_project,TEST1,TEST1-TEST4-JOB1-1,Finished,2023-02-22T08:56:25.943+00:00,"Wed,
 22 Feb, 08:56 
AM",2023-02-22T08:56:25.947+00:00,2023-02-22T08:56:25.947+00:00,"Wed, 22 Feb, 
08:56 AM",0,4,< 1 second,1 hour ago,,No tests found,0,0,0,0,0,0,0,0,"Manual run 
by <a href=""http://54.172.92.89:8085/browse/user/bamboo"";>devlake</a>","Manual 
run by <a href="" [...]
-3,TEST1-TEST4-JOB1-2,TEST1-TEST4-JOB1,TEST1-TEST4-2,"plan,artifacts,comments,labels,jiraIssues,variables",2,2,Default
 
Job,test4,TEST1-TEST4,test_project,TEST1,TEST1-TEST4-JOB1-2,Finished,2023-02-22T08:56:27.888+00:00,"Wed,
 22 Feb, 08:56 
AM",2023-02-22T08:56:27.891+00:00,2023-02-22T08:56:27.891+00:00,"Wed, 22 Feb, 
08:56 AM",0,3,< 1 second,1 hour ago,,No tests found,0,0,0,0,0,0,0,0,"Manual run 
by <a href=""http://54.172.92.89:8085/browse/user/bamboo"";>devlake</a>","Manual 
run by <a href="" [...]
-3,TEST1-TEST4-JOB1-3,TEST1-TEST4-JOB1,TEST1-TEST4-3,"plan,artifacts,comments,labels,jiraIssues,variables",3,3,compile,test4,TEST1-TEST4,test_project,TEST1,TEST1-TEST4-JOB1-3,Finished,2023-02-22T08:57:01.230+00:00,"Wed,
 22 Feb, 08:57 
AM",2023-02-22T08:57:01.234+00:00,2023-02-22T08:57:01.234+00:00,"Wed, 22 Feb, 
08:57 AM",0,4,< 1 second,1 hour ago,,No tests found,0,0,0,0,0,0,0,0,"Manual run 
by <a href=""http://54.172.92.89:8085/browse/user/bamboo"";>devlake</a>","Manual 
run by <a href=""http [...]
+1,TEST-PLA3-JOB1-1,TEST-PLA3-JOB1,TEST-PLA3-1,"plan,vcsRevisions,artifacts,comments,labels,jiraIssues,variables",1,1,Default
 
Job,pla-3,TEST-PLA3,test,,TEST-PLA3-JOB1-1,Finished,2023-07-27T03:47:13.626+00:00,"Thu,
 27 Jul, 03:47 
AM",2023-07-27T03:47:13.750+00:00,2023-07-27T03:47:13.750+00:00,"Thu, 27 Jul, 
03:47 AM",0,124,< 1 second,10 hours 
ago,4e53dfe616d640cec760234643b13a02339d1eaa,No tests 
found,0,0,0,0,0,0,0,0,First build for this plan,First build for this 
plan,Successful,Successful,T [...]
+1,TEST-PLA3-JOB1-2,TEST-PLA3-JOB1,TEST-PLA3-2,"plan,vcsRevisions,artifacts,comments,labels,jiraIssues,variables",2,2,Default
 
Job,pla-3,TEST-PLA3,test,,TEST-PLA3-JOB1-2,Finished,2023-07-27T03:56:15.783+00:00,"Thu,
 27 Jul, 03:56 
AM",2023-07-27T03:56:15.789+00:00,2023-07-27T03:56:15.789+00:00,"Thu, 27 Jul, 
03:56 AM",0,6,< 1 second,10 hours 
ago,79b062bd53af15c701193c90b543386557cb7a3a,No tests 
found,0,0,0,0,0,0,0,0,Code changes detected,Code changes 
detected,Successful,Successful,TEST-PLA3-J [...]
diff --git 
a/backend/plugins/bamboo/e2e/snapshot_tables/_tool_bamboo_job_builds_no_prod_env.csv
 
b/backend/plugins/bamboo/e2e/snapshot_tables/_tool_bamboo_job_builds_no_prod_env.csv
index bb0a5c9c8..c6ac4c454 100644
--- 
a/backend/plugins/bamboo/e2e/snapshot_tables/_tool_bamboo_job_builds_no_prod_env.csv
+++ 
b/backend/plugins/bamboo/e2e/snapshot_tables/_tool_bamboo_job_builds_no_prod_env.csv
@@ -1,10 +1,3 @@
 
connection_id,job_build_key,environment,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark
-3,TEST1-TEST1-JOB1-22,PRODUCTION,"{""connectionId"":3,""ProjectKey"":""TEST1""}",_raw_bamboo_api_job_build,199,
-3,TEST1-TEST1-JOB1-23,PRODUCTION,"{""connectionId"":3,""ProjectKey"":""TEST1""}",_raw_bamboo_api_job_build,198,
-3,TEST1-TEST2-JOB1-2,PRODUCTION,"{""connectionId"":3,""ProjectKey"":""TEST1""}",_raw_bamboo_api_job_build,123,
-3,TEST1-TEST2-JOB1-3,PRODUCTION,"{""connectionId"":3,""ProjectKey"":""TEST1""}",_raw_bamboo_api_job_build,122,
-3,TEST1-TEST3-JOB1-2,PRODUCTION,"{""connectionId"":3,""ProjectKey"":""TEST1""}",_raw_bamboo_api_job_build,154,
-3,TEST1-TEST3-JOB1-3,PRODUCTION,"{""connectionId"":3,""ProjectKey"":""TEST1""}",_raw_bamboo_api_job_build,153,
-3,TEST1-TEST4-JOB1-1,PRODUCTION,"{""connectionId"":3,""ProjectKey"":""TEST1""}",_raw_bamboo_api_job_build,139,
-3,TEST1-TEST4-JOB1-2,PRODUCTION,"{""connectionId"":3,""ProjectKey"":""TEST1""}",_raw_bamboo_api_job_build,138,
-3,TEST1-TEST4-JOB1-3,PRODUCTION,"{""connectionId"":3,""ProjectKey"":""TEST1""}",_raw_bamboo_api_job_build,137,
+1,TEST-PLA3-JOB1-1,PRODUCTION,"{""connectionId"":1,""PlanKey"":""TEST-PLA3""}",_raw_bamboo_api_job_build,2,
+1,TEST-PLA3-JOB1-2,PRODUCTION,"{""connectionId"":1,""PlanKey"":""TEST-PLA3""}",_raw_bamboo_api_job_build,1,
diff --git a/backend/plugins/bamboo/e2e/snapshot_tables/_tool_bamboo_jobs.csv 
b/backend/plugins/bamboo/e2e/snapshot_tables/_tool_bamboo_jobs.csv
index a28b68c60..766268752 100644
--- a/backend/plugins/bamboo/e2e/snapshot_tables/_tool_bamboo_jobs.csv
+++ b/backend/plugins/bamboo/e2e/snapshot_tables/_tool_bamboo_jobs.csv
@@ -1,5 +1,2 @@
 
connection_id,job_key,id,name,plan_key,project_key,project_name,description,branch_name,stage_name,type,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark
-3,TEST1-TEST1-JOB1,TEST1-TEST1-JOB1,Default 
Job,TEST1-TEST1,TEST1,test_project,just a test 
plan,Default,,job,"{""connectionId"":3,""ProjectKey"":""TEST1""}",_raw_bamboo_api_job,7,
-3,TEST1-TEST2-JOB1,TEST1-TEST2-JOB1,Default 
Job,TEST1-TEST2,TEST1,test_project,description 
plan2,Default,,job,"{""connectionId"":3,""ProjectKey"":""TEST1""}",_raw_bamboo_api_job,8,
-3,TEST1-TEST3-JOB1,TEST1-TEST3-JOB1,Default 
Job,TEST1-TEST3,TEST1,test_project,description 
plan23,Default,,job,"{""connectionId"":3,""ProjectKey"":""TEST1""}",_raw_bamboo_api_job,9,
-3,TEST1-TEST4-JOB1,TEST1-TEST4-JOB1,Default 
Job,TEST1-TEST4,TEST1,test_project,description 
plan4,Default,,job,"{""connectionId"":3,""ProjectKey"":""TEST1""}",_raw_bamboo_api_job,10,
+1,TEST-PLA1-JOB1,TEST-PLA1-JOB1,Default 
Job,TEST-PLA1,,test,,main,,job,"{""connectionId"":1,""PlanKey"":""TEST-PLA1""}",_raw_bamboo_api_job,1,
diff --git 
a/backend/plugins/bamboo/e2e/snapshot_tables/_tool_bamboo_plan_build_commits.csv
 
b/backend/plugins/bamboo/e2e/snapshot_tables/_tool_bamboo_plan_build_commits.csv
index 20d8b4b49..dc5984422 100644
--- 
a/backend/plugins/bamboo/e2e/snapshot_tables/_tool_bamboo_plan_build_commits.csv
+++ 
b/backend/plugins/bamboo/e2e/snapshot_tables/_tool_bamboo_plan_build_commits.csv
@@ -1,3 +1,3 @@
 
"connection_id","plan_build_key","repository_id","repository_name","vcs_revision_key","created_at","updated_at","_raw_data_params","_raw_data_table","_raw_data_id","_raw_data_remark"
-3,TEST1-TEST2-1,1736707,"devlake-website","207fc4666c4d356b474ed951ffe38cc2ad97499e","2023-04-12
 09:19:52.190","2023-04-12 
09:19:53.600","{""connectionId"":3,""ProjectKey"":""TEST2""}","_raw_bamboo_api_job_build",3,""
-3,TEST1-TEST2-1,1736708,devlake-test,"caab17b6dc3532b7f78f418a192c050320a30e46","2023-04-12
 09:19:52.190","2023-04-12 
09:19:52.190","{""connectionId"":3,""ProjectKey"":""TEST2""}","_raw_bamboo_api_plan_build",15,""
+1,TEST-PLA3-1,1736707,"devlake-website","207fc4666c4d356b474ed951ffe38cc2ad97499e","2023-04-12
 09:19:52.190","2023-04-12 
09:19:53.600","{""connectionId"":1,""PlanKey"":""TEST-PLA3""}","_raw_bamboo_api_job_build",3,""
+1,TEST-PLA3-2,1736708,devlake-test,"caab17b6dc3532b7f78f418a192c050320a30e46","2023-04-12
 09:19:52.190","2023-04-12 
09:19:52.190","{""connectionId"":1,""PlanKey"":""TEST-PLA3""}","_raw_bamboo_api_plan_build",15,""
diff --git 
a/backend/plugins/bamboo/e2e/snapshot_tables/_tool_bamboo_plan_builds.csv 
b/backend/plugins/bamboo/e2e/snapshot_tables/_tool_bamboo_plan_builds.csv
index ba4de5ef8..efe765d53 100644
--- a/backend/plugins/bamboo/e2e/snapshot_tables/_tool_bamboo_plan_builds.csv
+++ b/backend/plugins/bamboo/e2e/snapshot_tables/_tool_bamboo_plan_builds.csv
@@ -1,10 +1,3 @@
 
connection_id,plan_build_key,expand,number,build_number,plan_name,plan_key,project_name,project_key,build_result_key,life_cycle_state,build_started_time,pretty_build_started_time,build_completed_time,build_completed_date,pretty_build_completed_time,build_duration_in_seconds,build_duration,build_duration_description,build_relative_time,vcs_revision_key,build_test_summary,successful_test_count,failed_test_count,quarantined_test_count,skipped_test_count,continuable,once_off,restartable,not_
 [...]
-3,TEST1-TEST1-22,"plan,artifacts,comments,labels,jiraIssues,variables,stages",22,22,test_plan,TEST1-TEST1,test_project,TEST1,TEST1-TEST1-22,Finished,2023-02-22T08:31:51.532+00:00,"Wed,
 22 Feb, 08:31 
AM",2023-02-22T08:31:51.624+00:00,2023-02-22T08:31:51.624+00:00,"Wed, 22 Feb, 
08:31 AM",0,92,< 1 second,3 hours ago,,No tests found,0,0,0,0,0,0,0,0,"Manual 
run by <a 
href=""http://54.172.92.89:8085/browse/user/bamboo"";>devlake</a>","Manual run 
by <a href=""http://54.172.92.89:8085/browse/user [...]
-3,TEST1-TEST1-23,"plan,artifacts,comments,labels,jiraIssues,variables,stages",23,23,test_plan,TEST1-TEST1,test_project,TEST1,TEST1-TEST1-23,Finished,2023-02-22T08:31:54.760+00:00,"Wed,
 22 Feb, 08:31 
AM",2023-02-22T08:31:54.811+00:00,2023-02-22T08:31:54.811+00:00,"Wed, 22 Feb, 
08:31 AM",0,51,< 1 second,3 hours ago,,No tests found,0,0,0,0,0,0,0,0,"Manual 
run by <a 
href=""http://54.172.92.89:8085/browse/user/bamboo"";>devlake</a>","Manual run 
by <a href=""http://54.172.92.89:8085/browse/user [...]
-3,TEST1-TEST2-1,"plan,artifacts,comments,labels,jiraIssues,variables,stages",1,1,test2,TEST1-TEST2,test_project,TEST1,TEST1-TEST2-1,Finished,2023-02-22T08:54:40.831+00:00,"Wed,
 22 Feb, 08:54 
AM",2023-02-22T08:54:40.884+00:00,2023-02-22T08:54:40.884+00:00,"Wed, 22 Feb, 
08:54 AM",0,53,< 1 second,3 hours ago,,No tests found,0,0,0,0,0,0,1,0,"Manual 
run by <a 
href=""http://54.172.92.89:8085/browse/user/bamboo"";>devlake</a>","Manual run 
by <a href=""http://54.172.92.89:8085/browse/user/bamboo"; [...]
-3,TEST1-TEST2-2,"plan,artifacts,comments,labels,jiraIssues,variables,stages",2,2,test2,TEST1-TEST2,test_project,TEST1,TEST1-TEST2-2,Finished,2023-02-22T08:57:02.868+00:00,"Wed,
 22 Feb, 08:57 
AM",2023-02-22T08:57:02.903+00:00,2023-02-22T08:57:02.903+00:00,"Wed, 22 Feb, 
08:57 AM",0,35,< 1 second,3 hours ago,,No tests found,0,0,0,0,0,0,1,0,"Manual 
run by <a 
href=""http://54.172.92.89:8085/browse/user/bamboo"";>devlake</a>","Manual run 
by <a href=""http://54.172.92.89:8085/browse/user/bamboo"; [...]
-3,TEST1-TEST2-3,"plan,artifacts,comments,labels,jiraIssues,variables,stages",3,3,test2,TEST1-TEST2,test_project,TEST1,TEST1-TEST2-3,Finished,2023-02-22T08:57:06.713+00:00,"Wed,
 22 Feb, 08:57 
AM",2023-02-22T08:57:06.770+00:00,2023-02-22T08:57:06.770+00:00,"Wed, 22 Feb, 
08:57 AM",0,57,< 1 second,3 hours ago,,No tests found,0,0,0,0,0,0,1,0,"Manual 
run by <a 
href=""http://54.172.92.89:8085/browse/user/bamboo"";>devlake</a>","Manual run 
by <a href=""http://54.172.92.89:8085/browse/user/bamboo"; [...]
-3,TEST1-TEST3-1,"plan,artifacts,comments,labels,jiraIssues,variables,stages",1,1,test3,TEST1-TEST3,test_project,TEST1,TEST1-TEST3-1,Finished,2023-02-22T08:55:19.422+00:00,"Wed,
 22 Feb, 08:55 
AM",2023-02-22T08:55:19.500+00:00,2023-02-22T08:55:19.500+00:00,"Wed, 22 Feb, 
08:55 AM",0,78,< 1 second,3 hours ago,,No tests found,0,0,0,0,0,0,1,0,"Manual 
run by <a 
href=""http://54.172.92.89:8085/browse/user/bamboo"";>devlake</a>","Manual run 
by <a href=""http://54.172.92.89:8085/browse/user/bamboo"; [...]
-3,TEST1-TEST3-2,"plan,artifacts,comments,labels,jiraIssues,variables,stages",2,2,compile,TEST1-TEST3,test_project,TEST1,TEST1-TEST3-2,Finished,2023-02-22T08:55:21.888+00:00,"Wed,
 22 Feb, 08:55 
AM",2023-02-22T08:55:21.930+00:00,2023-02-22T08:55:21.930+00:00,"Wed, 22 Feb, 
08:55 AM",0,42,< 1 second,3 hours ago,,No tests found,0,0,0,0,0,0,1,0,"Manual 
run by <a 
href=""http://54.172.92.89:8085/browse/user/bamboo"";>devlake</a>","Manual run 
by <a href=""http://54.172.92.89:8085/browse/user/bambo [...]
-3,TEST1-TEST4-1,"plan,artifacts,comments,labels,jiraIssues,variables,stages",1,1,test4,TEST1-TEST4,test_project,TEST1,TEST1-TEST4-1,Finished,2023-02-22T08:56:25.911+00:00,"Wed,
 22 Feb, 08:56 
AM",2023-02-22T08:56:25.972+00:00,2023-02-22T08:56:25.972+00:00,"Wed, 22 Feb, 
08:56 AM",0,61,< 1 second,3 hours ago,,No tests found,0,0,0,0,0,0,1,0,"Manual 
run by <a 
href=""http://54.172.92.89:8085/browse/user/bamboo"";>devlake</a>","Manual run 
by <a href=""http://54.172.92.89:8085/browse/user/bamboo"; [...]
-3,TEST1-TEST4-2,"plan,artifacts,comments,labels,jiraIssues,variables,stages",2,2,compile,TEST1-TEST4,test_project,TEST1,TEST1-TEST4-2,Finished,2023-02-22T08:56:27.881+00:00,"Wed,
 22 Feb, 08:56 
AM",2023-02-22T08:56:27.917+00:00,2023-02-22T08:56:27.917+00:00,"Wed, 22 Feb, 
08:56 AM",0,36,< 1 second,3 hours ago,,No tests found,0,0,0,0,0,0,1,0,"Manual 
run by <a 
href=""http://54.172.92.89:8085/browse/user/bamboo"";>devlake</a>","Manual run 
by <a href=""http://54.172.92.89:8085/browse/user/bambo [...]
+1,TEST-PLA3-1,"plan,vcsRevisions,artifacts,comments,labels,jiraIssues,variables,stages",1,1,pla-3,TEST-PLA3,test,,TEST-PLA3-1,Finished,2023-07-27T03:47:12.941+00:00,"Thu,
 27 Jul, 03:47 
AM",2023-07-27T03:47:14.079+00:00,2023-07-27T03:47:14.079+00:00,"Thu, 27 Jul, 
03:47 AM",1,1138,1 second,10 hours 
ago,4e53dfe616d640cec760234643b13a02339d1eaa,No tests 
found,0,0,0,0,0,0,0,0,First build for this plan,First build for this 
plan,Successful,Successful,TEST-PLA3-1,,,"{""connectionId"":1,""PlanKey [...]
+1,TEST-PLA3-2,"plan,vcsRevisions,artifacts,comments,labels,jiraIssues,variables,stages",2,2,pla-3,TEST-PLA3,test,,TEST-PLA3-2,Finished,2023-07-27T03:56:14.902+00:00,"Thu,
 27 Jul, 03:56 
AM",2023-07-27T03:56:15.865+00:00,2023-07-27T03:56:15.865+00:00,"Thu, 27 Jul, 
03:56 AM",0,963,< 1 second,10 hours 
ago,79b062bd53af15c701193c90b543386557cb7a3a,No tests 
found,0,0,0,0,0,0,0,0,Code changes detected,Code changes 
detected,Successful,Successful,TEST-PLA3-2,,,"{""connectionId"":1,""PlanKey"":""TE
 [...]
diff --git a/backend/plugins/bamboo/e2e/snapshot_tables/_tool_bamboo_plans.csv 
b/backend/plugins/bamboo/e2e/snapshot_tables/_tool_bamboo_plans.csv
index eb2f4e06a..327f99da9 100644
--- a/backend/plugins/bamboo/e2e/snapshot_tables/_tool_bamboo_plans.csv
+++ b/backend/plugins/bamboo/e2e/snapshot_tables/_tool_bamboo_plans.csv
@@ -1,5 +1,2 @@
 
connection_id,plan_key,name,expand,project_key,project_name,description,short_name,build_name,short_key,type,enabled,href,rel,is_favourite,is_active,is_building,average_build_time_in_seconds,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark
-3,TEST1-TEST1,test_project - 
test_plan,"actions,stages,branches",TEST1,test_project,just a test 
plan,test_plan,test_plan,TEST1,chain,1,http://54.172.92.89:8085/rest/api/latest/plan/TEST1-TEST1,self,0,0,0,0,"{""connectionId"":3,""ProjectKey"":""TEST1""}",_raw_bamboo_api_plan,22,
-3,TEST1-TEST2,test_project - 
test2,"actions,stages,branches",TEST1,test_project,description 
plan2,test2,test2,TEST2,chain,1,http://54.172.92.89:8085/rest/api/latest/plan/TEST1-TEST2,self,0,0,0,0,"{""connectionId"":3,""ProjectKey"":""TEST1""}",_raw_bamboo_api_plan,19,
-3,TEST1-TEST3,test_project - 
test3,"actions,stages,branches",TEST1,test_project,description 
plan23,test3,test3,TEST3,chain,1,http://54.172.92.89:8085/rest/api/latest/plan/TEST1-TEST3,self,0,0,0,0,"{""connectionId"":3,""ProjectKey"":""TEST1""}",_raw_bamboo_api_plan,20,
-3,TEST1-TEST4,test_project - 
test4,"actions,stages,branches",TEST1,test_project,description 
plan4,test4,test4,TEST4,chain,1,http://54.172.92.89:8085/rest/api/latest/plan/TEST1-TEST4,self,0,0,0,0,"{""connectionId"":3,""ProjectKey"":""TEST1""}",_raw_bamboo_api_plan,21,
+3,TEST1,test_project - 
test_plan,"actions,stages,branches",TEST1,test_project,just a test 
plan,test_plan,test_plan,TEST1,chain,1,http://54.172.92.89:8085/rest/api/latest/plan/TEST1-TEST1,self,0,0,0,0,"{""connectionId"":3,""ProjectKey"":""TEST1""}",_raw_bamboo_api_plan,22,
diff --git 
a/backend/plugins/bamboo/e2e/snapshot_tables/cicd_pipeline_commits.csv 
b/backend/plugins/bamboo/e2e/snapshot_tables/cicd_pipeline_commits.csv
index fbdeddfd9..a5c89af34 100644
--- a/backend/plugins/bamboo/e2e/snapshot_tables/cicd_pipeline_commits.csv
+++ b/backend/plugins/bamboo/e2e/snapshot_tables/cicd_pipeline_commits.csv
@@ -1,3 +1,3 @@
 
pipeline_id,commit_sha,branch,repo_id,repo_url,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark
-bamboo:BambooPlanBuild:3:TEST1-TEST2-1,207fc4666c4d356b474ed951ffe38cc2ad97499e,,,devlake-website,"{""connectionId"":3,""ProjectKey"":""TEST2""}",_raw_bamboo_api_job_build,3,
-bamboo:BambooPlanBuild:3:TEST1-TEST2-1,caab17b6dc3532b7f78f418a192c050320a30e46,,,devlake-test,"{""connectionId"":3,""ProjectKey"":""TEST2""}",_raw_bamboo_api_plan_build,15,
+bamboo:BambooPlanBuild:1:TEST-PLA3-1,207fc4666c4d356b474ed951ffe38cc2ad97499e,,,devlake-website,"{""connectionId"":1,""PlanKey"":""TEST-PLA3""}",_raw_bamboo_api_job_build,3,
+bamboo:BambooPlanBuild:1:TEST-PLA3-2,caab17b6dc3532b7f78f418a192c050320a30e46,,,devlake-test,"{""connectionId"":1,""PlanKey"":""TEST-PLA3""}",_raw_bamboo_api_plan_build,15,
diff --git a/backend/plugins/bamboo/e2e/snapshot_tables/cicd_pipelines.csv 
b/backend/plugins/bamboo/e2e/snapshot_tables/cicd_pipelines.csv
index 097ed7883..a3be8ea46 100644
--- a/backend/plugins/bamboo/e2e/snapshot_tables/cicd_pipelines.csv
+++ b/backend/plugins/bamboo/e2e/snapshot_tables/cicd_pipelines.csv
@@ -1,10 +1,3 @@
 
id,name,result,status,type,duration_sec,environment,created_date,finished_date,cicd_scope_id
-bamboo:BambooPlanBuild:3:TEST1-TEST1-22,test_plan,SUCCESS,DONE,,0,,2023-02-22T08:31:51.532+00:00,2023-02-22T08:31:51.624+00:00,bamboo:BambooProject:3:TEST1
-bamboo:BambooPlanBuild:3:TEST1-TEST1-23,test_plan,SUCCESS,DONE,,0,,2023-02-22T08:31:54.760+00:00,2023-02-22T08:31:54.811+00:00,bamboo:BambooProject:3:TEST1
-bamboo:BambooPlanBuild:3:TEST1-TEST2-1,test2,FAILURE,DONE,,0,,2023-02-22T08:54:40.831+00:00,2023-02-22T08:54:40.884+00:00,bamboo:BambooProject:3:TEST1
-bamboo:BambooPlanBuild:3:TEST1-TEST2-2,test2,FAILURE,DONE,,0,,2023-02-22T08:57:02.868+00:00,2023-02-22T08:57:02.903+00:00,bamboo:BambooProject:3:TEST1
-bamboo:BambooPlanBuild:3:TEST1-TEST2-3,test2,FAILURE,DONE,,0,,2023-02-22T08:57:06.713+00:00,2023-02-22T08:57:06.770+00:00,bamboo:BambooProject:3:TEST1
-bamboo:BambooPlanBuild:3:TEST1-TEST3-1,test3,FAILURE,DONE,,0,,2023-02-22T08:55:19.422+00:00,2023-02-22T08:55:19.500+00:00,bamboo:BambooProject:3:TEST1
-bamboo:BambooPlanBuild:3:TEST1-TEST3-2,compile,FAILURE,DONE,DEPLOYMENT,0,PRODUCTION,2023-02-22T08:55:21.888+00:00,2023-02-22T08:55:21.930+00:00,bamboo:BambooProject:3:TEST1
-bamboo:BambooPlanBuild:3:TEST1-TEST4-1,test4,FAILURE,DONE,,0,,2023-02-22T08:56:25.911+00:00,2023-02-22T08:56:25.972+00:00,bamboo:BambooProject:3:TEST1
-bamboo:BambooPlanBuild:3:TEST1-TEST4-2,compile,FAILURE,DONE,DEPLOYMENT,0,PRODUCTION,2023-02-22T08:56:27.881+00:00,2023-02-22T08:56:27.917+00:00,bamboo:BambooProject:3:TEST1
+bamboo:BambooPlanBuild:1:TEST-PLA3-1,pla-3,SUCCESS,DONE,,1,,2023-07-27T03:47:12.941+00:00,2023-07-27T03:47:14.079+00:00,bamboo:BambooPlan:1:TEST-PLA3
+bamboo:BambooPlanBuild:1:TEST-PLA3-2,pla-3,SUCCESS,DONE,,0,,2023-07-27T03:56:14.902+00:00,2023-07-27T03:56:15.865+00:00,bamboo:BambooPlan:1:TEST-PLA3
diff --git a/backend/plugins/bamboo/e2e/snapshot_tables/cicd_scopes.csv 
b/backend/plugins/bamboo/e2e/snapshot_tables/cicd_scopes.csv
new file mode 100644
index 000000000..e8174b15f
--- /dev/null
+++ b/backend/plugins/bamboo/e2e/snapshot_tables/cicd_scopes.csv
@@ -0,0 +1,2 @@
+id,name,description,url,created_date,updated_date
+bamboo:BambooPlan:3:TEST1,test_project - test_plan,just a test 
plan,http://54.172.92.89:8085/rest/api/latest/plan/TEST1-TEST1,,
diff --git a/backend/plugins/bamboo/e2e/snapshot_tables/cicd_tasks.csv 
b/backend/plugins/bamboo/e2e/snapshot_tables/cicd_tasks.csv
index 4dd1dff7d..5ca91429b 100644
--- a/backend/plugins/bamboo/e2e/snapshot_tables/cicd_tasks.csv
+++ b/backend/plugins/bamboo/e2e/snapshot_tables/cicd_tasks.csv
@@ -1,10 +1,3 @@
 
id,name,pipeline_id,result,status,type,environment,duration_sec,started_date,finished_date,cicd_scope_id
-bamboo:BambooJobBuild:3:TEST1-TEST1-JOB1-22,Default 
Job,bamboo:BambooPlanBuild:3:TEST1-TEST1-22,SUCCESS,DONE,,,0,2023-02-22T08:31:51.580+00:00,2023-02-22T08:31:51.590+00:00,bamboo:BambooProject:3:TEST1
-bamboo:BambooJobBuild:3:TEST1-TEST1-JOB1-23,Default 
Job,bamboo:BambooPlanBuild:3:TEST1-TEST1-23,SUCCESS,DONE,,,0,2023-02-22T08:31:54.768+00:00,2023-02-22T08:31:54.778+00:00,bamboo:BambooProject:3:TEST1
-bamboo:BambooJobBuild:3:TEST1-TEST2-JOB1-2,Default 
Job,bamboo:BambooPlanBuild:3:TEST1-TEST2-2,FAILURE,DONE,,,0,2023-02-22T08:57:02.876+00:00,2023-02-22T08:57:02.879+00:00,bamboo:BambooProject:3:TEST1
-bamboo:BambooJobBuild:3:TEST1-TEST2-JOB1-3,compile,bamboo:BambooPlanBuild:3:TEST1-TEST2-3,FAILURE,DONE,DEPLOYMENT,PRODUCTION,0,2023-02-22T08:57:06.722+00:00,2023-02-22T08:57:06.725+00:00,bamboo:BambooProject:3:TEST1
-bamboo:BambooJobBuild:3:TEST1-TEST3-JOB1-2,Default 
Job,bamboo:BambooPlanBuild:3:TEST1-TEST3-2,FAILURE,DONE,,,0,2023-02-22T08:55:21.897+00:00,2023-02-22T08:55:21.901+00:00,bamboo:BambooProject:3:TEST1
-bamboo:BambooJobBuild:3:TEST1-TEST3-JOB1-3,Default 
Job,bamboo:BambooPlanBuild:3:TEST1-TEST3-3,FAILURE,DONE,,,0,2023-02-22T08:55:25.123+00:00,2023-02-22T08:55:25.126+00:00,bamboo:BambooProject:3:TEST1
-bamboo:BambooJobBuild:3:TEST1-TEST4-JOB1-1,Default 
Job,bamboo:BambooPlanBuild:3:TEST1-TEST4-1,FAILURE,DONE,,,0,2023-02-22T08:56:25.943+00:00,2023-02-22T08:56:25.947+00:00,bamboo:BambooProject:3:TEST1
-bamboo:BambooJobBuild:3:TEST1-TEST4-JOB1-2,Default 
Job,bamboo:BambooPlanBuild:3:TEST1-TEST4-2,FAILURE,DONE,,,0,2023-02-22T08:56:27.888+00:00,2023-02-22T08:56:27.891+00:00,bamboo:BambooProject:3:TEST1
-bamboo:BambooJobBuild:3:TEST1-TEST4-JOB1-3,compile,bamboo:BambooPlanBuild:3:TEST1-TEST4-3,FAILURE,DONE,DEPLOYMENT,PRODUCTION,0,2023-02-22T08:57:01.230+00:00,2023-02-22T08:57:01.234+00:00,bamboo:BambooProject:3:TEST1
+bamboo:BambooJobBuild:1:TEST-PLA3-JOB1-1,Default 
Job,bamboo:BambooPlanBuild:1:TEST-PLA3-1,SUCCESS,DONE,,,0,2023-07-27T03:47:13.626+00:00,2023-07-27T03:47:13.750+00:00,bamboo:BambooPlan:1:TEST-PLA3
+bamboo:BambooJobBuild:1:TEST-PLA3-JOB1-2,Default 
Job,bamboo:BambooPlanBuild:1:TEST-PLA3-2,SUCCESS,DONE,,,0,2023-07-27T03:56:15.783+00:00,2023-07-27T03:56:15.789+00:00,bamboo:BambooPlan:1:TEST-PLA3
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 5ba0f3921..69500534a 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-TEST1,,IN_PROGRESS,DEPLOYMENT,PRODUCTION,0,2023-03-10T12:15:45.000+00:00,2023-03-10T12:15:46.000+00:00,bamboo:BambooProject:1:TEST1
-bamboo:BambooDeployBuild:1:1769474,release-2,bamboo:BambooPlanBuild:1:TEST1-TEST1,,IN_PROGRESS,DEPLOYMENT,PRODUCTION,0,2023-03-10T12:27:28.000+00:00,2023-03-10T12:27:28.000+00:00,bamboo:BambooProject:1:TEST1
-bamboo:BambooDeployBuild:1:1769475,release-2,bamboo:BambooPlanBuild:1:TEST1-TEST1,,IN_PROGRESS,DEPLOYMENT,PRODUCTION,0,2023-03-10T12:27:56.000+00:00,2023-03-10T12:27:56.000+00:00,bamboo:BambooProject:1:TEST1
-bamboo:BambooDeployBuild:1:1769476,release-2,bamboo:BambooPlanBuild:1:TEST1-TEST1,,IN_PROGRESS,DEPLOYMENT,PRODUCTION,0,2023-03-10T12:28:12.000+00:00,2023-03-10T12:28:12.000+00:00,bamboo:BambooProject:1:TEST1
-bamboo:BambooDeployBuild:1:1769477,release-1,bamboo:BambooPlanBuild:1:TEST1-TEST1,,IN_PROGRESS,DEPLOYMENT,PRODUCTION,0,2023-03-10T12:29:08.000+00:00,2023-03-10T12:29:09.000+00:00,bamboo:BambooProject:1:TEST1
-bamboo:BambooDeployBuild:1:1769478,release-1,bamboo:BambooPlanBuild:1:TEST1-TEST1,,IN_PROGRESS,DEPLOYMENT,PRODUCTION,0,2023-03-10T12:29:28.000+00:00,2023-03-10T12:29:28.000+00:00,bamboo:BambooProject:1:TEST1
-bamboo:BambooDeployBuild:1:1769479,release-3,bamboo:BambooPlanBuild:1:TEST1-TEST1,,IN_PROGRESS,DEPLOYMENT,PRODUCTION,0,2023-03-10T12:30:37.000+00:00,2023-03-10T12:30:37.000+00:00,bamboo:BambooProject:1:TEST1
-bamboo:BambooDeployBuild:1:1769480,release-3,bamboo:BambooPlanBuild:1:TEST1-TEST1,,IN_PROGRESS,DEPLOYMENT,PRODUCTION,0,2023-03-10T12:30:49.000+00:00,2023-03-10T12:30:49.000+00:00,bamboo:BambooProject:1:TEST1
-bamboo:BambooDeployBuild:1:1769481,release-2,bamboo:BambooPlanBuild:1:TEST1-TEST1,,IN_PROGRESS,DEPLOYMENT,PRODUCTION,0,2023-03-13T09:43:26.000+00:00,2023-03-13T09:43:26.000+00:00,bamboo:BambooProject:1:TEST1
+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
diff --git a/backend/plugins/bamboo/impl/impl.go 
b/backend/plugins/bamboo/impl/impl.go
index 1b9484263..120c36294 100644
--- a/backend/plugins/bamboo/impl/impl.go
+++ b/backend/plugins/bamboo/impl/impl.go
@@ -57,7 +57,7 @@ func (p Bamboo) Connection() dal.Tabler {
 }
 
 func (p Bamboo) Scope() plugin.ToolLayerScope {
-       return &models.BambooProject{}
+       return &models.BambooPlan{}
 }
 
 func (p Bamboo) ScopeConfig() dal.Tabler {
@@ -71,7 +71,6 @@ func (p Bamboo) MakeDataSourcePipelinePlanV200(connectionId 
uint64, scopes []*pl
 func (p Bamboo) GetTablesInfo() []dal.Tabler {
        return []dal.Tabler{
                &models.BambooConnection{},
-               &models.BambooProject{},
                &models.BambooPlan{},
                &models.BambooJob{},
                &models.BambooPlanBuild{},
@@ -94,23 +93,26 @@ func (p Bamboo) Name() string {
 func (p Bamboo) SubTaskMetas() []plugin.SubTaskMeta {
        // TODO add your sub task here
        return []plugin.SubTaskMeta{
-               tasks.CollectPlanMeta,
-               tasks.ExtractPlanMeta,
+               tasks.ConvertPlansMeta,
+
                tasks.CollectJobMeta,
                tasks.ExtractJobMeta,
+
                tasks.CollectPlanBuildMeta,
                tasks.ExtractPlanBuildMeta,
+
                tasks.CollectJobBuildMeta,
                tasks.ExtractJobBuildMeta,
+
                tasks.CollectDeployMeta,
                tasks.ExtractDeployMeta,
+
                tasks.CollectDeployBuildMeta,
                tasks.ExtractDeployBuildMeta,
 
                tasks.ConvertJobBuildsMeta,
                tasks.ConvertPlanBuildsMeta,
                tasks.ConvertPlanVcsMeta,
-               tasks.ConvertProjectsMeta,
                tasks.ConvertDeployBuildsMeta,
        }
 }
@@ -138,29 +140,19 @@ func (p Bamboo) PrepareTaskData(taskCtx 
plugin.TaskContext, options map[string]i
        if err != nil {
                return nil, errors.Default.Wrap(err, "unable to get Bamboo API 
client instance")
        }
-
-       if op.ProjectKey != "" {
-               var scope *models.BambooProject
+       if op.PlanKey != "" {
+               var scope *models.BambooPlan
                // support v100 & advance mode
                // If we still cannot find the record in db, we have to request 
from remote server and save it to db
                db := taskCtx.GetDal()
-               err = db.First(&scope, dal.Where("connection_id = ? AND 
project_key = ?", op.ConnectionId, op.ProjectKey))
-               if err != nil && db.IsErrorNotFound(err) {
-                       apiProject, err := api.GetApiProject(op.ProjectKey, 
apiClient)
-                       if err != nil {
-                               return nil, err
-                       }
-                       logger.Debug(fmt.Sprintf("Current project: %s", 
apiProject.Key))
-                       scope = 
apiProject.ConvertApiScope().(*models.BambooProject)
-                       scope.ConnectionId = op.ConnectionId
-                       err = taskCtx.GetDal().CreateIfNotExist(&scope)
-                       if err != nil {
-                               return nil, err
-                       }
+               err = db.First(&scope, dal.Where("connection_id = ? AND 
plan_key = ?", op.ConnectionId, op.PlanKey))
+               if err != nil {
+                       return nil, err
                }
+
                op.ScopeConfigId = scope.ScopeConfigId
                if err != nil {
-                       return nil, errors.Default.Wrap(err, fmt.Sprintf("fail 
to find project: %s", op.ProjectKey))
+                       return nil, errors.Default.Wrap(err, fmt.Sprintf("fail 
to find plan: %s", op.PlanKey))
                }
        }
 
diff --git a/backend/plugins/bamboo/models/deploy_build.go 
b/backend/plugins/bamboo/models/deploy_build.go
index a6b0164d1..41885d63e 100644
--- a/backend/plugins/bamboo/models/deploy_build.go
+++ b/backend/plugins/bamboo/models/deploy_build.go
@@ -65,7 +65,7 @@ type ApiBambooDeployBuild struct {
 func (api *ApiBambooDeployBuild) Convert(op *BambooOptions) *BambooDeployBuild 
{
        return &BambooDeployBuild{
                ConnectionId:          op.ConnectionId,
-               ProjectKey:            op.ProjectKey,
+               PlanKey:               op.PlanKey,
                DeploymentVersionName: api.DeploymentVersionName,
                DeployBuildId:         api.Id,
                DeploymentState:       api.DeploymentState,
diff --git a/backend/plugins/bamboo/models/migrationscripts/register.go 
b/backend/plugins/bamboo/models/migrationscripts/20230725_add_scopeConfigId_to_plan.go
similarity index 56%
copy from backend/plugins/bamboo/models/migrationscripts/register.go
copy to 
backend/plugins/bamboo/models/migrationscripts/20230725_add_scopeConfigId_to_plan.go
index b526b2ce6..85aad16c5 100644
--- a/backend/plugins/bamboo/models/migrationscripts/register.go
+++ 
b/backend/plugins/bamboo/models/migrationscripts/20230725_add_scopeConfigId_to_plan.go
@@ -18,16 +18,31 @@ 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/core/plugin"
 )
 
-// All return all the migration scripts
-func All() []plugin.MigrationScript {
-       return []plugin.MigrationScript{
-               new(addInitTables),
-               new(addConnectionIdToTransformationRule),
-               new(addTypeAndEnvironment),
-               new(renameTr2ScopeConfig),
-               new(addRawParamTableForScope),
-       }
+var _ plugin.MigrationScript = (*addRawParamTableForScope)(nil)
+
+type plan20230725 struct {
+       ScopeConfigId uint64 `json:"scopeConfigId"`
+}
+
+func (plan20230725) TableName() string {
+       return "_tool_bamboo_plans"
+}
+
+type addScopeConfigId struct{}
+
+func (script *addScopeConfigId) Up(basicRes context.BasicRes) errors.Error {
+       return basicRes.GetDal().AutoMigrate(&plan20230725{})
+}
+
+func (*addScopeConfigId) Version() uint64 {
+       return 20230725093602
+}
+
+func (script *addScopeConfigId) Name() string {
+       return "add scope_config_id to _tool_bamboo_plans"
 }
diff --git a/backend/plugins/bamboo/models/migrationscripts/register.go 
b/backend/plugins/bamboo/models/migrationscripts/register.go
index b526b2ce6..fc50db127 100644
--- a/backend/plugins/bamboo/models/migrationscripts/register.go
+++ b/backend/plugins/bamboo/models/migrationscripts/register.go
@@ -29,5 +29,6 @@ func All() []plugin.MigrationScript {
                new(addTypeAndEnvironment),
                new(renameTr2ScopeConfig),
                new(addRawParamTableForScope),
+               new(addScopeConfigId),
        }
 }
diff --git a/backend/plugins/bamboo/models/plan.go 
b/backend/plugins/bamboo/models/plan.go
index be877fe97..db29f5e23 100644
--- a/backend/plugins/bamboo/models/plan.go
+++ b/backend/plugins/bamboo/models/plan.go
@@ -19,71 +19,113 @@ package models
 
 import (
        "github.com/apache/incubator-devlake/core/models/common"
+       "github.com/apache/incubator-devlake/core/plugin"
 )
 
+var _ plugin.ToolLayerScope = (*BambooPlan)(nil)
+var _ plugin.ApiScope = (*ApiBambooPlan)(nil)
+
 type BambooPlan struct {
-       ConnectionId              uint64  `gorm:"primaryKey"`
-       PlanKey                   string  `json:"planKey" gorm:"primaryKey"`
-       Name                      string  `json:"name"`
-       Expand                    string  `json:"expand"`
-       ProjectKey                string  `json:"projectKey" gorm:"index"`
-       ProjectName               string  `json:"projectName"`
-       Description               string  `json:"description"`
-       ShortName                 string  `json:"shortName"`
-       BuildName                 string  `json:"buildName"`
-       ShortKey                  string  `json:"shortKey"`
-       Type                      string  `json:"type"`
-       Enabled                   bool    `json:"enabled"`
-       Href                      string  `json:"href"`
-       Rel                       string  `json:"rel"`
-       IsFavourite               bool    `json:"isFavourite"`
-       IsActive                  bool    `json:"isActive"`
-       IsBuilding                bool    `json:"isBuilding"`
-       AverageBuildTimeInSeconds float64 `json:"averageBuildTimeInSeconds"`
-       common.NoPKModel
+       ConnectionId              uint64  `json:"connectionId" 
mapstructure:"connectionId" gorm:"primaryKey"`
+       PlanKey                   string  `json:"planKey" 
mapstructure:"planKey" gorm:"primaryKey"`
+       Name                      string  `json:"name" mapstructure:"name"`
+       Expand                    string  `json:"expand" mapstructure:"expand"`
+       ProjectKey                string  `json:"projectKey" 
mapstructure:"projectKey" gorm:"index"`
+       ProjectName               string  `json:"projectName" 
mapstructure:"projectName"`
+       Description               string  `json:"description" 
mapstructure:"description"`
+       ShortName                 string  `json:"shortName" 
mapstructure:"shortName"`
+       BuildName                 string  `json:"buildName" 
mapstructure:"buildName"`
+       ShortKey                  string  `json:"shortKey" 
mapstructure:"shortKey"`
+       Type                      string  `json:"type" mapstructure:"type"`
+       Enabled                   bool    `json:"enabled" 
mapstructure:"enabled"`
+       Href                      string  `json:"href" mapstructure:"href"`
+       Rel                       string  `json:"rel" mapstructure:"rel"`
+       IsFavourite               bool    `json:"isFavourite" 
mapstructure:"isFavourite"`
+       IsActive                  bool    `json:"isActive" 
mapstructure:"isActive"`
+       IsBuilding                bool    `json:"isBuilding" 
mapstructure:"isBuilding"`
+       AverageBuildTimeInSeconds float64 `json:"averageBuildTimeInSeconds" 
mapstructure:"averageBuildTimeInSeconds"`
+       ScopeConfigId             uint64  `json:"scopeConfigId" 
mapstructure:"scopeConfigId"`
+       common.NoPKModel          `json:"-" mapstructure:"-"`
 }
 
-func (apiRes *ApiBambooPlan) Convert() *BambooPlan {
-       return &BambooPlan{
-               PlanKey:                   apiRes.Key,
-               Name:                      apiRes.Name,
-               Expand:                    apiRes.Expand,
-               ProjectKey:                apiRes.ProjectKey,
-               ProjectName:               apiRes.ProjectName,
-               Description:               apiRes.Description,
-               ShortName:                 apiRes.ShortName,
-               BuildName:                 apiRes.BuildName,
-               ShortKey:                  apiRes.ShortKey,
-               Type:                      apiRes.Type,
-               Enabled:                   apiRes.Enabled,
-               Href:                      apiRes.Href,
-               Rel:                       apiRes.Rel,
-               IsFavourite:               apiRes.IsFavourite,
-               IsActive:                  apiRes.IsActive,
-               IsBuilding:                apiRes.IsBuilding,
-               AverageBuildTimeInSeconds: apiRes.AverageBuildTimeInSeconds,
+func (p BambooPlan) ScopeId() string {
+       return p.PlanKey
+}
+
+func (p BambooPlan) ScopeName() string {
+       return p.Name
+}
+
+func (p BambooPlan) ScopeFullName() string {
+       return p.Name
+}
+
+func (p BambooPlan) ScopeParams() interface{} {
+       return &BambooApiParams{
+               ConnectionId: p.ConnectionId,
+               PlanKey:      p.PlanKey,
        }
 }
 
-func (BambooPlan) TableName() string {
+func (p BambooPlan) TableName() string {
        return "_tool_bamboo_plans"
 }
 
 type ApiBambooPlan struct {
-       Expand                    string `json:"expand"`
-       Description               string `json:"description"`
-       ShortName                 string `json:"shortName"`
-       BuildName                 string `json:"buildName"`
-       ShortKey                  string `json:"shortKey"`
-       Type                      string `json:"type"`
-       Enabled                   bool   `json:"enabled"`
-       ProjectKey                string `json:"projectKey"`
-       ProjectName               string `json:"projectName"`
-       ApiBambooLink             `json:"link"`
-       IsFavourite               bool    `json:"isFavourite"`
-       IsActive                  bool    `json:"isActive"`
-       IsBuilding                bool    `json:"isBuilding"`
-       AverageBuildTimeInSeconds float64 `json:"averageBuildTimeInSeconds"`
-       Key                       string  `json:"key"`
-       Name                      string  `json:"name"`
+       ShortName string `json:"shortName"`
+       ShortKey  string `json:"shortKey"`
+       Type      string `json:"type"`
+       Enabled   bool   `json:"enabled"`
+       Link      struct {
+               Href string `json:"href"`
+               Rel  string `json:"rel"`
+       } `json:"link"`
+       Key     string `json:"key"`
+       Name    string `json:"name"`
+       PlanKey struct {
+               Key string `json:"key"`
+       } `json:"planKey"`
+}
+
+//type ApiBambooPlan struct {
+//     Expand                    string `json:"expand"`
+//     Description               string `json:"description"`
+//     ShortName                 string `json:"shortName"`
+//     BuildName                 string `json:"buildName"`
+//     ShortKey                  string `json:"shortKey"`
+//     Type                      string `json:"type"`
+//     Enabled                   bool   `json:"enabled"`
+//     ProjectKey                string `json:"projectKey"`
+//     ProjectName               string `json:"projectName"`
+//     ApiBambooLink             `json:"link"`
+//     IsFavourite               bool    `json:"isFavourite"`
+//     IsActive                  bool    `json:"isActive"`
+//     IsBuilding                bool    `json:"isBuilding"`
+//     AverageBuildTimeInSeconds float64 `json:"averageBuildTimeInSeconds"`
+//     Key                       string  `json:"key"`
+//     Name                      string  `json:"name"`
+//}
+
+func (p ApiBambooPlan) ConvertApiScope() plugin.ToolLayerScope {
+       return &BambooPlan{
+               PlanKey:   p.Key,
+               Name:      p.Name,
+               ShortName: p.ShortName,
+               ShortKey:  p.ShortKey,
+               Type:      p.Type,
+               Enabled:   p.Enabled,
+               Href:      p.Link.Href,
+               Rel:       p.Link.Rel,
+       }
+}
+
+type ApiSearchResult struct {
+       Id         string        `json:"id"`
+       EntityType string        `json:"entityType"`
+       Entity     ApiBambooPlan `json:"entity"`
+}
+
+type ApiBambooSearchPlanResponse struct {
+       ApiBambooSizeData `json:"squash"`
+       SearchResults     []ApiSearchResult `json:"searchResults"`
 }
diff --git a/backend/plugins/bamboo/models/project.go 
b/backend/plugins/bamboo/models/project.go
deleted file mode 100644
index 2e8cca041..000000000
--- a/backend/plugins/bamboo/models/project.go
+++ /dev/null
@@ -1,118 +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 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"
-)
-
-var _ plugin.ToolLayerScope = (*BambooProject)(nil)
-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"`
-       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 {
-       return p.ProjectKey
-}
-
-func (p BambooProject) ScopeName() string {
-       return p.Name
-}
-
-func (p BambooProject) ScopeFullName() string {
-       return p.Name
-}
-
-func (p BambooProject) ScopeParams() interface{} {
-       return &BambooApiParams{
-               ConnectionId: p.ConnectionId,
-               ProjectKey:   p.ProjectKey,
-       }
-}
-
-func (BambooProject) TableName() string {
-       return "_tool_bamboo_projects"
-}
-
-type ApiBambooPlans struct {
-       ApiBambooSizeData `json:"squash"`
-       Plan              []json.RawMessage `json:"plan"`
-}
-
-type ApiBambooProject struct {
-       Key         string         `json:"key"`
-       Expand      string         `json:"expand"`
-       Name        string         `json:"name"`
-       Description string         `json:"description"`
-       Link        ApiBambooLink  `json:"link"`
-       Plans       ApiBambooPlans `json:"plans"`
-}
-
-type ApiBambooProjects struct {
-       ApiBambooSizeData `json:"squash"`
-       Expand            string             `json:"expand"`
-       Link              ApiBambooLink      `json:"link"`
-       Projects          []ApiBambooProject `json:"project"`
-}
-
-type ApiBambooProjectResponse struct {
-       Expand   string            `json:"expand"`
-       Link     ApiBambooLink     `json:"link"`
-       Projects ApiBambooProjects `json:"projects"`
-}
-
-type ApiSearchEntityProject struct {
-       Id          string `json:"id"`
-       Key         string `json:"key"`
-       ProjectName string `json:"projectName"`
-       Description string `json:"description"`
-}
-
-type ApiSearchResultProjects struct {
-       Id           string                 `json:"id"`
-       Type         string                 `json:"type"`
-       SearchEntity ApiSearchEntityProject `json:"searchResults"`
-}
-
-type ApiBambooSearchProjectResponse struct {
-       ApiBambooSizeData `json:"squash"`
-       SearchResults     []ApiSearchResultProjects `json:"searchResults"`
-}
-
-func (apiProject ApiBambooProject) ConvertApiScope() plugin.ToolLayerScope {
-       b := &BambooProject{}
-       b.ProjectKey = apiProject.Key
-       b.Name = apiProject.Name
-       b.Description = apiProject.Description
-       b.Href = apiProject.Link.Href
-       return b
-}
diff --git a/backend/plugins/bamboo/models/task.go 
b/backend/plugins/bamboo/models/task.go
index 84dc69648..a3578cf80 100644
--- a/backend/plugins/bamboo/models/task.go
+++ b/backend/plugins/bamboo/models/task.go
@@ -19,7 +19,7 @@ package models
 
 type BambooApiParams struct {
        ConnectionId uint64 `json:"connectionId"`
-       ProjectKey   string
+       PlanKey      string
 }
 
 type BambooOptions struct {
@@ -28,7 +28,7 @@ type BambooOptions struct {
        // 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"`
+       PlanKey            string   `json:"planKey"`
        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_collector.go 
b/backend/plugins/bamboo/tasks/deploy_build_collector.go
index 53a4d2bb5..6d3fbf2c6 100644
--- a/backend/plugins/bamboo/tasks/deploy_build_collector.go
+++ b/backend/plugins/bamboo/tasks/deploy_build_collector.go
@@ -36,17 +36,16 @@ const RAW_DEPLOY_BUILD_TABLE = "bamboo_api_deploy_build"
 var _ plugin.SubTaskEntryPoint = CollectDeployBuild
 
 type InputForEnv struct {
-       EnvId   uint64 `json:"env_id"`
-       PlanKey string `json:"plan_key"`
+       EnvId uint64 `json:"env_id"`
 }
 
 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,plan_key"),
+               dal.Select("env_id"),
                dal.From(models.BambooDeployEnvironment{}.TableName()),
-               dal.Where("project_key = ? and connection_id=?", 
data.Options.ProjectKey, data.Options.ConnectionId),
+               dal.Where("plan_key = ? and connection_id=?", 
data.Options.PlanKey, data.Options.ConnectionId),
        }
        cursor, err := db.Cursor(
                clauses...,
diff --git a/backend/plugins/bamboo/tasks/deploy_build_convertor.go 
b/backend/plugins/bamboo/tasks/deploy_build_convertor.go
index 92ac75a5e..930d67cc3 100644
--- a/backend/plugins/bamboo/tasks/deploy_build_convertor.go
+++ b/backend/plugins/bamboo/tasks/deploy_build_convertor.go
@@ -50,7 +50,7 @@ func ConvertDeployBuilds(taskCtx plugin.SubTaskContext) 
errors.Error {
        }
        cursor, err := db.Cursor(
                dal.From(&models.BambooDeployBuild{}),
-               dal.Where("connection_id = ? and project_key = ?", 
data.Options.ConnectionId, data.Options.ProjectKey))
+               dal.Where("connection_id = ? and plan_key = ?", 
data.Options.ConnectionId, data.Options.PlanKey))
        if err != nil {
                return err
        }
@@ -58,7 +58,7 @@ func ConvertDeployBuilds(taskCtx plugin.SubTaskContext) 
errors.Error {
 
        deployBuildIdGen := 
didgen.NewDomainIdGenerator(&models.BambooDeployBuild{})
        planBuildIdGen := didgen.NewDomainIdGenerator(&models.BambooPlanBuild{})
-       projectIdGen := didgen.NewDomainIdGenerator(&models.BambooProject{})
+       planIdGen := didgen.NewDomainIdGenerator(&models.BambooPlan{})
 
        converter, err := api.NewDataConverter(api.DataConverterArgs{
                InputRowType:       reflect.TypeOf(models.BambooDeployBuild{}),
@@ -71,7 +71,7 @@ func ConvertDeployBuilds(taskCtx plugin.SubTaskContext) 
errors.Error {
                                        Id: 
deployBuildIdGen.Generate(data.Options.ConnectionId, deployBuild.DeployBuildId),
                                },
                                PipelineId:  
planBuildIdGen.Generate(data.Options.ConnectionId, deployBuild.PlanKey),
-                               CicdScopeId: 
projectIdGen.Generate(data.Options.ConnectionId, deployBuild.ProjectKey),
+                               CicdScopeId: 
planIdGen.Generate(data.Options.ConnectionId, data.Options.PlanKey),
 
                                Name: deployBuild.DeploymentVersionName,
 
diff --git a/backend/plugins/bamboo/tasks/deploy_build_extractor.go 
b/backend/plugins/bamboo/tasks/deploy_build_extractor.go
index 01022c312..e7a4ba9ba 100644
--- a/backend/plugins/bamboo/tasks/deploy_build_extractor.go
+++ b/backend/plugins/bamboo/tasks/deploy_build_extractor.go
@@ -48,7 +48,7 @@ func ExtractDeployBuild(taskCtx plugin.SubTaskContext) 
errors.Error {
                        }
 
                        build := res.Convert(data.Options)
-                       build.PlanKey = input.PlanKey
+                       build.PlanKey = data.Options.PlanKey
                        build.Environment = 
data.RegexEnricher.ReturnNameIfMatched(devops.PRODUCTION, 
build.DeploymentVersionName)
 
                        return []interface{}{
diff --git a/backend/plugins/bamboo/tasks/deploy_extractor.go 
b/backend/plugins/bamboo/tasks/deploy_extractor.go
index f02e51726..e375fc709 100644
--- a/backend/plugins/bamboo/tasks/deploy_extractor.go
+++ b/backend/plugins/bamboo/tasks/deploy_extractor.go
@@ -20,7 +20,6 @@ package tasks
 import (
        "encoding/json"
 
-       "github.com/apache/incubator-devlake/core/dal"
        "github.com/apache/incubator-devlake/core/errors"
        "github.com/apache/incubator-devlake/core/plugin"
        helper "github.com/apache/incubator-devlake/helpers/pluginhelper/api"
@@ -32,31 +31,6 @@ var _ plugin.SubTaskEntryPoint = ExtractDeploy
 func ExtractDeploy(taskCtx plugin.SubTaskContext) errors.Error {
        rawDataSubTaskArgs, data := CreateRawDataSubTaskArgs(taskCtx, 
RAW_DEPLOY_TABLE)
 
-       db := taskCtx.GetDal()
-       clauses := []dal.Clause{
-               dal.Select("plan_key"),
-               dal.From(models.BambooPlan{}.TableName()),
-               dal.Where("project_key = ? and connection_id=?", 
data.Options.ProjectKey, data.Options.ConnectionId),
-       }
-       cursor, err := db.Cursor(
-               clauses...,
-       )
-       if err != nil {
-               return err
-       }
-       defer cursor.Close()
-
-       Plans := make(map[string]bool)
-
-       for cursor.Next() {
-               Plan := &models.BambooPlan{}
-               err = db.Fetch(cursor, Plan)
-               if err != nil {
-                       return err
-               }
-               Plans[Plan.PlanKey] = true
-       }
-
        extractor, err := helper.NewApiExtractor(helper.ApiExtractorArgs{
                RawDataSubTaskArgs: *rawDataSubTaskArgs,
                Extract: func(resData *helper.RawData) ([]interface{}, 
errors.Error) {
@@ -65,28 +39,17 @@ func ExtractDeploy(taskCtx plugin.SubTaskContext) 
errors.Error {
                        if err != nil {
                                return nil, err
                        }
-                       plan := &SimplePlan{}
-                       err = errors.Convert(json.Unmarshal(resData.Input, 
plan))
 
-                       if err != nil {
-                               return nil, err
-                       }
-
-                       results := make([]interface{}, 0, len(res.Environments))
-
-                       if Plans[res.PlanKey.Key] {
-                               for _, env := range res.Environments {
-                                       body := 
&models.BambooDeployEnvironment{}
-
-                                       body.Convert(&env)
-                                       body.ConnectionId = 
data.Options.ConnectionId
-                                       body.ProjectKey = 
data.Options.ProjectKey
-                                       body.PlanKey = res.PlanKey.Key
-
-                                       results = append(results, body)
+                       var results []interface{}
+                       if res.PlanKey.Key == data.Options.PlanKey {
+                               for _, apiEnv := range res.Environments {
+                                       env := 
new(models.BambooDeployEnvironment)
+                                       env.Convert(&apiEnv)
+                                       env.ConnectionId = 
data.Options.ConnectionId
+                                       env.PlanKey = res.PlanKey.Key
+                                       results = append(results, env)
                                }
                        }
-
                        return results, nil
                },
        })
diff --git a/backend/plugins/bamboo/tasks/job_build_collector.go 
b/backend/plugins/bamboo/tasks/job_build_collector.go
index 2a467f07f..256feafff 100644
--- a/backend/plugins/bamboo/tasks/job_build_collector.go
+++ b/backend/plugins/bamboo/tasks/job_build_collector.go
@@ -43,7 +43,7 @@ func CollectJobBuild(taskCtx plugin.SubTaskContext) 
errors.Error {
        clauses := []dal.Clause{
                dal.Select("job_key, plan_name, plan_key"),
                dal.From(models.BambooJob{}.TableName()),
-               dal.Where("project_key = ? and connection_id=?", 
data.Options.ProjectKey, data.Options.ConnectionId),
+               dal.Where("plan_key = ? and connection_id=?", 
data.Options.PlanKey, data.Options.ConnectionId),
        }
        cursor, err := db.Cursor(
                clauses...,
diff --git a/backend/plugins/bamboo/tasks/job_build_convertor.go 
b/backend/plugins/bamboo/tasks/job_build_convertor.go
index 8ef924b6d..88933d843 100644
--- a/backend/plugins/bamboo/tasks/job_build_convertor.go
+++ b/backend/plugins/bamboo/tasks/job_build_convertor.go
@@ -43,7 +43,7 @@ func ConvertJobBuilds(taskCtx plugin.SubTaskContext) 
errors.Error {
        rawDataSubTaskArgs, data := CreateRawDataSubTaskArgs(taskCtx, 
RAW_JOB_BUILD_TABLE)
        cursor, err := db.Cursor(
                dal.From(&models.BambooJobBuild{}),
-               dal.Where("connection_id = ? and project_key = ?", 
data.Options.ConnectionId, data.Options.ProjectKey))
+               dal.Where("connection_id = ? and plan_key = ?", 
data.Options.ConnectionId, data.Options.PlanKey))
        if err != nil {
                return err
        }
@@ -51,7 +51,7 @@ func ConvertJobBuilds(taskCtx plugin.SubTaskContext) 
errors.Error {
 
        jobBuildIdGen := didgen.NewDomainIdGenerator(&models.BambooJobBuild{})
        planBuildIdGen := didgen.NewDomainIdGenerator(&models.BambooPlanBuild{})
-       projectIdGen := didgen.NewDomainIdGenerator(&models.BambooProject{})
+       planIdGen := didgen.NewDomainIdGenerator(&models.BambooPlan{})
 
        converter, err := api.NewDataConverter(api.DataConverterArgs{
                InputRowType:       reflect.TypeOf(models.BambooJobBuild{}),
@@ -59,13 +59,16 @@ func ConvertJobBuilds(taskCtx plugin.SubTaskContext) 
errors.Error {
                RawDataSubTaskArgs: *rawDataSubTaskArgs,
                Convert: func(inputRow interface{}) ([]interface{}, 
errors.Error) {
                        line := inputRow.(*models.BambooJobBuild)
+                       if line.BuildStartedTime == nil {
+                               return nil, nil
+                       }
                        domainJobBuild := &devops.CICDTask{
                                DomainEntity: domainlayer.DomainEntity{Id: 
jobBuildIdGen.Generate(data.Options.ConnectionId, line.JobBuildKey)},
                                Name:         line.JobName,
                                StartedDate:  *line.BuildStartedTime,
                                FinishedDate: line.BuildCompletedDate,
                                PipelineId:   
planBuildIdGen.Generate(data.Options.ConnectionId, line.PlanBuildKey),
-                               CicdScopeId:  
projectIdGen.Generate(data.Options.ConnectionId, line.ProjectKey),
+                               CicdScopeId:  
planIdGen.Generate(data.Options.ConnectionId, data.Options.PlanKey),
 
                                Result: devops.GetResult(&devops.ResultRule{
                                        Failed:  []string{"Failed"},
diff --git a/backend/plugins/bamboo/tasks/job_build_extractor.go 
b/backend/plugins/bamboo/tasks/job_build_extractor.go
index 2cca09dc9..e4de12eec 100644
--- a/backend/plugins/bamboo/tasks/job_build_extractor.go
+++ b/backend/plugins/bamboo/tasks/job_build_extractor.go
@@ -48,9 +48,8 @@ func ExtractJobBuild(taskCtx plugin.SubTaskContext) 
errors.Error {
                        }
                        body := res.Convert()
                        body.ConnectionId = data.Options.ConnectionId
-                       body.ProjectKey = data.Options.ProjectKey
                        body.JobKey = plan.JobKey
-                       body.PlanKey = plan.PlanKey
+                       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)
diff --git a/backend/plugins/bamboo/tasks/job_collector.go 
b/backend/plugins/bamboo/tasks/job_collector.go
index d173c4db0..3425d93ae 100644
--- a/backend/plugins/bamboo/tasks/job_collector.go
+++ b/backend/plugins/bamboo/tasks/job_collector.go
@@ -20,15 +20,12 @@ package tasks
 import (
        "encoding/json"
        "fmt"
-       "net/http"
-       "net/url"
-       "reflect"
-
-       "github.com/apache/incubator-devlake/core/dal"
        "github.com/apache/incubator-devlake/core/errors"
        "github.com/apache/incubator-devlake/core/plugin"
        helper "github.com/apache/incubator-devlake/helpers/pluginhelper/api"
        "github.com/apache/incubator-devlake/plugins/bamboo/models"
+       "net/http"
+       "net/url"
 )
 
 const RAW_JOB_TABLE = "bamboo_api_job"
@@ -41,29 +38,11 @@ type SimplePlan struct {
 
 func CollectJob(taskCtx plugin.SubTaskContext) errors.Error {
        rawDataSubTaskArgs, data := CreateRawDataSubTaskArgs(taskCtx, 
RAW_JOB_TABLE)
-       db := taskCtx.GetDal()
-       clauses := []dal.Clause{
-               dal.Select("plan_key"),
-               dal.From(models.BambooPlan{}.TableName()),
-               dal.Where("project_key = ? and connection_id=?", 
data.Options.ProjectKey, data.Options.ConnectionId),
-       }
-       cursor, err := db.Cursor(
-               clauses...,
-       )
-       if err != nil {
-               return err
-       }
-       iterator, err := helper.NewDalCursorIterator(db, cursor, 
reflect.TypeOf(SimplePlan{}))
-       if err != nil {
-               return err
-       }
-
        collector, err := helper.NewApiCollector(helper.ApiCollectorArgs{
                RawDataSubTaskArgs: *rawDataSubTaskArgs,
                ApiClient:          data.ApiClient,
                PageSize:           100,
-               Input:              iterator,
-               UrlTemplate:        "search/jobs/{{ .Input.PlanKey }}.json",
+               UrlTemplate:        fmt.Sprintf("search/jobs/%s.json", 
data.Options.PlanKey),
                Query: func(reqData *helper.RequestData) (url.Values, 
errors.Error) {
                        query := url.Values{}
                        query.Set("showEmpty", fmt.Sprintf("%v", true))
@@ -74,7 +53,7 @@ func CollectJob(taskCtx plugin.SubTaskContext) errors.Error {
                },
                GetTotalPages: func(res *http.Response, args 
*helper.ApiCollectorArgs) (int, errors.Error) {
                        body := models.ApiBambooSizeData{}
-                       err = helper.UnmarshalResponse(res, &body)
+                       err := helper.UnmarshalResponse(res, &body)
                        if err != nil {
                                return 0, err
                        }
@@ -85,7 +64,7 @@ func CollectJob(taskCtx plugin.SubTaskContext) errors.Error {
                        var results struct {
                                SearchResults []json.RawMessage 
`json:"searchResults"`
                        }
-                       err = helper.UnmarshalResponse(res, &results)
+                       err := helper.UnmarshalResponse(res, &results)
                        if err != nil {
                                return nil, err
                        }
diff --git a/backend/plugins/bamboo/tasks/job_extractor.go 
b/backend/plugins/bamboo/tasks/job_extractor.go
index 8bfeb9f89..35929b967 100644
--- a/backend/plugins/bamboo/tasks/job_extractor.go
+++ b/backend/plugins/bamboo/tasks/job_extractor.go
@@ -40,15 +40,9 @@ func ExtractJob(taskCtx plugin.SubTaskContext) errors.Error {
                        if err != nil {
                                return nil, err
                        }
-                       plan := &SimplePlan{}
-                       err = errors.Convert(json.Unmarshal(resData.Input, 
plan))
-                       if err != nil {
-                               return nil, err
-                       }
                        body := res.Convert()
                        body.ConnectionId = data.Options.ConnectionId
-                       body.ProjectKey = data.Options.ProjectKey
-                       body.PlanKey = plan.PlanKey
+                       body.PlanKey = data.Options.PlanKey
                        return []interface{}{body}, nil
                },
        })
diff --git a/backend/plugins/bamboo/tasks/plan_build_collector.go 
b/backend/plugins/bamboo/tasks/plan_build_collector.go
index bcfd5f968..7443279d5 100644
--- a/backend/plugins/bamboo/tasks/plan_build_collector.go
+++ b/backend/plugins/bamboo/tasks/plan_build_collector.go
@@ -18,13 +18,11 @@ limitations under the License.
 package tasks
 
 import (
-       "reflect"
+       "fmt"
 
-       "github.com/apache/incubator-devlake/core/dal"
        "github.com/apache/incubator-devlake/core/errors"
        "github.com/apache/incubator-devlake/core/plugin"
        helper "github.com/apache/incubator-devlake/helpers/pluginhelper/api"
-       "github.com/apache/incubator-devlake/plugins/bamboo/models"
 )
 
 const RAW_PLAN_BUILD_TABLE = "bamboo_api_plan_build"
@@ -33,33 +31,14 @@ var _ plugin.SubTaskEntryPoint = CollectPlanBuild
 
 func CollectPlanBuild(taskCtx plugin.SubTaskContext) errors.Error {
        rawDataSubTaskArgs, data := CreateRawDataSubTaskArgs(taskCtx, 
RAW_PLAN_BUILD_TABLE)
-       db := taskCtx.GetDal()
-       clauses := []dal.Clause{
-               dal.Select("plan_key"),
-               dal.From(models.BambooPlan{}.TableName()),
-               dal.Where("project_key = ? and connection_id=?", 
data.Options.ProjectKey, data.Options.ConnectionId),
-       }
-       cursor, err := db.Cursor(
-               clauses...,
-       )
-       if err != nil {
-               return err
-       }
-       iterator, err := helper.NewDalCursorIterator(db, cursor, 
reflect.TypeOf(SimplePlan{}))
-       if err != nil {
-               return err
-       }
-
        collector, err := helper.NewApiCollector(helper.ApiCollectorArgs{
                RawDataSubTaskArgs: *rawDataSubTaskArgs,
                ApiClient:          data.ApiClient,
                PageSize:           100,
-               Input:              iterator,
-               UrlTemplate:        "result/{{ .Input.PlanKey }}.json",
-
-               Query:          QueryForResult,
-               GetTotalPages:  GetTotalPagesFromResult,
-               ResponseParser: GetResultsResult,
+               UrlTemplate:        fmt.Sprintf("result/%s.json", 
data.Options.PlanKey),
+               Query:              QueryForResult,
+               GetTotalPages:      GetTotalPagesFromResult,
+               ResponseParser:     GetResultsResult,
        })
        if err != nil {
                return err
diff --git a/backend/plugins/bamboo/tasks/plan_build_convertor.go 
b/backend/plugins/bamboo/tasks/plan_build_convertor.go
index 25818b7e8..cda96e519 100644
--- a/backend/plugins/bamboo/tasks/plan_build_convertor.go
+++ b/backend/plugins/bamboo/tasks/plan_build_convertor.go
@@ -50,14 +50,14 @@ func ConvertPlanBuilds(taskCtx plugin.SubTaskContext) 
errors.Error {
        }
        cursor, err := db.Cursor(
                dal.From(&models.BambooPlanBuild{}),
-               dal.Where("connection_id = ? and project_key = ?", 
data.Options.ConnectionId, data.Options.ProjectKey))
+               dal.Where("connection_id = ? and plan_key = ?", 
data.Options.ConnectionId, data.Options.PlanKey))
        if err != nil {
                return err
        }
        defer cursor.Close()
 
        planBuildIdGen := didgen.NewDomainIdGenerator(&models.BambooPlanBuild{})
-       projectIdGen := didgen.NewDomainIdGenerator(&models.BambooProject{})
+       planIdGen := didgen.NewDomainIdGenerator(&models.BambooPlan{})
 
        converter, err := api.NewDataConverter(api.DataConverterArgs{
                InputRowType:       reflect.TypeOf(models.BambooPlanBuild{}),
@@ -65,13 +65,16 @@ func ConvertPlanBuilds(taskCtx plugin.SubTaskContext) 
errors.Error {
                RawDataSubTaskArgs: *rawDataSubTaskArgs,
                Convert: func(inputRow interface{}) ([]interface{}, 
errors.Error) {
                        line := inputRow.(*models.BambooPlanBuild)
+                       if line.BuildStartedTime == nil {
+                               return nil, nil
+                       }
                        domainPlanBuild := &devops.CICDPipeline{
                                DomainEntity: domainlayer.DomainEntity{Id: 
planBuildIdGen.Generate(data.Options.ConnectionId, line.PlanBuildKey)},
                                Name:         line.PlanName,
                                DurationSec:  
uint64(line.BuildDurationInSeconds),
                                CreatedDate:  *line.BuildStartedTime,
                                FinishedDate: line.BuildCompletedDate,
-                               CicdScopeId:  
projectIdGen.Generate(data.Options.ConnectionId, line.ProjectKey),
+                               CicdScopeId:  
planIdGen.Generate(data.Options.ConnectionId, data.Options.PlanKey),
 
                                Result: devops.GetResult(&devops.ResultRule{
                                        Failed:  []string{"Failed"},
diff --git a/backend/plugins/bamboo/tasks/plan_build_extractor.go 
b/backend/plugins/bamboo/tasks/plan_build_extractor.go
index 34cd30b86..6e4d3d314 100644
--- a/backend/plugins/bamboo/tasks/plan_build_extractor.go
+++ b/backend/plugins/bamboo/tasks/plan_build_extractor.go
@@ -41,15 +41,9 @@ func ExtractPlanBuild(taskCtx plugin.SubTaskContext) 
errors.Error {
                        if err != nil {
                                return nil, err
                        }
-                       plan := &SimplePlan{}
-                       err = errors.Convert(json.Unmarshal(resData.Input, 
plan))
-                       if err != nil {
-                               return nil, err
-                       }
                        body := res.Convert()
                        body.ConnectionId = data.Options.ConnectionId
-                       body.ProjectKey = data.Options.ProjectKey
-                       body.PlanKey = plan.PlanKey
+                       body.PlanKey = data.Options.PlanKey
                        body.Type = 
data.RegexEnricher.ReturnNameIfMatched(devops.DEPLOYMENT, body.PlanName)
                        body.Environment = 
data.RegexEnricher.ReturnNameIfMatched(devops.PRODUCTION, body.PlanName)
 
diff --git a/backend/plugins/bamboo/tasks/plan_collector.go 
b/backend/plugins/bamboo/tasks/plan_collector.go
deleted file mode 100644
index 287e4c2a5..000000000
--- a/backend/plugins/bamboo/tasks/plan_collector.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 tasks
-
-import (
-       "encoding/json"
-       "fmt"
-       "net/http"
-       "net/url"
-
-       "github.com/apache/incubator-devlake/core/errors"
-       "github.com/apache/incubator-devlake/core/plugin"
-       helper "github.com/apache/incubator-devlake/helpers/pluginhelper/api"
-       "github.com/apache/incubator-devlake/plugins/bamboo/models"
-)
-
-const RAW_PLAN_TABLE = "bamboo_api_plan"
-
-var _ plugin.SubTaskEntryPoint = CollectPlan
-
-func CollectPlan(taskCtx plugin.SubTaskContext) errors.Error {
-       rawDataSubTaskArgs, data := CreateRawDataSubTaskArgs(taskCtx, 
RAW_PLAN_TABLE)
-       collector, err := helper.NewApiCollector(helper.ApiCollectorArgs{
-               RawDataSubTaskArgs: *rawDataSubTaskArgs,
-               ApiClient:          data.ApiClient,
-               PageSize:           100,
-               UrlTemplate:        "project/{{ .Params.ProjectKey }}.json",
-               Query: func(reqData *helper.RequestData) (url.Values, 
errors.Error) {
-                       query := url.Values{}
-                       query.Set("showEmpty", fmt.Sprintf("%v", true))
-                       query.Set("expand", "plans.plan")
-                       query.Set("max-result", fmt.Sprintf("%v", 
reqData.Pager.Size))
-                       query.Set("start-index", fmt.Sprintf("%v", 
reqData.Pager.Skip))
-                       return query, nil
-               },
-               GetTotalPages: func(res *http.Response, args 
*helper.ApiCollectorArgs) (int, errors.Error) {
-                       var body struct {
-                               SizeInfo models.ApiBambooSizeData `json:"plans"`
-                       }
-                       err := helper.UnmarshalResponse(res, &body)
-                       if err != nil {
-                               return 0, err
-                       }
-                       return GetTotalPagesFromSizeInfo(&body.SizeInfo, args)
-               },
-
-               ResponseParser: func(res *http.Response) ([]json.RawMessage, 
errors.Error) {
-                       body := &models.ApiBambooProject{}
-                       err := helper.UnmarshalResponse(res, body)
-                       if err != nil {
-                               return nil, err
-                       }
-                       return body.Plans.Plan, nil
-               },
-       })
-       if err != nil {
-               return err
-       }
-       return collector.Execute()
-}
-
-var CollectPlanMeta = plugin.SubTaskMeta{
-       Name:             "CollectPlan",
-       EntryPoint:       CollectPlan,
-       EnabledByDefault: true,
-       Description:      "Collect Plan data from Bamboo api",
-       DomainTypes:      []string{plugin.DOMAIN_TYPE_CICD},
-}
diff --git a/backend/plugins/bamboo/tasks/plan_commit_convertor.go 
b/backend/plugins/bamboo/tasks/plan_commit_convertor.go
index aed4c95eb..2232ed1b3 100644
--- a/backend/plugins/bamboo/tasks/plan_commit_convertor.go
+++ b/backend/plugins/bamboo/tasks/plan_commit_convertor.go
@@ -50,7 +50,7 @@ func ConvertPlanVcs(taskCtx plugin.SubTaskContext) 
errors.Error {
        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`),
-               dal.Where("_tool_bamboo_plan_build_commits.connection_id = ? 
and _tool_bamboo_plan_builds.project_key = ?", data.Options.ConnectionId, 
data.Options.ProjectKey))
+               dal.Where("_tool_bamboo_plan_build_commits.connection_id = ? 
and _tool_bamboo_plan_builds.plan_key = ?", data.Options.ConnectionId, 
data.Options.PlanKey))
        if err != nil {
                return err
        }
diff --git a/backend/plugins/bamboo/tasks/project_convertor.go 
b/backend/plugins/bamboo/tasks/plan_convertor.go
similarity index 64%
rename from backend/plugins/bamboo/tasks/project_convertor.go
rename to backend/plugins/bamboo/tasks/plan_convertor.go
index 36a575b85..9e5a2051b 100644
--- a/backend/plugins/bamboo/tasks/project_convertor.go
+++ b/backend/plugins/bamboo/tasks/plan_convertor.go
@@ -20,52 +20,51 @@ package tasks
 import (
        "reflect"
 
-       "github.com/apache/incubator-devlake/core/models/domainlayer/devops"
-
        "github.com/apache/incubator-devlake/core/dal"
        "github.com/apache/incubator-devlake/core/errors"
        "github.com/apache/incubator-devlake/core/models/domainlayer"
+       "github.com/apache/incubator-devlake/core/models/domainlayer/devops"
        "github.com/apache/incubator-devlake/core/models/domainlayer/didgen"
        "github.com/apache/incubator-devlake/core/plugin"
        "github.com/apache/incubator-devlake/helpers/pluginhelper/api"
        bambooModels "github.com/apache/incubator-devlake/plugins/bamboo/models"
 )
 
-const RAW_PROJECT_TABLE = "bamboo_project"
+const RAW_PLAN_TABLE = "bamboo_plan"
 
-var ConvertProjectsMeta = plugin.SubTaskMeta{
-       Name:             "convertProjects",
-       EntryPoint:       ConvertProjects,
+var ConvertPlansMeta = plugin.SubTaskMeta{
+       Name:             "convertplans",
+       EntryPoint:       ConvertPlans,
        EnabledByDefault: true,
-       Description:      "Convert tool layer table bamboo_projects into  
domain layer table projects",
+       Description:      "Convert tool layer table bamboo_plans into  domain 
layer table plans",
        DomainTypes:      []string{plugin.DOMAIN_TYPE_CICD},
 }
 
-func ConvertProjects(taskCtx plugin.SubTaskContext) errors.Error {
+func ConvertPlans(taskCtx plugin.SubTaskContext) errors.Error {
        db := taskCtx.GetDal()
-       rawDataSubTaskArgs, data := CreateRawDataSubTaskArgs(taskCtx, 
RAW_PROJECT_TABLE)
-       cursor, err := db.Cursor(dal.From(bambooModels.BambooProject{}),
-               dal.Where("connection_id = ? and project_key = ?", 
data.Options.ConnectionId, data.Options.ProjectKey))
+       rawDataSubTaskArgs, data := CreateRawDataSubTaskArgs(taskCtx, 
RAW_PLAN_TABLE)
+       cursor, err := db.Cursor(dal.From(bambooModels.BambooPlan{}),
+               dal.Where("connection_id = ? and plan_key = ?", 
data.Options.ConnectionId, data.Options.PlanKey))
        if err != nil {
                return err
        }
        defer cursor.Close()
 
-       projectIdGen := 
didgen.NewDomainIdGenerator(&bambooModels.BambooProject{})
+       planIdGen := didgen.NewDomainIdGenerator(&bambooModels.BambooPlan{})
        converter, err := api.NewDataConverter(api.DataConverterArgs{
-               InputRowType:       
reflect.TypeOf(bambooModels.BambooProject{}),
+               InputRowType:       reflect.TypeOf(bambooModels.BambooPlan{}),
                Input:              cursor,
                RawDataSubTaskArgs: *rawDataSubTaskArgs,
                Convert: func(inputRow interface{}) ([]interface{}, 
errors.Error) {
-                       bambooProject := inputRow.(*bambooModels.BambooProject)
-                       domainProject := &devops.CicdScope{
-                               DomainEntity: domainlayer.DomainEntity{Id: 
projectIdGen.Generate(data.Options.ConnectionId, bambooProject.ProjectKey)},
-                               Name:         bambooProject.Name,
-                               Description:  bambooProject.Description,
-                               Url:          bambooProject.Href,
+                       bambooPlan := inputRow.(*bambooModels.BambooPlan)
+                       domainPlan := &devops.CicdScope{
+                               DomainEntity: domainlayer.DomainEntity{Id: 
planIdGen.Generate(data.Options.ConnectionId, bambooPlan.PlanKey)},
+                               Name:         bambooPlan.Name,
+                               Description:  bambooPlan.Description,
+                               Url:          bambooPlan.Href,
                        }
                        return []interface{}{
-                               domainProject,
+                               domainPlan,
                        }, nil
                },
        })
diff --git a/backend/plugins/bamboo/tasks/plan_extractor.go 
b/backend/plugins/bamboo/tasks/plan_extractor.go
deleted file mode 100644
index b04288378..000000000
--- a/backend/plugins/bamboo/tasks/plan_extractor.go
+++ /dev/null
@@ -1,61 +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 tasks
-
-import (
-       "encoding/json"
-
-       "github.com/apache/incubator-devlake/core/errors"
-       "github.com/apache/incubator-devlake/core/plugin"
-       helper "github.com/apache/incubator-devlake/helpers/pluginhelper/api"
-       "github.com/apache/incubator-devlake/plugins/bamboo/models"
-)
-
-var _ plugin.SubTaskEntryPoint = ExtractPlan
-
-func ExtractPlan(taskCtx plugin.SubTaskContext) errors.Error {
-       rawDataSubTaskArgs, data := CreateRawDataSubTaskArgs(taskCtx, 
RAW_PLAN_TABLE)
-
-       extractor, err := helper.NewApiExtractor(helper.ApiExtractorArgs{
-               RawDataSubTaskArgs: *rawDataSubTaskArgs,
-
-               Extract: func(resData *helper.RawData) ([]interface{}, 
errors.Error) {
-                       res := &models.ApiBambooPlan{}
-                       err := errors.Convert(json.Unmarshal(resData.Data, res))
-                       if err != nil {
-                               return nil, err
-                       }
-                       body := res.Convert()
-                       body.ConnectionId = data.Options.ConnectionId
-                       return []interface{}{body}, nil
-               },
-       })
-       if err != nil {
-               return err
-       }
-
-       return extractor.Execute()
-}
-
-var ExtractPlanMeta = plugin.SubTaskMeta{
-       Name:             "ExtractPlan",
-       EntryPoint:       ExtractPlan,
-       EnabledByDefault: true,
-       Description:      "Extract raw data into tool layer table bamboo_plan",
-       DomainTypes:      []string{plugin.DOMAIN_TYPE_CICD},
-}
diff --git a/backend/plugins/bamboo/tasks/shared.go 
b/backend/plugins/bamboo/tasks/shared.go
index 0f3a72346..96efc1660 100644
--- a/backend/plugins/bamboo/tasks/shared.go
+++ b/backend/plugins/bamboo/tasks/shared.go
@@ -37,7 +37,7 @@ func CreateRawDataSubTaskArgs(taskCtx plugin.SubTaskContext, 
rawTable string) (*
        *filteredData.Options = *data.Options
        var params = models.BambooApiParams{
                ConnectionId: data.Options.ConnectionId,
-               ProjectKey:   data.Options.ProjectKey,
+               PlanKey:      data.Options.PlanKey,
        }
        rawDataSubTaskArgs := &api.RawDataSubTaskArgs{
                Ctx:    taskCtx,


Reply via email to