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

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

commit 7589f6b123798cd20c2d37dc0eb34b1bd77b837d
Author: d4x1 <[email protected]>
AuthorDate: Fri Sep 6 15:22:59 2024 +0800

    feat(gitlab): add source field to pipelines
---
 ...ines.go => 20240906_add_source_to_pipelines.go} |  4 +-
 backend/plugins/gitlab/models/pipeline.go          |  4 +-
 .../gitlab/tasks/child_pipeline_collector.go       |  1 -
 .../gitlab/tasks/child_pipeline_extractor.go       | 84 ++++++++++++++++++++++
 backend/plugins/gitlab/tasks/job_extractor.go      |  1 -
 .../gitlab/tasks/pipeline_detail_collector.go      |  2 +-
 .../gitlab/tasks/pipeline_detail_extractor.go      |  6 +-
 backend/plugins/gitlab/tasks/pipeline_extractor.go | 25 ++-----
 backend/plugins/gitlab/tasks/tag_extractor.go      |  3 +-
 .../plugins/gitlab/tasks/trigger_job_extractor.go  |  1 -
 10 files changed, 99 insertions(+), 32 deletions(-)

diff --git 
a/backend/plugins/gitlab/models/migrationscripts/20240906_add_is_child_to_pipelines.go
 
b/backend/plugins/gitlab/models/migrationscripts/20240906_add_source_to_pipelines.go
similarity index 98%
rename from 
backend/plugins/gitlab/models/migrationscripts/20240906_add_is_child_to_pipelines.go
rename to 
backend/plugins/gitlab/models/migrationscripts/20240906_add_source_to_pipelines.go
index e904667a2..63b2c1e6c 100644
--- 
a/backend/plugins/gitlab/models/migrationscripts/20240906_add_is_child_to_pipelines.go
+++ 
b/backend/plugins/gitlab/models/migrationscripts/20240906_add_source_to_pipelines.go
@@ -23,7 +23,7 @@ import (
 )
 
 type gitlabPipelineProject240906 struct {
-       IsChild bool
+       Source string
 }
 
 func (gitlabPipelineProject240906) TableName() string {
@@ -31,7 +31,7 @@ func (gitlabPipelineProject240906) TableName() string {
 }
 
 type gitlabPipeline240906 struct {
-       IsChild bool
+       Source string
 }
 
 func (gitlabPipeline240906) TableName() string {
diff --git a/backend/plugins/gitlab/models/pipeline.go 
b/backend/plugins/gitlab/models/pipeline.go
index d00a558e7..b1de5ea03 100644
--- a/backend/plugins/gitlab/models/pipeline.go
+++ b/backend/plugins/gitlab/models/pipeline.go
@@ -45,7 +45,7 @@ type GitlabPipeline struct {
        Environment string `gorm:"type:varchar(255)"`
 
        IsDetailRequired bool
-       IsChild          bool
+       Source           string
 
        common.NoPKModel
 }
@@ -65,7 +65,7 @@ type GitlabPipelineProject struct {
        GitlabUpdatedAt *time.Time
        common.NoPKModel
 
-       IsChild bool
+       Source string
 }
 
 func (GitlabPipelineProject) TableName() string {
diff --git a/backend/plugins/gitlab/tasks/child_pipeline_collector.go 
b/backend/plugins/gitlab/tasks/child_pipeline_collector.go
index 022f80410..6a2473644 100644
--- a/backend/plugins/gitlab/tasks/child_pipeline_collector.go
+++ b/backend/plugins/gitlab/tasks/child_pipeline_collector.go
@@ -39,7 +39,6 @@ var CollectApiChildPipelinesMeta = plugin.SubTaskMeta{
        EnabledByDefault: true,
        Description:      "Collect child pipeline data from gitlab api, 
supports both timeFilter and diffSync.",
        DomainTypes:      []string{plugin.DOMAIN_TYPE_CICD},
-       Dependencies:     []*plugin.SubTaskMeta{&CollectApiPipelinesMeta},
 }
 
 func CollectApiChildPipelines(taskCtx plugin.SubTaskContext) errors.Error {
diff --git a/backend/plugins/gitlab/tasks/child_pipeline_extractor.go 
b/backend/plugins/gitlab/tasks/child_pipeline_extractor.go
new file mode 100644
index 000000000..4c7d8d875
--- /dev/null
+++ b/backend/plugins/gitlab/tasks/child_pipeline_extractor.go
@@ -0,0 +1,84 @@
+/*
+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/models/common"
+       "github.com/apache/incubator-devlake/core/plugin"
+       "github.com/apache/incubator-devlake/helpers/pluginhelper/api"
+       "github.com/apache/incubator-devlake/plugins/gitlab/models"
+)
+
+func init() {
+       RegisterSubtaskMeta(&ExtractApiChildPipelinesMeta)
+}
+
+var ExtractApiChildPipelinesMeta = plugin.SubTaskMeta{
+       Name:             "Extract Child Pipelines",
+       EntryPoint:       ExtractApiChildPipelines,
+       EnabledByDefault: true,
+       Description:      "Extract raw pipelines data into tool layer table 
GitlabPipeline",
+       DomainTypes:      []string{plugin.DOMAIN_TYPE_CICD},
+       Dependencies:     []*plugin.SubTaskMeta{&CollectApiChildPipelinesMeta},
+}
+
+func ExtractApiChildPipelines(taskCtx plugin.SubTaskContext) errors.Error {
+       rawDataSubTaskArgs, data := CreateRawDataSubTaskArgs(taskCtx, 
RAW_CHILD_PIPELINE_TABLE)
+
+       extractor, err := api.NewApiExtractor(api.ApiExtractorArgs{
+               RawDataSubTaskArgs: *rawDataSubTaskArgs,
+               Extract: func(row *api.RawData) ([]interface{}, errors.Error) {
+                       gitlabApiChildPipeline := &ApiPipeline{}
+                       err := errors.Convert(json.Unmarshal(row.Data, 
gitlabApiChildPipeline))
+                       if err != nil {
+                               return nil, err
+                       }
+                       pipelineProject := 
convertApiPipelineToGitlabPipelineProject(gitlabApiChildPipeline, 
data.Options.ConnectionId, data.Options.ProjectId)
+                       return []interface{}{pipelineProject}, nil
+               },
+       })
+
+       if err != nil {
+               return err
+       }
+
+       err = extractor.Execute()
+       if err != nil {
+               return err
+       }
+
+       return nil
+}
+
+func convertApiPipelineToGitlabPipelineProject(gitlabApiChildPipeline 
*ApiPipeline, connectionId uint64, projectId int) *models.GitlabPipelineProject 
{
+       pipelineProject := &models.GitlabPipelineProject{
+               ConnectionId:    connectionId,
+               PipelineId:      gitlabApiChildPipeline.Id,
+               ProjectId:       projectId,
+               Ref:             gitlabApiChildPipeline.Ref,
+               WebUrl:          gitlabApiChildPipeline.WebUrl,
+               Sha:             gitlabApiChildPipeline.Sha,
+               Source:          gitlabApiChildPipeline.Source,
+               GitlabCreatedAt: 
common.Iso8601TimeToTime(gitlabApiChildPipeline.CreatedAt),
+               GitlabUpdatedAt: 
common.Iso8601TimeToTime(gitlabApiChildPipeline.UpdatedAt),
+       }
+       return pipelineProject
+}
diff --git a/backend/plugins/gitlab/tasks/job_extractor.go 
b/backend/plugins/gitlab/tasks/job_extractor.go
index ff5031ce6..420fe7a30 100644
--- a/backend/plugins/gitlab/tasks/job_extractor.go
+++ b/backend/plugins/gitlab/tasks/job_extractor.go
@@ -65,7 +65,6 @@ func ExtractApiJobs(taskCtx plugin.SubTaskContext) 
errors.Error {
        extractor, err := api.NewApiExtractor(api.ApiExtractorArgs{
                RawDataSubTaskArgs: *rawDataSubTaskArgs,
                Extract: func(row *api.RawData) ([]interface{}, errors.Error) {
-                       // create gitlab commit
                        gitlabApiJob := &ApiJob{}
                        err := errors.Convert(json.Unmarshal(row.Data, 
gitlabApiJob))
                        if err != nil {
diff --git a/backend/plugins/gitlab/tasks/pipeline_detail_collector.go 
b/backend/plugins/gitlab/tasks/pipeline_detail_collector.go
index a4bed6b0d..6a800d01f 100644
--- a/backend/plugins/gitlab/tasks/pipeline_detail_collector.go
+++ b/backend/plugins/gitlab/tasks/pipeline_detail_collector.go
@@ -40,7 +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},
+       Dependencies:     []*plugin.SubTaskMeta{&ExtractApiPipelinesMeta, 
&ExtractApiChildPipelinesMeta},
 }
 
 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 a5e597e23..1b78362a1 100644
--- a/backend/plugins/gitlab/tasks/pipeline_detail_extractor.go
+++ b/backend/plugins/gitlab/tasks/pipeline_detail_extractor.go
@@ -47,7 +47,6 @@ func ExtractApiPipelineDetails(taskCtx plugin.SubTaskContext) 
errors.Error {
        extractor, err := api.NewApiExtractor(api.ApiExtractorArgs{
                RawDataSubTaskArgs: *rawDataSubTaskArgs,
                Extract: func(row *api.RawData) ([]interface{}, errors.Error) {
-                       // create gitlab commit
                        gitlabApiPipeline := &ApiPipeline{}
                        err := errors.Convert(json.Unmarshal(row.Data, 
gitlabApiPipeline))
                        if err != nil {
@@ -70,11 +69,10 @@ func ExtractApiPipelineDetails(taskCtx 
plugin.SubTaskContext) errors.Error {
                                ConnectionId:    data.Options.ConnectionId,
                                Type:            
data.RegexEnricher.ReturnNameIfMatched(devops.DEPLOYMENT, 
gitlabApiPipeline.Ref),
                                Environment:     
data.RegexEnricher.ReturnNameIfMatched(devops.PRODUCTION, 
gitlabApiPipeline.Ref),
+                               Source:          gitlabApiPipeline.Source,
                        }
 
-                       results := make([]interface{}, 0, 1)
-                       results = append(results, gitlabPipeline)
-                       return results, nil
+                       return []interface{}{gitlabPipeline}, nil
                },
        })
        if err != nil {
diff --git a/backend/plugins/gitlab/tasks/pipeline_extractor.go 
b/backend/plugins/gitlab/tasks/pipeline_extractor.go
index 9cce27c80..85b688d8c 100644
--- a/backend/plugins/gitlab/tasks/pipeline_extractor.go
+++ b/backend/plugins/gitlab/tasks/pipeline_extractor.go
@@ -24,7 +24,6 @@ import (
        "github.com/apache/incubator-devlake/core/models/common"
        "github.com/apache/incubator-devlake/core/plugin"
        "github.com/apache/incubator-devlake/helpers/pluginhelper/api"
-       "github.com/apache/incubator-devlake/plugins/gitlab/models"
 )
 
 func init() {
@@ -42,6 +41,10 @@ type ApiDetailedStatus struct {
        Favicon     string
 }
 
+const (
+       PipelineSourceParentPipeline = "parent_pipeline"
+)
+
 type ApiPipeline struct {
        Id             int `json:"id"`
        Ref            string
@@ -51,6 +54,7 @@ type ApiPipeline struct {
        Duration       int
        QueuedDuration *float64 `json:"queued_duration"`
        WebUrl         string   `json:"web_url"`
+       Source         string   `json:"source"`
 
        CreatedAt  *common.Iso8601Time `json:"created_at"`
        UpdatedAt  *common.Iso8601Time `json:"updated_at"`
@@ -75,28 +79,13 @@ func ExtractApiPipelines(taskCtx plugin.SubTaskContext) 
errors.Error {
        extractor, err := api.NewApiExtractor(api.ApiExtractorArgs{
                RawDataSubTaskArgs: *rawDataSubTaskArgs,
                Extract: func(row *api.RawData) ([]interface{}, errors.Error) {
-                       // create gitlab commit
                        gitlabApiPipeline := &ApiPipeline{}
                        err := errors.Convert(json.Unmarshal(row.Data, 
gitlabApiPipeline))
                        if err != nil {
                                return nil, err
                        }
-
-                       pipelineProject := &models.GitlabPipelineProject{
-                               ConnectionId:    data.Options.ConnectionId,
-                               PipelineId:      gitlabApiPipeline.Id,
-                               ProjectId:       data.Options.ProjectId,
-                               Ref:             gitlabApiPipeline.Ref,
-                               WebUrl:          gitlabApiPipeline.WebUrl,
-                               Sha:             gitlabApiPipeline.Sha,
-                               GitlabCreatedAt: 
common.Iso8601TimeToTime(gitlabApiPipeline.CreatedAt),
-                               GitlabUpdatedAt: 
common.Iso8601TimeToTime(gitlabApiPipeline.UpdatedAt),
-                       }
-
-                       results := make([]interface{}, 0, 1)
-                       results = append(results, pipelineProject)
-
-                       return results, nil
+                       pipelineProject := 
convertApiPipelineToGitlabPipelineProject(gitlabApiPipeline, 
data.Options.ConnectionId, data.Options.ProjectId)
+                       return []interface{}{pipelineProject}, nil
                },
        })
 
diff --git a/backend/plugins/gitlab/tasks/tag_extractor.go 
b/backend/plugins/gitlab/tasks/tag_extractor.go
index 8aba401f3..60dac78a4 100644
--- a/backend/plugins/gitlab/tasks/tag_extractor.go
+++ b/backend/plugins/gitlab/tasks/tag_extractor.go
@@ -56,10 +56,9 @@ func ExtractApiTag(taskCtx plugin.SubTaskContext) 
errors.Error {
        extractor, err := api.NewApiExtractor(api.ApiExtractorArgs{
                RawDataSubTaskArgs: *rawDataSubTaskArgs,
                Extract: func(row *api.RawData) ([]interface{}, errors.Error) {
-                       // need to extract 1 kinds of entities here
+                       // need to extract 1 kind of entities here
                        results := make([]interface{}, 0, 1)
 
-                       // create gitlab commit
                        gitlabApiTag := &GitlabApiTag{}
                        err := errors.Convert(json.Unmarshal(row.Data, 
gitlabApiTag))
                        if err != nil {
diff --git a/backend/plugins/gitlab/tasks/trigger_job_extractor.go 
b/backend/plugins/gitlab/tasks/trigger_job_extractor.go
index f429f9b4d..f515b7b85 100644
--- a/backend/plugins/gitlab/tasks/trigger_job_extractor.go
+++ b/backend/plugins/gitlab/tasks/trigger_job_extractor.go
@@ -61,7 +61,6 @@ func ExtractApiTriggerJobs(taskCtx plugin.SubTaskContext) 
errors.Error {
        extractor, err := api.NewApiExtractor(api.ApiExtractorArgs{
                RawDataSubTaskArgs: *rawDataSubTaskArgs,
                Extract: func(row *api.RawData) ([]interface{}, errors.Error) {
-                       // create gitlab commit
                        gitlabApiTriggerJob := &ApiTriggerJob{}
                        err := errors.Convert(json.Unmarshal(row.Data, 
gitlabApiTriggerJob))
                        if err != nil {

Reply via email to