You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@devlake.apache.org by ab...@apache.org on 2022/06/23 15:16:11 UTC

[incubator-devlake] 01/02: feat: jenkins blueprint normal mode support

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

commit 2d201b96ff061a1713be0363f49a19bfe2f89f4c
Author: abeizn <zi...@merico.dev>
AuthorDate: Thu Jun 23 22:54:18 2022 +0800

    feat: jenkins blueprint normal mode support
---
 plugins/jenkins/api/blueprint.go         | 59 ++++++++++++++++++++++++++++++++
 plugins/jenkins/impl/impl.go             | 12 ++++---
 plugins/jenkins/tasks/build_collector.go |  1 +
 plugins/jenkins/tasks/build_convertor.go |  1 +
 plugins/jenkins/tasks/build_extractor.go |  1 +
 plugins/jenkins/tasks/job_collector.go   |  1 +
 plugins/jenkins/tasks/job_convertor.go   |  1 +
 plugins/jenkins/tasks/job_extractor.go   |  1 +
 plugins/jenkins/tasks/task_data.go       | 15 ++++++++
 9 files changed, 87 insertions(+), 5 deletions(-)

diff --git a/plugins/jenkins/api/blueprint.go b/plugins/jenkins/api/blueprint.go
new file mode 100644
index 00000000..40b56357
--- /dev/null
+++ b/plugins/jenkins/api/blueprint.go
@@ -0,0 +1,59 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+    http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package api
+
+import (
+	"encoding/json"
+	"fmt"
+
+	"github.com/apache/incubator-devlake/plugins/core"
+	"github.com/apache/incubator-devlake/plugins/helper"
+	"github.com/apache/incubator-devlake/plugins/jenkins/tasks"
+)
+
+func MakePipelinePlan(subtaskMetas []core.SubTaskMeta, connectionId uint64, scope []*core.BlueprintScopeV100) (core.PipelinePlan, error) {
+	var err error
+	plan := make(core.PipelinePlan, len(scope))
+	for i, scopeElem := range scope {
+		// handle taskOptions and transformationRules, by dumping them to taskOptions
+		taskOptions := make(map[string]interface{})
+		err = json.Unmarshal(scopeElem.Options, &taskOptions)
+		if err != nil {
+			fmt.Println("1111")
+			return nil, err
+		}
+		taskOptions["connectionId"] = connectionId
+		_, err := tasks.DecodeAndValidateTaskOptions(taskOptions)
+		if err != nil {
+			return nil, err
+		}
+		// subtasks
+		subtasks, err := helper.MakePipelinePlanSubtasks(subtaskMetas, scopeElem.Entities)
+		if err != nil {
+			return nil, err
+		}
+		stage := core.PipelineStage{
+			{
+				Plugin:   "jenkins",
+				Subtasks: subtasks,
+				Options:  taskOptions,
+			},
+		}
+
+		plan[i] = stage
+	}
+	return plan, nil
+}
diff --git a/plugins/jenkins/impl/impl.go b/plugins/jenkins/impl/impl.go
index c7bf3d89..bb0885f5 100644
--- a/plugins/jenkins/impl/impl.go
+++ b/plugins/jenkins/impl/impl.go
@@ -27,7 +27,6 @@ import (
 	"github.com/apache/incubator-devlake/plugins/jenkins/models"
 	"github.com/apache/incubator-devlake/plugins/jenkins/models/migrationscripts"
 	"github.com/apache/incubator-devlake/plugins/jenkins/tasks"
-	"github.com/mitchellh/mapstructure"
 	"github.com/spf13/viper"
 	"gorm.io/gorm"
 )
