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

klesh pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-devlake.git


The following commit(s) were added to refs/heads/main by this push:
     new b63489c50 refactor: add subtask register (#4896)
b63489c50 is described below

commit b63489c502c6a7043680847b98a031c89aaca327
Author: chenggui53 <[email protected]>
AuthorDate: Thu Jun 8 16:01:57 2023 +0800

    refactor: add subtask register (#4896)
    
    * refactor: add subtask register
    
    * refactor: add subtask register
    
    * refactor: add subtaask register
    
    ---------
    
    Co-authored-by: chenggui <[email protected]>
---
 backend/core/plugin/plugin_task.go                 |   1 +
 .../pluginhelper/subtaskmeta_sorter/dependency.go  | 118 +++++++++++++++++++++
 .../subtaskmeta_sorter/dependency_test.go          |  98 +++++++++++++++++
 .../pluginhelper/subtaskmeta_sorter/interface.go   |  24 +++++
 backend/plugins/gitlab/impl/impl.go                |  50 +++------
 backend/plugins/gitlab/tasks/account_collector.go  |   5 +
 backend/plugins/gitlab/tasks/account_convertor.go  |   5 +
 backend/plugins/gitlab/tasks/account_extractor.go  |   5 +
 backend/plugins/gitlab/tasks/commit_collector.go   |   5 +
 backend/plugins/gitlab/tasks/commit_convertor.go   |   5 +
 backend/plugins/gitlab/tasks/commit_extractor.go   |   5 +
 backend/plugins/gitlab/tasks/issue_collector.go    |   5 +
 backend/plugins/gitlab/tasks/issue_convertor.go    |   5 +
 backend/plugins/gitlab/tasks/issue_extractor.go    |   5 +
 .../plugins/gitlab/tasks/issue_label_convertor.go  |   9 +-
 backend/plugins/gitlab/tasks/job_collector.go      |   5 +
 backend/plugins/gitlab/tasks/job_convertor.go      |   5 +
 backend/plugins/gitlab/tasks/job_extractor.go      |   5 +
 backend/plugins/gitlab/tasks/mr_collector.go       |   5 +
 .../plugins/gitlab/tasks/mr_comment_convertor.go   |  11 +-
 .../plugins/gitlab/tasks/mr_commit_collector.go    |   5 +
 .../plugins/gitlab/tasks/mr_commit_convertor.go    |  11 +-
 .../plugins/gitlab/tasks/mr_commit_extractor.go    |   5 +
 backend/plugins/gitlab/tasks/mr_convertor.go       |   5 +
 .../plugins/gitlab/tasks/mr_detail_collector.go    |   5 +
 .../plugins/gitlab/tasks/mr_detail_extractor.go    |   5 +
 backend/plugins/gitlab/tasks/mr_enricher.go        |   5 +
 backend/plugins/gitlab/tasks/mr_extractor.go       |   5 +
 backend/plugins/gitlab/tasks/mr_label_convertor.go |   9 +-
 backend/plugins/gitlab/tasks/mr_note_collector.go  |   5 +
 backend/plugins/gitlab/tasks/mr_note_extractor.go  |   5 +
 backend/plugins/gitlab/tasks/pipeline_collector.go |   5 +
 .../gitlab/tasks/pipeline_commit_convertor.go      |   5 +
 backend/plugins/gitlab/tasks/pipeline_convertor.go |   5 +
 .../gitlab/tasks/pipeline_detail_collector.go      |   5 +
 .../gitlab/tasks/pipeline_detail_extractor.go      |   5 +
 backend/plugins/gitlab/tasks/pipeline_extractor.go |   5 +
 backend/plugins/gitlab/tasks/project_convertor.go  |   5 +
 backend/plugins/gitlab/tasks/register.go           |  26 +++++
 backend/plugins/gitlab/tasks/tag_collector.go      |   5 +
 backend/plugins/gitlab/tasks/tag_extractor.go      |   5 +
 41 files changed, 464 insertions(+), 48 deletions(-)

diff --git a/backend/core/plugin/plugin_task.go 
b/backend/core/plugin/plugin_task.go
index 9bc595e49..9baf274e3 100644
--- a/backend/core/plugin/plugin_task.go
+++ b/backend/core/plugin/plugin_task.go
@@ -97,6 +97,7 @@ type SubTaskMeta struct {
        EnabledByDefault bool
        Description      string
        DomainTypes      []string
+       Dependencies     []*SubTaskMeta
 }
 
 // PluginTask Implement this interface to let framework run tasks for you
diff --git a/backend/helpers/pluginhelper/subtaskmeta_sorter/dependency.go 
b/backend/helpers/pluginhelper/subtaskmeta_sorter/dependency.go
new file mode 100644
index 000000000..d310c1fe5
--- /dev/null
+++ b/backend/helpers/pluginhelper/subtaskmeta_sorter/dependency.go
@@ -0,0 +1,118 @@
+/*
+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 subtaskmeta_sorter
+
+import (
+       "fmt"
+       "github.com/apache/incubator-devlake/core/plugin"
+       "sort"
+)
+
+type DependencySorter struct {
+       metas []*plugin.SubTaskMeta
+}
+
+func NewDependencySorter(metas []*plugin.SubTaskMeta) SubTaskMetaSorter {
+       return &DependencySorter{metas: metas}
+}
+
+func (d *DependencySorter) Sort() ([]plugin.SubTaskMeta, error) {
+       return topologicalSort(d.metas)
+}
+
+// stable topological sort
+func topologicalSort(metas []*plugin.SubTaskMeta) ([]plugin.SubTaskMeta, 
error) {
+       // which state will make a cycle
+       dependenciesMap := make(map[string][]string)
+       nameMetaMap := make(map[string]*plugin.SubTaskMeta)
+
+       for _, item := range metas {
+               if item != nil {
+                       nameMetaMap[item.Name] = item
+               }
+
+               if _, ok := dependenciesMap[item.Name]; !ok {
+                       if len(item.Dependencies) != 0 {
+                               dependenciesMap[item.Name] = make([]string, 0)
+                               for _, dependencyItem := range 
item.Dependencies {
+                                       dependenciesMap[item.Name] = 
append(dependenciesMap[item.Name], dependencyItem.Name)
+                               }
+                       } else {
+                               dependenciesMap[item.Name] = make([]string, 0)
+                       }
+               } else {
+                       return nil, fmt.Errorf("duplicate subtaskmetas detected 
in list: %s", item.Name)
+               }
+       }
+
+       orderedSubtaskList := make([]plugin.SubTaskMeta, 0)
+       for {
+               if len(dependenciesMap) == 0 {
+                       break
+               }
+
+               tmpList := make([]string, 0)
+               for key, item := range dependenciesMap {
+                       if len(item) == 0 {
+                               tmpList = append(tmpList, key)
+                       }
+               }
+               if len(tmpList) == 0 {
+                       return nil, fmt.Errorf("cyclic dependency detected: 
%v", dependenciesMap)
+               }
+
+               // remove item in dependencies map
+               for key, value := range dependenciesMap {
+                       if contains(tmpList, key) {
+                               delete(dependenciesMap, key)
+                       } else {
+                               dependenciesMap[key] = removeElements(value, 
tmpList)
+                       }
+               }
+
+               sort.Strings(tmpList)
+               // convert item to subtaskmeta by name, and append to 
orderedSubtaskList
+               for _, item := range tmpList {
+                       value, ok := nameMetaMap[item]
+                       if !ok {
+                               return nil, fmt.Errorf("illeagal subtaskmeta 
detected %s", item)
+                       }
+                       orderedSubtaskList = append(orderedSubtaskList, *value)
+               }
+       }
+       return orderedSubtaskList, nil
+}
+
+func contains[T comparable](itemList []T, item T) bool {
+       for _, newItem := range itemList {
+               if item == newItem {
+                       return true
+               }
+       }
+       return false
+}
+
+func removeElements[T comparable](raw, toRemove []T) []T {
+       newList := make([]T, 0)
+       for _, item := range raw {
+               if !contains(toRemove, item) {
+                       newList = append(newList, item)
+               }
+       }
+       return newList
+}
diff --git a/backend/helpers/pluginhelper/subtaskmeta_sorter/dependency_test.go 
b/backend/helpers/pluginhelper/subtaskmeta_sorter/dependency_test.go
new file mode 100644
index 000000000..924b3be79
--- /dev/null
+++ b/backend/helpers/pluginhelper/subtaskmeta_sorter/dependency_test.go
@@ -0,0 +1,98 @@
+/*
+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 subtaskmeta_sorter
+
+import (
+       "github.com/apache/incubator-devlake/core/plugin"
+       "reflect"
+       "testing"
+)
+
+func Test_topologicalSort(t *testing.T) {
+       pluginA := plugin.SubTaskMeta{
+               Name:         "A",
+               Dependencies: []*plugin.SubTaskMeta{},
+       }
+       pluginB := plugin.SubTaskMeta{
+               Name:         "B",
+               Dependencies: []*plugin.SubTaskMeta{&pluginA},
+       }
+       pluginC := plugin.SubTaskMeta{
+               Name:         "C",
+               Dependencies: []*plugin.SubTaskMeta{&pluginA},
+       }
+       type args struct {
+               metas []*plugin.SubTaskMeta
+       }
+       tests := []struct {
+               name    string
+               args    args
+               want    []plugin.SubTaskMeta
+               wantErr bool
+       }{
+               {
+                       name: "correct stable order",
+                       args: args{
+                               metas: []*plugin.SubTaskMeta{&pluginA, 
&pluginC, &pluginB},
+                       },
+                       want: []plugin.SubTaskMeta{
+                               pluginA, pluginB, pluginC,
+                       },
+                       wantErr: false,
+               },
+               {
+                       name: "duplicate error",
+                       args: args{
+                               metas: []*plugin.SubTaskMeta{&pluginA, 
&pluginA, &pluginB},
+                       },
+                       want:    nil,
+                       wantErr: true,
+               },
+               {
+                       name: "cycle error",
+                       args: args{[]*plugin.SubTaskMeta{
+                               &plugin.SubTaskMeta{
+                                       Name: "D",
+                                       Dependencies: 
[]*plugin.SubTaskMeta{&plugin.SubTaskMeta{
+                                               Name: "E",
+                                       }},
+                               },
+                               &plugin.SubTaskMeta{
+                                       Name: "E",
+                                       Dependencies: 
[]*plugin.SubTaskMeta{&plugin.SubTaskMeta{
+                                               Name: "D",
+                                       }},
+                               },
+                       }},
+                       want:    nil,
+                       wantErr: true,
+               },
+       }
+       for _, tt := range tests {
+               t.Run(tt.name, func(t *testing.T) {
+                       got, err := topologicalSort(tt.args.metas)
+                       if (err != nil) != tt.wantErr {
+                               t.Errorf("topologicalSort() error = %v, wantErr 
%v", err, tt.wantErr)
+                               return
+                       }
+                       if !reflect.DeepEqual(got, tt.want) {
+                               t.Errorf("topologicalSort() got = %v, want %v", 
got, tt.want)
+                       }
+               })
+       }
+}
diff --git a/backend/helpers/pluginhelper/subtaskmeta_sorter/interface.go 
b/backend/helpers/pluginhelper/subtaskmeta_sorter/interface.go
new file mode 100644
index 000000000..fb4e30b5e
--- /dev/null
+++ b/backend/helpers/pluginhelper/subtaskmeta_sorter/interface.go
@@ -0,0 +1,24 @@
+/*
+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 subtaskmeta_sorter
+
+import "github.com/apache/incubator-devlake/core/plugin"
+
+type SubTaskMetaSorter interface {
+       Sort() ([]plugin.SubTaskMeta, error)
+}
diff --git a/backend/plugins/gitlab/impl/impl.go 
b/backend/plugins/gitlab/impl/impl.go
index 67e2d0d17..fd7bb02e6 100644
--- a/backend/plugins/gitlab/impl/impl.go
+++ b/backend/plugins/gitlab/impl/impl.go
@@ -19,6 +19,7 @@ package impl
 
 import (
        "fmt"
+       
"github.com/apache/incubator-devlake/helpers/pluginhelper/subtaskmeta_sorter"
        "time"
 
        "github.com/apache/incubator-devlake/core/context"
@@ -46,6 +47,13 @@ var _ interface {
 
 type Gitlab string
 
+func init() {
+       // check subtask meta loop when init subtask meta
+       if _, err := 
subtaskmeta_sorter.NewDependencySorter(tasks.SubTaskMetaList).Sort(); err != 
nil {
+               panic(err)
+       }
+}
+
 func (p Gitlab) Init(basicRes context.BasicRes) errors.Error {
        api.Init(basicRes)
        return nil
@@ -94,45 +102,11 @@ func (p Gitlab) Description() string {
 }
 
 func (p Gitlab) SubTaskMetas() []plugin.SubTaskMeta {
-       return []plugin.SubTaskMeta{
-               tasks.CollectApiIssuesMeta,
-               tasks.ExtractApiIssuesMeta,
-               tasks.CollectApiMergeRequestsMeta,
-               tasks.ExtractApiMergeRequestsMeta,
-               tasks.CollectApiMergeRequestDetailsMeta,
-               tasks.CollectApiMergeRequestDetailsMeta,
-               tasks.CollectApiMrNotesMeta,
-               tasks.ExtractApiMrNotesMeta,
-               tasks.CollectApiMrCommitsMeta,
-               tasks.ExtractApiMrCommitsMeta,
-               tasks.CollectApiPipelinesMeta,
-               tasks.ExtractApiPipelinesMeta,
-               tasks.CollectApiPipelineDetailsMeta,
-               tasks.ExtractApiPipelineDetailsMeta,
-               tasks.CollectApiJobsMeta,
-               tasks.ExtractApiJobsMeta,
-               tasks.EnrichMergeRequestsMeta,
-               tasks.CollectAccountsMeta,
-               tasks.ExtractAccountsMeta,
-               tasks.ConvertAccountsMeta,
-               tasks.ConvertProjectMeta,
-               tasks.ConvertApiMergeRequestsMeta,
-               tasks.ConvertMrCommentMeta,
-               tasks.ConvertApiMrCommitsMeta,
-               tasks.ConvertIssuesMeta,
-               tasks.ConvertIssueAssigneeMeta,
-               tasks.ConvertIssueLabelsMeta,
-               tasks.ConvertMrLabelsMeta,
-               tasks.ConvertCommitsMeta,
-               tasks.ConvertPipelineMeta,
-               tasks.ConvertPipelineCommitMeta,
-               tasks.ConvertJobMeta,
-               tasks.CollectApiCommitsMeta,
-               tasks.ExtractApiCommitsMeta,
-               tasks.ExtractApiMergeRequestDetailsMeta,
-               tasks.CollectTagMeta,
-               tasks.ExtractTagMeta,
+       list, err := 
subtaskmeta_sorter.NewDependencySorter(tasks.SubTaskMetaList).Sort()
+       if err != nil {
+               panic(err)
        }
+       return list
 }
 
 func (p Gitlab) PrepareTaskData(taskCtx plugin.TaskContext, options 
map[string]interface{}) (interface{}, errors.Error) {
diff --git a/backend/plugins/gitlab/tasks/account_collector.go 
b/backend/plugins/gitlab/tasks/account_collector.go
index 43142938d..fb21f2b9e 100644
--- a/backend/plugins/gitlab/tasks/account_collector.go
+++ b/backend/plugins/gitlab/tasks/account_collector.go
@@ -30,6 +30,10 @@ import (
        "golang.org/x/mod/semver"
 )
 
+func init() {
+       RegisterSubtaskMeta(&CollectAccountsMeta)
+}
+
 const RAW_USER_TABLE = "gitlab_api_users"
 
 var CollectAccountsMeta = plugin.SubTaskMeta{
@@ -38,6 +42,7 @@ var CollectAccountsMeta = plugin.SubTaskMeta{
        EnabledByDefault: true,
        Description:      "collect gitlab users, does not support either 
timeFilter or diffSync.",
        DomainTypes:      []string{plugin.DOMAIN_TYPE_CROSS},
+       Dependencies:     []*plugin.SubTaskMeta{&EnrichMergeRequestsMeta},
 }
 
 func CollectAccounts(taskCtx plugin.SubTaskContext) errors.Error {
diff --git a/backend/plugins/gitlab/tasks/account_convertor.go 
b/backend/plugins/gitlab/tasks/account_convertor.go
index 2a5799979..36bc314c8 100644
--- a/backend/plugins/gitlab/tasks/account_convertor.go
+++ b/backend/plugins/gitlab/tasks/account_convertor.go
@@ -29,12 +29,17 @@ import (
        "reflect"
 )
 
+func init() {
+       RegisterSubtaskMeta(&ConvertAccountsMeta)
+}
+
 var ConvertAccountsMeta = plugin.SubTaskMeta{
        Name:             "convertAccounts",
        EntryPoint:       ConvertAccounts,
        EnabledByDefault: true,
        Description:      "Convert tool layer table gitlab_users into  domain 
layer table accounts",
        DomainTypes:      []string{plugin.DOMAIN_TYPE_CROSS},
+       Dependencies:     []*plugin.SubTaskMeta{&ExtractAccountsMeta},
 }
 
 func ConvertAccounts(taskCtx plugin.SubTaskContext) errors.Error {
diff --git a/backend/plugins/gitlab/tasks/account_extractor.go 
b/backend/plugins/gitlab/tasks/account_extractor.go
index 56df7fdbb..1b57a7b2a 100644
--- a/backend/plugins/gitlab/tasks/account_extractor.go
+++ b/backend/plugins/gitlab/tasks/account_extractor.go
@@ -26,12 +26,17 @@ import (
        "github.com/apache/incubator-devlake/plugins/gitlab/models"
 )
 
+func init() {
+       RegisterSubtaskMeta(&ExtractAccountsMeta)
+}
+
 var ExtractAccountsMeta = plugin.SubTaskMeta{
        Name:             "extractAccounts",
        EntryPoint:       ExtractAccounts,
        EnabledByDefault: true,
        Description:      "Extract raw workspace data into tool layer table 
_tool_gitlab_accounts",
        DomainTypes:      []string{plugin.DOMAIN_TYPE_CROSS},
+       Dependencies:     []*plugin.SubTaskMeta{&CollectAccountsMeta},
 }
 
 func ExtractAccounts(taskCtx plugin.SubTaskContext) errors.Error {
diff --git a/backend/plugins/gitlab/tasks/commit_collector.go 
b/backend/plugins/gitlab/tasks/commit_collector.go
index 90663bb5a..b97744129 100644
--- a/backend/plugins/gitlab/tasks/commit_collector.go
+++ b/backend/plugins/gitlab/tasks/commit_collector.go
@@ -23,6 +23,10 @@ import (
        "github.com/apache/incubator-devlake/helpers/pluginhelper/api"
 )
 
+func init() {
+       RegisterSubtaskMeta(&CollectApiCommitsMeta)
+}
+
 const RAW_COMMIT_TABLE = "gitlab_api_commit"
 
 var CollectApiCommitsMeta = plugin.SubTaskMeta{
@@ -31,6 +35,7 @@ var CollectApiCommitsMeta = plugin.SubTaskMeta{
        EnabledByDefault: false,
        Description:      "Collect commit data from gitlab api, does not 
support either timeFilter or diffSync.",
        DomainTypes:      []string{plugin.DOMAIN_TYPE_CODE},
+       Dependencies:     []*plugin.SubTaskMeta{&ConvertJobMeta},
 }
 
 type GitlabApiCommit struct {
diff --git a/backend/plugins/gitlab/tasks/commit_convertor.go 
b/backend/plugins/gitlab/tasks/commit_convertor.go
index 0450a016e..c285a785e 100644
--- a/backend/plugins/gitlab/tasks/commit_convertor.go
+++ b/backend/plugins/gitlab/tasks/commit_convertor.go
@@ -28,12 +28,17 @@ import (
        "reflect"
 )
 
+func init() {
+       RegisterSubtaskMeta(&ConvertCommitsMeta)
+}
+
 var ConvertCommitsMeta = plugin.SubTaskMeta{
        Name:             "convertApiCommits",
        EntryPoint:       ConvertApiCommits,
        EnabledByDefault: false,
        Description:      "Update domain layer commit according to 
GitlabCommit",
        DomainTypes:      []string{plugin.DOMAIN_TYPE_CODE},
+       Dependencies:     []*plugin.SubTaskMeta{&ConvertMrLabelsMeta},
 }
 
 func ConvertApiCommits(taskCtx plugin.SubTaskContext) errors.Error {
diff --git a/backend/plugins/gitlab/tasks/commit_extractor.go 
b/backend/plugins/gitlab/tasks/commit_extractor.go
index d2765e65d..7cbacf997 100644
--- a/backend/plugins/gitlab/tasks/commit_extractor.go
+++ b/backend/plugins/gitlab/tasks/commit_extractor.go
@@ -25,12 +25,17 @@ import (
        "github.com/apache/incubator-devlake/plugins/gitlab/models"
 )
 
+func init() {
+       RegisterSubtaskMeta(&ExtractApiCommitsMeta)
+}
+
 var ExtractApiCommitsMeta = plugin.SubTaskMeta{
        Name:             "extractApiCommits",
        EntryPoint:       ExtractApiCommits,
        EnabledByDefault: false,
        Description:      "Extract raw commit data into tool layer table 
GitlabCommit,GitlabAccount and GitlabProjectCommit",
        DomainTypes:      []string{plugin.DOMAIN_TYPE_CODE},
+       Dependencies:     []*plugin.SubTaskMeta{&CollectApiCommitsMeta},
 }
 
 func ExtractApiCommits(taskCtx plugin.SubTaskContext) errors.Error {
diff --git a/backend/plugins/gitlab/tasks/issue_collector.go 
b/backend/plugins/gitlab/tasks/issue_collector.go
index faecc6cc3..a8b51c5c6 100644
--- a/backend/plugins/gitlab/tasks/issue_collector.go
+++ b/backend/plugins/gitlab/tasks/issue_collector.go
@@ -29,6 +29,10 @@ import (
        helper "github.com/apache/incubator-devlake/helpers/pluginhelper/api"
 )
 
+func init() {
+       RegisterSubtaskMeta(&CollectApiIssuesMeta)
+}
+
 const RAW_ISSUE_TABLE = "gitlab_api_issues"
 
 var CollectApiIssuesMeta = plugin.SubTaskMeta{
@@ -37,6 +41,7 @@ var CollectApiIssuesMeta = plugin.SubTaskMeta{
        EnabledByDefault: true,
        Description:      "Collect issues data from Gitlab api, supports both 
timeFilter and diffSync.",
        DomainTypes:      []string{plugin.DOMAIN_TYPE_TICKET},
+       Dependencies:     []*plugin.SubTaskMeta{},
 }
 
 func CollectApiIssues(taskCtx plugin.SubTaskContext) errors.Error {
diff --git a/backend/plugins/gitlab/tasks/issue_convertor.go 
b/backend/plugins/gitlab/tasks/issue_convertor.go
index 3da4c5173..6d09b4b19 100644
--- a/backend/plugins/gitlab/tasks/issue_convertor.go
+++ b/backend/plugins/gitlab/tasks/issue_convertor.go
@@ -31,12 +31,17 @@ import (
        "strings"
 )
 
+func init() {
+       RegisterSubtaskMeta(&ConvertIssuesMeta)
+}
+
 var ConvertIssuesMeta = plugin.SubTaskMeta{
        Name:             "convertIssues",
        EntryPoint:       ConvertIssues,
        EnabledByDefault: true,
        Description:      "Convert tool layer table gitlab_issues into  domain 
layer table issues",
        DomainTypes:      []string{plugin.DOMAIN_TYPE_TICKET},
+       Dependencies:     []*plugin.SubTaskMeta{&ConvertApiMrCommitsMeta},
 }
 
 func ConvertIssues(taskCtx plugin.SubTaskContext) errors.Error {
diff --git a/backend/plugins/gitlab/tasks/issue_extractor.go 
b/backend/plugins/gitlab/tasks/issue_extractor.go
index 793c8edf2..5b36ae231 100644
--- a/backend/plugins/gitlab/tasks/issue_extractor.go
+++ b/backend/plugins/gitlab/tasks/issue_extractor.go
@@ -28,12 +28,17 @@ import (
        "github.com/apache/incubator-devlake/plugins/gitlab/models"
 )
 
+func init() {
+       RegisterSubtaskMeta(&ExtractApiIssuesMeta)
+}
+
 var ExtractApiIssuesMeta = plugin.SubTaskMeta{
        Name:             "extractApiIssues",
        EntryPoint:       ExtractApiIssues,
        EnabledByDefault: true,
        Description:      "Extract raw Issues data into tool layer table 
gitlab_issues",
        DomainTypes:      []string{plugin.DOMAIN_TYPE_TICKET},
+       Dependencies:     []*plugin.SubTaskMeta{&CollectApiIssuesMeta},
 }
 
 type IssuesResponse struct {
diff --git a/backend/plugins/gitlab/tasks/issue_label_convertor.go 
b/backend/plugins/gitlab/tasks/issue_label_convertor.go
index c22c2688d..c79ce1590 100644
--- a/backend/plugins/gitlab/tasks/issue_label_convertor.go
+++ b/backend/plugins/gitlab/tasks/issue_label_convertor.go
@@ -28,12 +28,17 @@ import (
        "reflect"
 )
 
+func init() {
+       RegisterSubtaskMeta(&ConvertIssueLabelsMeta)
+}
+
 var ConvertIssueLabelsMeta = plugin.SubTaskMeta{
        Name:             "convertIssueLabels",
        EntryPoint:       ConvertIssueLabels,
        EnabledByDefault: true,
        Description:      "Convert tool layer table gitlab_issue_labels into  
domain layer table issue_labels",
        DomainTypes:      []string{plugin.DOMAIN_TYPE_TICKET},
+       Dependencies:     []*plugin.SubTaskMeta{&ConvertIssuesMeta},
 }
 
 func ConvertIssueLabels(taskCtx plugin.SubTaskContext) errors.Error {
@@ -43,9 +48,9 @@ func ConvertIssueLabels(taskCtx plugin.SubTaskContext) 
errors.Error {
        clauses := []dal.Clause{
                dal.Select("*"),
                dal.From(&models.GitlabIssueLabel{}),
-               dal.Join(`left join _tool_gitlab_issues on 
+               dal.Join(`left join _tool_gitlab_issues on
                        _tool_gitlab_issues.gitlab_id = 
_tool_gitlab_issue_labels.issue_id`),
-               dal.Where(`_tool_gitlab_issues.project_id = ? 
+               dal.Where(`_tool_gitlab_issues.project_id = ?
                        and _tool_gitlab_issues.connection_id = ?`,
                        projectId, data.Options.ConnectionId),
                dal.Orderby("issue_id ASC"),
diff --git a/backend/plugins/gitlab/tasks/job_collector.go 
b/backend/plugins/gitlab/tasks/job_collector.go
index 8fc5d369b..948468a49 100644
--- a/backend/plugins/gitlab/tasks/job_collector.go
+++ b/backend/plugins/gitlab/tasks/job_collector.go
@@ -33,6 +33,10 @@ import (
        "github.com/apache/incubator-devlake/plugins/gitlab/models"
 )
 
+func init() {
+       RegisterSubtaskMeta(&CollectApiJobsMeta)
+}
+
 const RAW_JOB_TABLE = "gitlab_api_job"
 
 type SimpleGitlabApiJob struct {
@@ -46,6 +50,7 @@ var CollectApiJobsMeta = plugin.SubTaskMeta{
        EnabledByDefault: true,
        Description:      "Collect job data from gitlab api, supports both 
timeFilter and diffSync.",
        DomainTypes:      []string{plugin.DOMAIN_TYPE_CICD},
+       Dependencies:     []*plugin.SubTaskMeta{&ExtractApiPipelineDetailsMeta},
 }
 
 func CollectApiJobs(taskCtx plugin.SubTaskContext) errors.Error {
diff --git a/backend/plugins/gitlab/tasks/job_convertor.go 
b/backend/plugins/gitlab/tasks/job_convertor.go
index 32d876017..d0e0a750a 100644
--- a/backend/plugins/gitlab/tasks/job_convertor.go
+++ b/backend/plugins/gitlab/tasks/job_convertor.go
@@ -30,12 +30,17 @@ import (
        gitlabModels "github.com/apache/incubator-devlake/plugins/gitlab/models"
 )
 
+func init() {
+       RegisterSubtaskMeta(&ConvertJobMeta)
+}
+
 var ConvertJobMeta = plugin.SubTaskMeta{
        Name:             "convertJobs",
        EntryPoint:       ConvertJobs,
        EnabledByDefault: true,
        Description:      "Convert tool layer table gitlab_job into domain 
layer table job",
        DomainTypes:      []string{plugin.DOMAIN_TYPE_CICD},
+       Dependencies:     []*plugin.SubTaskMeta{&ConvertPipelineCommitMeta},
 }
 
 func ConvertJobs(taskCtx plugin.SubTaskContext) (err errors.Error) {
diff --git a/backend/plugins/gitlab/tasks/job_extractor.go 
b/backend/plugins/gitlab/tasks/job_extractor.go
index f06158911..bbf795a51 100644
--- a/backend/plugins/gitlab/tasks/job_extractor.go
+++ b/backend/plugins/gitlab/tasks/job_extractor.go
@@ -25,6 +25,10 @@ import (
        "github.com/apache/incubator-devlake/plugins/gitlab/models"
 )
 
+func init() {
+       RegisterSubtaskMeta(&ExtractApiJobsMeta)
+}
+
 type ApiJob struct {
        Id           int `json:"id"`
        Status       string
@@ -50,6 +54,7 @@ var ExtractApiJobsMeta = plugin.SubTaskMeta{
        EnabledByDefault: true,
        Description:      "Extract raw GitlabJob data into tool layer table 
GitlabPipeline",
        DomainTypes:      []string{plugin.DOMAIN_TYPE_CICD},
+       Dependencies:     []*plugin.SubTaskMeta{&CollectApiJobsMeta},
 }
 
 func ExtractApiJobs(taskCtx plugin.SubTaskContext) errors.Error {
diff --git a/backend/plugins/gitlab/tasks/mr_collector.go 
b/backend/plugins/gitlab/tasks/mr_collector.go
index a9a0920b1..125262e60 100644
--- a/backend/plugins/gitlab/tasks/mr_collector.go
+++ b/backend/plugins/gitlab/tasks/mr_collector.go
@@ -28,12 +28,17 @@ import (
 
 const RAW_MERGE_REQUEST_TABLE = "gitlab_api_merge_requests"
 
+func init() {
+       RegisterSubtaskMeta(&CollectApiMergeRequestsMeta)
+}
+
 var CollectApiMergeRequestsMeta = plugin.SubTaskMeta{
        Name:             "collectApiMergeRequests",
        EntryPoint:       CollectApiMergeRequests,
        EnabledByDefault: true,
        Description:      "Collect merge requests data from gitlab api, 
supports both timeFilter and diffSync.",
        DomainTypes:      []string{plugin.DOMAIN_TYPE_CODE_REVIEW},
+       Dependencies:     []*plugin.SubTaskMeta{&ExtractApiIssuesMeta},
 }
 
 func CollectApiMergeRequests(taskCtx plugin.SubTaskContext) errors.Error {
diff --git a/backend/plugins/gitlab/tasks/mr_comment_convertor.go 
b/backend/plugins/gitlab/tasks/mr_comment_convertor.go
index dd376d5d2..1ea38c9c6 100644
--- a/backend/plugins/gitlab/tasks/mr_comment_convertor.go
+++ b/backend/plugins/gitlab/tasks/mr_comment_convertor.go
@@ -29,12 +29,17 @@ import (
        "reflect"
 )
 
+func init() {
+       RegisterSubtaskMeta(&ConvertMrCommentMeta)
+}
+
 var ConvertMrCommentMeta = plugin.SubTaskMeta{
        Name:             "convertMergeRequestComment",
        EntryPoint:       ConvertMergeRequestComment,
        EnabledByDefault: true,
        Description:      "Add domain layer Comment according to 
GitlabMrComment",
        DomainTypes:      []string{plugin.DOMAIN_TYPE_CODE_REVIEW},
+       Dependencies:     []*plugin.SubTaskMeta{&ConvertApiMergeRequestsMeta},
 }
 
 func ConvertMergeRequestComment(taskCtx plugin.SubTaskContext) errors.Error {
@@ -42,10 +47,10 @@ func ConvertMergeRequestComment(taskCtx 
plugin.SubTaskContext) errors.Error {
        db := taskCtx.GetDal()
        clauses := []dal.Clause{
                dal.From(&models.GitlabMrComment{}),
-               dal.Join(`left join _tool_gitlab_merge_requests on 
-                       _tool_gitlab_merge_requests.gitlab_id = 
+               dal.Join(`left join _tool_gitlab_merge_requests on
+                       _tool_gitlab_merge_requests.gitlab_id =
                        _tool_gitlab_mr_comments.merge_request_id`),
-               dal.Where(`_tool_gitlab_merge_requests.project_id = ? 
+               dal.Where(`_tool_gitlab_merge_requests.project_id = ?
                        and _tool_gitlab_mr_comments.connection_id = ?`,
                        data.Options.ProjectId, data.Options.ConnectionId),
        }
diff --git a/backend/plugins/gitlab/tasks/mr_commit_collector.go 
b/backend/plugins/gitlab/tasks/mr_commit_collector.go
index a6f50cf45..f0e4350ba 100644
--- a/backend/plugins/gitlab/tasks/mr_commit_collector.go
+++ b/backend/plugins/gitlab/tasks/mr_commit_collector.go
@@ -23,6 +23,10 @@ import (
        helper "github.com/apache/incubator-devlake/helpers/pluginhelper/api"
 )
 
+func init() {
+       RegisterSubtaskMeta(&CollectApiMrCommitsMeta)
+}
+
 const RAW_MERGE_REQUEST_COMMITS_TABLE = "gitlab_api_merge_request_commits"
 
 var CollectApiMrCommitsMeta = plugin.SubTaskMeta{
@@ -31,6 +35,7 @@ var CollectApiMrCommitsMeta = plugin.SubTaskMeta{
        EnabledByDefault: true,
        Description:      "Collect merge requests commits data from gitlab api, 
supports timeFilter but not diffSync.",
        DomainTypes:      []string{plugin.DOMAIN_TYPE_CODE_REVIEW},
+       Dependencies:     []*plugin.SubTaskMeta{&ExtractApiMrNotesMeta},
 }
 
 func CollectApiMergeRequestsCommits(taskCtx plugin.SubTaskContext) 
errors.Error {
diff --git a/backend/plugins/gitlab/tasks/mr_commit_convertor.go 
b/backend/plugins/gitlab/tasks/mr_commit_convertor.go
index 99b2a2b41..751e84a96 100644
--- a/backend/plugins/gitlab/tasks/mr_commit_convertor.go
+++ b/backend/plugins/gitlab/tasks/mr_commit_convertor.go
@@ -28,12 +28,17 @@ import (
        "reflect"
 )
 
+func init() {
+       RegisterSubtaskMeta(&ConvertApiMrCommitsMeta)
+}
+
 var ConvertApiMrCommitsMeta = plugin.SubTaskMeta{
        Name:             "convertApiMergeRequestsCommits",
        EntryPoint:       ConvertApiMergeRequestsCommits,
        EnabledByDefault: true,
        Description:      "Add domain layer PullRequestCommit according to 
GitlabMrCommit",
        DomainTypes:      []string{plugin.DOMAIN_TYPE_CODE_REVIEW},
+       Dependencies:     []*plugin.SubTaskMeta{&ConvertMrCommentMeta},
 }
 
 func ConvertApiMergeRequestsCommits(taskCtx plugin.SubTaskContext) 
errors.Error {
@@ -42,10 +47,10 @@ func ConvertApiMergeRequestsCommits(taskCtx 
plugin.SubTaskContext) errors.Error
 
        clauses := []dal.Clause{
                dal.From(&models.GitlabMrCommit{}),
-               dal.Join(`left join _tool_gitlab_merge_requests 
-                       on _tool_gitlab_merge_requests.gitlab_id = 
+               dal.Join(`left join _tool_gitlab_merge_requests
+                       on _tool_gitlab_merge_requests.gitlab_id =
                        _tool_gitlab_mr_commits.merge_request_id`),
-               dal.Where(`_tool_gitlab_merge_requests.project_id = ? 
+               dal.Where(`_tool_gitlab_merge_requests.project_id = ?
                        and _tool_gitlab_merge_requests.connection_id = ?`,
                        data.Options.ProjectId, data.Options.ConnectionId),
                dal.Orderby("merge_request_id ASC"),
diff --git a/backend/plugins/gitlab/tasks/mr_commit_extractor.go 
b/backend/plugins/gitlab/tasks/mr_commit_extractor.go
index e237add9f..f71107532 100644
--- a/backend/plugins/gitlab/tasks/mr_commit_extractor.go
+++ b/backend/plugins/gitlab/tasks/mr_commit_extractor.go
@@ -25,12 +25,17 @@ import (
        "github.com/apache/incubator-devlake/plugins/gitlab/models"
 )
 
+func init() {
+       RegisterSubtaskMeta(&ExtractApiMrCommitsMeta)
+}
+
 var ExtractApiMrCommitsMeta = plugin.SubTaskMeta{
        Name:             "extractApiMergeRequestsCommits",
        EntryPoint:       ExtractApiMergeRequestsCommits,
        EnabledByDefault: true,
        Description:      "Extract raw merge requests commit data into tool 
layer table GitlabMrCommit and GitlabCommit",
        DomainTypes:      []string{plugin.DOMAIN_TYPE_CODE_REVIEW},
+       Dependencies:     []*plugin.SubTaskMeta{&CollectApiMrCommitsMeta},
 }
 
 func ExtractApiMergeRequestsCommits(taskCtx plugin.SubTaskContext) 
errors.Error {
diff --git a/backend/plugins/gitlab/tasks/mr_convertor.go 
b/backend/plugins/gitlab/tasks/mr_convertor.go
index b0fb831d7..89aa2c9ba 100644
--- a/backend/plugins/gitlab/tasks/mr_convertor.go
+++ b/backend/plugins/gitlab/tasks/mr_convertor.go
@@ -30,12 +30,17 @@ import (
        "github.com/apache/incubator-devlake/plugins/gitlab/models"
 )
 
+func init() {
+       RegisterSubtaskMeta(&ConvertApiMergeRequestsMeta)
+}
+
 var ConvertApiMergeRequestsMeta = plugin.SubTaskMeta{
        Name:             "convertApiMergeRequests",
        EntryPoint:       ConvertApiMergeRequests,
        EnabledByDefault: true,
        Description:      "Add domain layer PullRequest according to 
GitlabMergeRequest",
        DomainTypes:      []string{plugin.DOMAIN_TYPE_CODE_REVIEW},
+       Dependencies:     []*plugin.SubTaskMeta{&ConvertProjectMeta},
 }
 
 func ConvertApiMergeRequests(taskCtx plugin.SubTaskContext) errors.Error {
diff --git a/backend/plugins/gitlab/tasks/mr_detail_collector.go 
b/backend/plugins/gitlab/tasks/mr_detail_collector.go
index 5e1e6b74e..451a9391d 100644
--- a/backend/plugins/gitlab/tasks/mr_detail_collector.go
+++ b/backend/plugins/gitlab/tasks/mr_detail_collector.go
@@ -27,6 +27,10 @@ import (
        helper "github.com/apache/incubator-devlake/helpers/pluginhelper/api"
 )
 
+func init() {
+       RegisterSubtaskMeta(&CollectApiMergeRequestDetailsMeta)
+}
+
 const RAW_MERGE_REQUEST_DETAIL_TABLE = "gitlab_api_merge_request_details"
 
 var CollectApiMergeRequestDetailsMeta = plugin.SubTaskMeta{
@@ -35,6 +39,7 @@ var CollectApiMergeRequestDetailsMeta = plugin.SubTaskMeta{
        EnabledByDefault: true,
        Description:      "Collect merge request Details data from gitlab api, 
supports timeFilter but not diffSync.",
        DomainTypes:      []string{plugin.DOMAIN_TYPE_CODE_REVIEW},
+       Dependencies:     []*plugin.SubTaskMeta{&ExtractApiMergeRequestsMeta},
 }
 
 func CollectApiMergeRequestDetails(taskCtx plugin.SubTaskContext) errors.Error 
{
diff --git a/backend/plugins/gitlab/tasks/mr_detail_extractor.go 
b/backend/plugins/gitlab/tasks/mr_detail_extractor.go
index e48d88fb1..8a590d53e 100644
--- a/backend/plugins/gitlab/tasks/mr_detail_extractor.go
+++ b/backend/plugins/gitlab/tasks/mr_detail_extractor.go
@@ -27,12 +27,17 @@ import (
        "github.com/apache/incubator-devlake/plugins/gitlab/models"
 )
 
+func init() {
+       RegisterSubtaskMeta(&ExtractApiMergeRequestDetailsMeta)
+}
+
 var ExtractApiMergeRequestDetailsMeta = plugin.SubTaskMeta{
        Name:             "extractApiMergeRequestDetails",
        EntryPoint:       ExtractApiMergeRequestDetails,
        EnabledByDefault: true,
        Description:      "Extract raw merge request Details data into tool 
layer table GitlabMergeRequest and GitlabReviewer",
        DomainTypes:      []string{plugin.DOMAIN_TYPE_CODE_REVIEW},
+       Dependencies:     []*plugin.SubTaskMeta{&ExtractApiCommitsMeta},
 }
 
 func ExtractApiMergeRequestDetails(taskCtx plugin.SubTaskContext) errors.Error 
{
diff --git a/backend/plugins/gitlab/tasks/mr_enricher.go 
b/backend/plugins/gitlab/tasks/mr_enricher.go
index df3036533..256dffb7e 100644
--- a/backend/plugins/gitlab/tasks/mr_enricher.go
+++ b/backend/plugins/gitlab/tasks/mr_enricher.go
@@ -27,12 +27,17 @@ import (
        "time"
 )
 
+func init() {
+       RegisterSubtaskMeta(&EnrichMergeRequestsMeta)
+}
+
 var EnrichMergeRequestsMeta = plugin.SubTaskMeta{
        Name:             "enrichMrs",
        EntryPoint:       EnrichMergeRequests,
        EnabledByDefault: true,
        Description:      "Enrich merge requests data from GitlabCommit, 
GitlabMrNote and GitlabMergeRequest",
        DomainTypes:      []string{plugin.DOMAIN_TYPE_CODE_REVIEW},
+       Dependencies:     []*plugin.SubTaskMeta{&ExtractApiJobsMeta},
 }
 
 func EnrichMergeRequests(taskCtx plugin.SubTaskContext) errors.Error {
diff --git a/backend/plugins/gitlab/tasks/mr_extractor.go 
b/backend/plugins/gitlab/tasks/mr_extractor.go
index bb22570b5..8fe0ae8d2 100644
--- a/backend/plugins/gitlab/tasks/mr_extractor.go
+++ b/backend/plugins/gitlab/tasks/mr_extractor.go
@@ -28,6 +28,10 @@ import (
        "github.com/apache/incubator-devlake/plugins/gitlab/models"
 )
 
+func init() {
+       RegisterSubtaskMeta(&ExtractApiMergeRequestsMeta)
+}
+
 type MergeRequestRes struct {
        GitlabId        int `json:"id"`
        Iid             int
@@ -75,6 +79,7 @@ var ExtractApiMergeRequestsMeta = plugin.SubTaskMeta{
        EnabledByDefault: true,
        Description:      "Extract raw merge requests data into tool layer 
table GitlabMergeRequest and GitlabReviewer",
        DomainTypes:      []string{plugin.DOMAIN_TYPE_CODE_REVIEW},
+       Dependencies:     []*plugin.SubTaskMeta{&CollectApiMergeRequestsMeta},
 }
 
 func ExtractApiMergeRequests(taskCtx plugin.SubTaskContext) errors.Error {
diff --git a/backend/plugins/gitlab/tasks/mr_label_convertor.go 
b/backend/plugins/gitlab/tasks/mr_label_convertor.go
index 84b951923..603332438 100644
--- a/backend/plugins/gitlab/tasks/mr_label_convertor.go
+++ b/backend/plugins/gitlab/tasks/mr_label_convertor.go
@@ -28,12 +28,17 @@ import (
        "reflect"
 )
 
+func init() {
+       RegisterSubtaskMeta(&ConvertMrLabelsMeta)
+}
+
 var ConvertMrLabelsMeta = plugin.SubTaskMeta{
        Name:             "convertMrLabels",
        EntryPoint:       ConvertMrLabels,
        EnabledByDefault: true,
        Description:      "Convert tool layer table gitlab_mr_labels into  
domain layer table pull_request_labels",
        DomainTypes:      []string{plugin.DOMAIN_TYPE_CODE_REVIEW},
+       Dependencies:     []*plugin.SubTaskMeta{&ConvertIssueLabelsMeta},
 }
 
 func ConvertMrLabels(taskCtx plugin.SubTaskContext) errors.Error {
@@ -43,9 +48,9 @@ func ConvertMrLabels(taskCtx plugin.SubTaskContext) 
errors.Error {
        clauses := []dal.Clause{
                dal.Select("*"),
                dal.From(&models.GitlabMrLabel{}),
-               dal.Join(`left join _tool_gitlab_merge_requests on 
+               dal.Join(`left join _tool_gitlab_merge_requests on
                        _tool_gitlab_merge_requests.gitlab_id = 
_tool_gitlab_mr_labels.mr_id`),
-               dal.Where(`_tool_gitlab_merge_requests.project_id = ? 
+               dal.Where(`_tool_gitlab_merge_requests.project_id = ?
                        and _tool_gitlab_merge_requests.connection_id = ?`,
                        projectId, data.Options.ConnectionId),
                dal.Orderby("mr_id ASC"),
diff --git a/backend/plugins/gitlab/tasks/mr_note_collector.go 
b/backend/plugins/gitlab/tasks/mr_note_collector.go
index 882dfc506..ece1d47d5 100644
--- a/backend/plugins/gitlab/tasks/mr_note_collector.go
+++ b/backend/plugins/gitlab/tasks/mr_note_collector.go
@@ -23,6 +23,10 @@ import (
        helper "github.com/apache/incubator-devlake/helpers/pluginhelper/api"
 )
 
+func init() {
+       RegisterSubtaskMeta(&CollectApiMrNotesMeta)
+}
+
 const RAW_MERGE_REQUEST_NOTES_TABLE = "gitlab_api_merge_request_notes"
 
 var CollectApiMrNotesMeta = plugin.SubTaskMeta{
@@ -31,6 +35,7 @@ var CollectApiMrNotesMeta = plugin.SubTaskMeta{
        EnabledByDefault: true,
        Description:      "Collect merge requests notes data from gitlab api, 
supports timeFilter but not diffSync.",
        DomainTypes:      []string{plugin.DOMAIN_TYPE_CODE_REVIEW},
+       Dependencies:     
[]*plugin.SubTaskMeta{&CollectApiMergeRequestDetailsMeta},
 }
 
 func CollectApiMergeRequestsNotes(taskCtx plugin.SubTaskContext) errors.Error {
diff --git a/backend/plugins/gitlab/tasks/mr_note_extractor.go 
b/backend/plugins/gitlab/tasks/mr_note_extractor.go
index ae7ab0814..80f01e708 100644
--- a/backend/plugins/gitlab/tasks/mr_note_extractor.go
+++ b/backend/plugins/gitlab/tasks/mr_note_extractor.go
@@ -25,6 +25,10 @@ import (
        "github.com/apache/incubator-devlake/plugins/gitlab/models"
 )
 
+func init() {
+       RegisterSubtaskMeta(&ExtractApiMrNotesMeta)
+}
+
 type MergeRequestNote struct {
        GitlabId        int    `json:"id"`
        MergeRequestId  int    `json:"noteable_id"`
@@ -48,6 +52,7 @@ var ExtractApiMrNotesMeta = plugin.SubTaskMeta{
        EnabledByDefault: true,
        Description:      "Extract raw merge requests notes data into tool 
layer table GitlabMrNote",
        DomainTypes:      []string{plugin.DOMAIN_TYPE_CODE_REVIEW},
+       Dependencies:     []*plugin.SubTaskMeta{&CollectApiMrNotesMeta},
 }
 
 func ExtractApiMergeRequestsNotes(taskCtx plugin.SubTaskContext) errors.Error {
diff --git a/backend/plugins/gitlab/tasks/pipeline_collector.go 
b/backend/plugins/gitlab/tasks/pipeline_collector.go
index 8eb589617..1ef244887 100644
--- a/backend/plugins/gitlab/tasks/pipeline_collector.go
+++ b/backend/plugins/gitlab/tasks/pipeline_collector.go
@@ -27,6 +27,10 @@ import (
        helper "github.com/apache/incubator-devlake/helpers/pluginhelper/api"
 )
 
+func init() {
+       RegisterSubtaskMeta(&CollectApiPipelinesMeta)
+}
+
 const RAW_PIPELINE_TABLE = "gitlab_api_pipeline"
 
 var CollectApiPipelinesMeta = plugin.SubTaskMeta{
@@ -35,6 +39,7 @@ var CollectApiPipelinesMeta = plugin.SubTaskMeta{
        EnabledByDefault: true,
        Description:      "Collect pipeline data from gitlab api, supports both 
timeFilter and diffSync.",
        DomainTypes:      []string{plugin.DOMAIN_TYPE_CICD},
+       Dependencies:     []*plugin.SubTaskMeta{&ExtractApiMrCommitsMeta},
 }
 
 func CollectApiPipelines(taskCtx plugin.SubTaskContext) errors.Error {
diff --git a/backend/plugins/gitlab/tasks/pipeline_commit_convertor.go 
b/backend/plugins/gitlab/tasks/pipeline_commit_convertor.go
index f400de05d..cd5d831a8 100644
--- a/backend/plugins/gitlab/tasks/pipeline_commit_convertor.go
+++ b/backend/plugins/gitlab/tasks/pipeline_commit_convertor.go
@@ -29,12 +29,17 @@ import (
        gitlabModels "github.com/apache/incubator-devlake/plugins/gitlab/models"
 )
 
+func init() {
+       RegisterSubtaskMeta(&ConvertPipelineCommitMeta)
+}
+
 var ConvertPipelineCommitMeta = plugin.SubTaskMeta{
        Name:             "convertPipelineCommits",
        EntryPoint:       ConvertPipelineCommits,
        EnabledByDefault: true,
        Description:      "Convert tool layer table gitlab_pipeline_project 
into domain layer table pipeline",
        DomainTypes:      []string{plugin.DOMAIN_TYPE_CICD},
+       Dependencies:     []*plugin.SubTaskMeta{&ConvertPipelineMeta},
 }
 
 func ConvertPipelineCommits(taskCtx plugin.SubTaskContext) errors.Error {
diff --git a/backend/plugins/gitlab/tasks/pipeline_convertor.go 
b/backend/plugins/gitlab/tasks/pipeline_convertor.go
index 30e6b979b..ea871a012 100644
--- a/backend/plugins/gitlab/tasks/pipeline_convertor.go
+++ b/backend/plugins/gitlab/tasks/pipeline_convertor.go
@@ -32,12 +32,17 @@ import (
        gitlabModels "github.com/apache/incubator-devlake/plugins/gitlab/models"
 )
 
+func init() {
+       RegisterSubtaskMeta(&ConvertPipelineMeta)
+}
+
 var ConvertPipelineMeta = plugin.SubTaskMeta{
        Name:             "convertPipelines",
        EntryPoint:       ConvertPipelines,
        EnabledByDefault: true,
        Description:      "Convert tool layer table gitlab_pipeline into domain 
layer table pipeline",
        DomainTypes:      []string{plugin.DOMAIN_TYPE_CICD},
+       Dependencies:     []*plugin.SubTaskMeta{&ConvertCommitsMeta},
 }
 
 func ConvertPipelines(taskCtx plugin.SubTaskContext) errors.Error {
diff --git a/backend/plugins/gitlab/tasks/pipeline_detail_collector.go 
b/backend/plugins/gitlab/tasks/pipeline_detail_collector.go
index 0d22c81ac..856659adb 100644
--- a/backend/plugins/gitlab/tasks/pipeline_detail_collector.go
+++ b/backend/plugins/gitlab/tasks/pipeline_detail_collector.go
@@ -28,6 +28,10 @@ import (
        helper "github.com/apache/incubator-devlake/helpers/pluginhelper/api"
 )
 
+func init() {
+       RegisterSubtaskMeta(&CollectApiPipelineDetailsMeta)
+}
+
 const RAW_PIPELINE_DETAILS_TABLE = "gitlab_api_pipeline_details"
 
 var CollectApiPipelineDetailsMeta = plugin.SubTaskMeta{
@@ -36,6 +40,7 @@ var CollectApiPipelineDetailsMeta = plugin.SubTaskMeta{
        EnabledByDefault: true,
        Description:      "Collect pipeline details data from gitlab api, 
supports both timeFilter and diffSync.",
        DomainTypes:      []string{plugin.DOMAIN_TYPE_CICD},
+       Dependencies:     []*plugin.SubTaskMeta{&ExtractApiPipelinesMeta},
 }
 
 func CollectApiPipelineDetails(taskCtx plugin.SubTaskContext) errors.Error {
diff --git a/backend/plugins/gitlab/tasks/pipeline_detail_extractor.go 
b/backend/plugins/gitlab/tasks/pipeline_detail_extractor.go
index 1579eac8b..7370ad213 100644
--- a/backend/plugins/gitlab/tasks/pipeline_detail_extractor.go
+++ b/backend/plugins/gitlab/tasks/pipeline_detail_extractor.go
@@ -27,12 +27,17 @@ import (
        "github.com/apache/incubator-devlake/plugins/gitlab/models"
 )
 
+func init() {
+       RegisterSubtaskMeta(&ExtractApiPipelineDetailsMeta)
+}
+
 var ExtractApiPipelineDetailsMeta = plugin.SubTaskMeta{
        Name:             "extractApiPipelineDetails",
        EntryPoint:       ExtractApiPipelineDetails,
        EnabledByDefault: true,
        Description:      "Extract raw pipeline details data into tool layer 
table GitlabPipeline",
        DomainTypes:      []string{plugin.DOMAIN_TYPE_CICD},
+       Dependencies:     []*plugin.SubTaskMeta{&CollectApiPipelineDetailsMeta},
 }
 
 func ExtractApiPipelineDetails(taskCtx plugin.SubTaskContext) errors.Error {
diff --git a/backend/plugins/gitlab/tasks/pipeline_extractor.go 
b/backend/plugins/gitlab/tasks/pipeline_extractor.go
index 0c275a7d5..7b1baef35 100644
--- a/backend/plugins/gitlab/tasks/pipeline_extractor.go
+++ b/backend/plugins/gitlab/tasks/pipeline_extractor.go
@@ -27,6 +27,10 @@ import (
        "github.com/apache/incubator-devlake/plugins/gitlab/models"
 )
 
+func init() {
+       RegisterSubtaskMeta(&ExtractApiPipelinesMeta)
+}
+
 type ApiDetailedStatus struct {
        Icon        string
        Text        string
@@ -61,6 +65,7 @@ var ExtractApiPipelinesMeta = plugin.SubTaskMeta{
        EnabledByDefault: true,
        Description:      "Extract raw pipelines data into tool layer table 
GitlabPipeline",
        DomainTypes:      []string{plugin.DOMAIN_TYPE_CICD},
+       Dependencies:     []*plugin.SubTaskMeta{&CollectApiPipelinesMeta},
 }
 
 func ExtractApiPipelines(taskCtx plugin.SubTaskContext) errors.Error {
diff --git a/backend/plugins/gitlab/tasks/project_convertor.go 
b/backend/plugins/gitlab/tasks/project_convertor.go
index 419f1073b..f4990f99f 100644
--- a/backend/plugins/gitlab/tasks/project_convertor.go
+++ b/backend/plugins/gitlab/tasks/project_convertor.go
@@ -33,6 +33,10 @@ import (
        "github.com/apache/incubator-devlake/plugins/gitlab/models"
 )
 
+func init() {
+       RegisterSubtaskMeta(&ConvertProjectMeta)
+}
+
 const RAW_PROJECT_TABLE = "gitlab_api_project"
 
 type GitlabApiProject struct {
@@ -58,6 +62,7 @@ var ConvertProjectMeta = plugin.SubTaskMeta{
        EnabledByDefault: true,
        Description:      "Add domain layer Repo according to GitlabProject",
        DomainTypes:      []string{plugin.DOMAIN_TYPE_CODE, 
plugin.DOMAIN_TYPE_TICKET},
+       Dependencies:     []*plugin.SubTaskMeta{&ConvertAccountsMeta},
 }
 
 func ConvertApiProjects(taskCtx plugin.SubTaskContext) errors.Error {
diff --git a/backend/plugins/gitlab/tasks/register.go 
b/backend/plugins/gitlab/tasks/register.go
new file mode 100644
index 000000000..51b12a76c
--- /dev/null
+++ b/backend/plugins/gitlab/tasks/register.go
@@ -0,0 +1,26 @@
+/*
+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 "github.com/apache/incubator-devlake/core/plugin"
+
+var SubTaskMetaList []*plugin.SubTaskMeta
+
+func RegisterSubtaskMeta(meta *plugin.SubTaskMeta) {
+       SubTaskMetaList = append(SubTaskMetaList, meta)
+}
diff --git a/backend/plugins/gitlab/tasks/tag_collector.go 
b/backend/plugins/gitlab/tasks/tag_collector.go
index d36a429e4..af5e518ae 100644
--- a/backend/plugins/gitlab/tasks/tag_collector.go
+++ b/backend/plugins/gitlab/tasks/tag_collector.go
@@ -23,6 +23,10 @@ import (
        helper "github.com/apache/incubator-devlake/helpers/pluginhelper/api"
 )
 
+func init() {
+       RegisterSubtaskMeta(&CollectTagMeta)
+}
+
 const RAW_TAG_TABLE = "gitlab_api_tag"
 
 var CollectTagMeta = plugin.SubTaskMeta{
@@ -31,6 +35,7 @@ var CollectTagMeta = plugin.SubTaskMeta{
        EnabledByDefault: false,
        Description:      "Collect tag data from gitlab api, does not support 
either timeFilter or diffSync.",
        DomainTypes:      []string{plugin.DOMAIN_TYPE_CODE},
+       Dependencies:     
[]*plugin.SubTaskMeta{&ExtractApiMergeRequestDetailsMeta},
 }
 
 func CollectApiTag(taskCtx plugin.SubTaskContext) errors.Error {
diff --git a/backend/plugins/gitlab/tasks/tag_extractor.go 
b/backend/plugins/gitlab/tasks/tag_extractor.go
index f5c6a258b..9a94de337 100644
--- a/backend/plugins/gitlab/tasks/tag_extractor.go
+++ b/backend/plugins/gitlab/tasks/tag_extractor.go
@@ -25,6 +25,10 @@ import (
        "github.com/apache/incubator-devlake/plugins/gitlab/models"
 )
 
+func init() {
+       RegisterSubtaskMeta(&ExtractTagMeta)
+}
+
 type GitlabApiTag struct {
        Name      string
        Message   string
@@ -42,6 +46,7 @@ var ExtractTagMeta = plugin.SubTaskMeta{
        EnabledByDefault: false,
        Description:      "Extract raw tag data into tool layer table 
GitlabTag",
        DomainTypes:      []string{plugin.DOMAIN_TYPE_CODE},
+       Dependencies:     []*plugin.SubTaskMeta{&CollectTagMeta},
 }
 
 func ExtractApiTag(taskCtx plugin.SubTaskContext) errors.Error {


Reply via email to