@@ -60,10 +59,9 @@ func (plugin Jenkins) SubTaskMetas() []core.SubTaskMeta {
 	}
 }
 func (plugin Jenkins) PrepareTaskData(taskCtx core.TaskContext, options map[string]interface{}) (interface{}, error) {
-	var op tasks.JenkinsOptions
-	err := mapstructure.Decode(options, &op)
+	op, err := tasks.DecodeAndValidateTaskOptions(options)
 	if err != nil {
-		return nil, fmt.Errorf("Failed to decode options: %v", err)
+		return nil, err
 	}
 	if op.ConnectionId == 0 {
 		return nil, fmt.Errorf("connectionId is invalid")
@@ -87,7 +85,7 @@ func (plugin Jenkins) PrepareTaskData(taskCtx core.TaskContext, options map[stri
 		return nil, err
 	}
 	return &tasks.JenkinsTaskData{
-		Options:    &op,
+		Options:    op,
 		ApiClient:  apiClient,
 		Connection: connection,
 	}, nil
@@ -103,6 +101,10 @@ func (plugin Jenkins) MigrationScripts() []migration.Script {
 	}
 }
 
+func (plugin Jenkins) MakePipelinePlan(connectionId uint64, scope []*core.BlueprintScopeV100) (core.PipelinePlan, error) {
+	return api.MakePipelinePlan(plugin.SubTaskMetas(), connectionId, scope)
+}
+
 func (plugin Jenkins) ApiResources() map[string]map[string]core.ApiResourceHandler {
 	return map[string]map[string]core.ApiResourceHandler{
 		"test": {
diff --git a/plugins/jenkins/tasks/build_collector.go b/plugins/jenkins/tasks/build_collector.go
index 074cd276..85c8f2ad 100644
--- a/plugins/jenkins/tasks/build_collector.go
+++ b/plugins/jenkins/tasks/build_collector.go
@@ -36,6 +36,7 @@ var CollectApiBuildsMeta = core.SubTaskMeta{
 	EntryPoint:       CollectApiBuilds,
 	EnabledByDefault: true,
 	Description:      "Collect builds data from jenkins api",
+	DomainTypes:      []string{core.DOMAIN_TYPE_CICD},
 }
 
 type SimpleJob struct {
diff --git a/plugins/jenkins/tasks/build_convertor.go b/plugins/jenkins/tasks/build_convertor.go
index 12d4a6a2..9d3cb941 100644
--- a/plugins/jenkins/tasks/build_convertor.go
+++ b/plugins/jenkins/tasks/build_convertor.go
@@ -34,6 +34,7 @@ var ConvertBuildsMeta = core.SubTaskMeta{
 	EntryPoint:       ConvertBuilds,
 	EnabledByDefault: true,
 	Description:      "Convert tool layer table jenkins_builds into  domain layer table builds",
+	DomainTypes:      []string{core.DOMAIN_TYPE_CICD},
 }
 
 func ConvertBuilds(taskCtx core.SubTaskContext) error {
diff --git a/plugins/jenkins/tasks/build_extractor.go b/plugins/jenkins/tasks/build_extractor.go
index a3df36fb..bfc8e2ed 100644
--- a/plugins/jenkins/tasks/build_extractor.go
+++ b/plugins/jenkins/tasks/build_extractor.go
@@ -34,6 +34,7 @@ var ExtractApiBuildsMeta = core.SubTaskMeta{
 	EntryPoint:       ExtractApiBuilds,
 	EnabledByDefault: true,
 	Description:      "Extract raw builds data into tool layer table jenkins_builds",
+	DomainTypes:      []string{core.DOMAIN_TYPE_CICD},
 }
 
 func ExtractApiBuilds(taskCtx core.SubTaskContext) error {
diff --git a/plugins/jenkins/tasks/job_collector.go b/plugins/jenkins/tasks/job_collector.go
index ad4d32bd..d010706c 100644
--- a/plugins/jenkins/tasks/job_collector.go
+++ b/plugins/jenkins/tasks/job_collector.go
@@ -34,6 +34,7 @@ var CollectApiJobsMeta = core.SubTaskMeta{
 	EntryPoint:       CollectApiJobs,
 	EnabledByDefault: true,
 	Description:      "Collect jobs data from jenkins api",
+	DomainTypes:      []string{core.DOMAIN_TYPE_CICD},
 }
 
 func CollectApiJobs(taskCtx core.SubTaskContext) error {
diff --git a/plugins/jenkins/tasks/job_convertor.go b/plugins/jenkins/tasks/job_convertor.go
index 11e1bb8b..e9117ad7 100644
--- a/plugins/jenkins/tasks/job_convertor.go
+++ b/plugins/jenkins/tasks/job_convertor.go
@@ -34,6 +34,7 @@ var ConvertJobsMeta = core.SubTaskMeta{
 	EntryPoint:       ConvertJobs,
 	EnabledByDefault: true,
 	Description:      "Convert tool layer table jenkins_jobs into  domain layer table jobs",
+	DomainTypes:      []string{core.DOMAIN_TYPE_CICD},
 }
 
 func ConvertJobs(taskCtx core.SubTaskContext) error {
diff --git a/plugins/jenkins/tasks/job_extractor.go b/plugins/jenkins/tasks/job_extractor.go
index 18967eea..6f289008 100644
--- a/plugins/jenkins/tasks/job_extractor.go
+++ b/plugins/jenkins/tasks/job_extractor.go
@@ -32,6 +32,7 @@ var ExtractApiJobsMeta = core.SubTaskMeta{
 	EntryPoint:       ExtractApiJobs,
 	EnabledByDefault: true,
 	Description:      "Extract raw jobs data into tool layer table jenkins_jobs",
+	DomainTypes:      []string{core.DOMAIN_TYPE_CICD},
 }
 
 func ExtractApiJobs(taskCtx core.SubTaskContext) error {
diff --git a/plugins/jenkins/tasks/task_data.go b/plugins/jenkins/tasks/task_data.go
index 1ee92532..b0d35c6f 100644
--- a/plugins/jenkins/tasks/task_data.go
+++ b/plugins/jenkins/tasks/task_data.go
@@ -18,10 +18,12 @@ limitations under the License.
 package tasks
 
 import (
+	"fmt"
 	"time"
 
 	"github.com/apache/incubator-devlake/plugins/helper"
 	"github.com/apache/incubator-devlake/plugins/jenkins/models"
+	"github.com/mitchellh/mapstructure"
 )
 
 type JenkinsApiParams struct {
@@ -40,3 +42,16 @@ type JenkinsTaskData struct {
 	Connection *models.JenkinsConnection
 	Since      *time.Time
 }
+
+func DecodeAndValidateTaskOptions(options map[string]interface{}) (*JenkinsOptions, error) {
+	var op JenkinsOptions
+	err := mapstructure.Decode(options, &op)
+	if err != nil {
+		return nil, err
+	}
+	// find the needed Jenkins now
+	if op.ConnectionId == 0 {
+		return nil, fmt.Errorf("connectionId is invalid")
+	}
+	return &op, nil
+}