You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@devlake.apache.org by zh...@apache.org on 2022/12/02 02:52:43 UTC

[incubator-devlake] branch main updated: feat: add bp v200 for jira (#3839)

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

zhangliang2022 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 0debdb73 feat: add bp v200 for jira (#3839)
0debdb73 is described below

commit 0debdb736ec23ff6dcbf4d2cf77411fbf4f3ffa1
Author: Likyh <ya...@meri.co>
AuthorDate: Fri Dec 2 10:52:39 2022 +0800

    feat: add bp v200 for jira (#3839)
---
 plugins/jenkins/api/blueprint_v200_test.go         |   4 +-
 .../jira/api/{blueprint.go => blueprint_v100.go}   |   2 +-
 plugins/jira/api/blueprint_v200.go                 | 126 +++++++++++++++++++++
 .../{jenkins => jira}/api/blueprint_v200_test.go   |  49 ++++----
 plugins/jira/impl/impl.go                          |   6 +-
 plugins/jira/models/board.go                       |   2 +-
 plugins/jira/models/transformation_rules.go        |  12 +-
 7 files changed, 169 insertions(+), 32 deletions(-)

diff --git a/plugins/jenkins/api/blueprint_v200_test.go b/plugins/jenkins/api/blueprint_v200_test.go
index d536390f..641d2996 100644
--- a/plugins/jenkins/api/blueprint_v200_test.go
+++ b/plugins/jenkins/api/blueprint_v200_test.go
@@ -55,7 +55,7 @@ func TestMakeDataSourcePipelinePlanV200(t *testing.T) {
 			Model: common.Model{
 				ID: 1,
 			},
-			Name:              "github transformation rule",
+			Name:              "jenkins transformation rule",
 			DeploymentPattern: "hey,man,wasup",
 		}
 
@@ -74,7 +74,7 @@ func TestMakeDataSourcePipelinePlanV200(t *testing.T) {
 					"connectionId": uint64(1),
 					"fullName":     "a/b/ccc",
 					"transformationRules": map[string]interface{}{
-						"name":              "github transformation rule",
+						"name":              "jenkins transformation rule",
 						"deploymentPattern": "hey,man,wasup",
 					},
 				},
diff --git a/plugins/jira/api/blueprint.go b/plugins/jira/api/blueprint_v100.go
similarity index 93%
rename from plugins/jira/api/blueprint.go
rename to plugins/jira/api/blueprint_v100.go
index 776d59fd..6ab62b18 100644
--- a/plugins/jira/api/blueprint.go
+++ b/plugins/jira/api/blueprint_v100.go
@@ -25,7 +25,7 @@ import (
 	"github.com/apache/incubator-devlake/plugins/jira/tasks"
 )
 
-func MakePipelinePlan(subtaskMetas []core.SubTaskMeta, connectionId uint64, scope []*core.BlueprintScopeV100) (core.PipelinePlan, errors.Error) {
+func MakePipelinePlanV100(subtaskMetas []core.SubTaskMeta, connectionId uint64, scope []*core.BlueprintScopeV100) (core.PipelinePlan, errors.Error) {
 	var err errors.Error
 	plan := make(core.PipelinePlan, len(scope))
 	for i, scopeElem := range scope {
diff --git a/plugins/jira/api/blueprint_v200.go b/plugins/jira/api/blueprint_v200.go
new file mode 100644
index 00000000..901bf480
--- /dev/null
+++ b/plugins/jira/api/blueprint_v200.go
@@ -0,0 +1,126 @@
+/*
+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 (
+	goerror "errors"
+	"github.com/apache/incubator-devlake/models/domainlayer/ticket"
+	"github.com/apache/incubator-devlake/plugins/helper"
+	"gorm.io/gorm"
+
+	"github.com/apache/incubator-devlake/errors"
+	"github.com/apache/incubator-devlake/models/domainlayer"
+	"github.com/apache/incubator-devlake/models/domainlayer/didgen"
+	"github.com/apache/incubator-devlake/plugins/core"
+	"github.com/apache/incubator-devlake/plugins/core/dal"
+	"github.com/apache/incubator-devlake/plugins/jira/models"
+	"github.com/apache/incubator-devlake/plugins/jira/tasks"
+	"github.com/apache/incubator-devlake/utils"
+	"github.com/mitchellh/mapstructure"
+)
+
+func MakeDataSourcePipelinePlanV200(subtaskMetas []core.SubTaskMeta, connectionId uint64, bpScopes []*core.BlueprintScopeV200) (core.PipelinePlan, []core.Scope, errors.Error) {
+	db := basicRes.GetDal()
+	// get the connection info for url
+	connection := &models.JiraConnection{}
+	err := connectionHelper.FirstById(connection, connectionId)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	plan := make(core.PipelinePlan, 0, len(bpScopes))
+	scopes := make([]core.Scope, 0, len(bpScopes))
+	for i, bpScope := range bpScopes {
+		var jiraBoard *models.JiraBoard
+		// get repo from db
+		err = db.First(jiraBoard, dal.Where(`id = ?`, bpScope.Id))
+		if err != nil {
+			return nil, nil, err
+		}
+		var transformationRule *models.JiraTransformationRule
+		// get transformation rules from db
+		err = db.First(transformationRule, dal.Where(`id = ?`, jiraBoard.TransformationRuleId))
+		if err != nil && goerror.Is(err, gorm.ErrRecordNotFound) {
+			return nil, nil, err
+		}
+		var scope []core.Scope
+		// make pipeline for each bpScope
+		plan[i], scope, err = makeDataSourcePipelinePlanV200(subtaskMetas, bpScope, jiraBoard, transformationRule)
+		if err != nil {
+			return nil, nil, err
+		}
+		if len(scope) > 0 {
+			scopes = append(scopes, scope...)
+		}
+
+	}
+
+	return plan, scopes, nil
+}
+
+func makeDataSourcePipelinePlanV200(
+	subtaskMetas []core.SubTaskMeta,
+	bpScope *core.BlueprintScopeV200,
+	jiraBoard *models.JiraBoard,
+	transformationRule *models.JiraTransformationRule,
+) (core.PipelineStage, []core.Scope, errors.Error) {
+	var err errors.Error
+	var stage core.PipelineStage
+	scopes := make([]core.Scope, 0)
+
+	// construct task options for jenkins
+	var options map[string]interface{}
+	err = errors.Convert(mapstructure.Decode(jiraBoard, &options))
+	if err != nil {
+		return nil, nil, err
+	}
+	// make sure task options is valid
+	_, err = tasks.DecodeAndValidateTaskOptions(options)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	var transformationRuleMap map[string]interface{}
+	err = errors.Convert(mapstructure.Decode(transformationRule, &transformationRuleMap))
+	if err != nil {
+		return nil, nil, err
+	}
+	options["transformationRules"] = transformationRuleMap
+	subtasks, err := helper.MakePipelinePlanSubtasks(subtaskMetas, bpScope.Entities)
+	if err != nil {
+		return nil, nil, err
+	}
+	stage = append(stage, &core.PipelineTask{
+		Plugin:   "jira",
+		Subtasks: subtasks,
+		Options:  options,
+	})
+
+	// add cicd_scope to scopes
+	if utils.StringsContains(bpScope.Entities, core.DOMAIN_TYPE_TICKET) {
+		scopeCICD := &ticket.Board{
+			DomainEntity: domainlayer.DomainEntity{
+				Id: didgen.NewDomainIdGenerator(&models.JiraBoard{}).Generate(jiraBoard.ConnectionId, jiraBoard.BoardId),
+			},
+			Name: jiraBoard.Name,
+		}
+		scopes = append(scopes, scopeCICD)
+	}
+
+	return stage, scopes, nil
+}
diff --git a/plugins/jenkins/api/blueprint_v200_test.go b/plugins/jira/api/blueprint_v200_test.go
similarity index 69%
copy from plugins/jenkins/api/blueprint_v200_test.go
copy to plugins/jira/api/blueprint_v200_test.go
index d536390f..672541c2 100644
--- a/plugins/jenkins/api/blueprint_v200_test.go
+++ b/plugins/jira/api/blueprint_v200_test.go
@@ -21,20 +21,20 @@ import (
 	"github.com/apache/incubator-devlake/mocks"
 	"github.com/apache/incubator-devlake/models/common"
 	"github.com/apache/incubator-devlake/models/domainlayer"
-	"github.com/apache/incubator-devlake/models/domainlayer/devops"
+	"github.com/apache/incubator-devlake/models/domainlayer/ticket"
 	"github.com/apache/incubator-devlake/plugins/core"
-	"github.com/apache/incubator-devlake/plugins/jenkins/models"
+	"github.com/apache/incubator-devlake/plugins/jira/models"
 	"github.com/stretchr/testify/assert"
 	"testing"
 )
 
 func TestMakeDataSourcePipelinePlanV200(t *testing.T) {
 	mockMeta := mocks.NewPluginMeta(t)
-	mockMeta.On("RootPkgPath").Return("github.com/apache/incubator-devlake/plugins/jenkins")
-	err := core.RegisterPlugin("jenkins", mockMeta)
+	mockMeta.On("RootPkgPath").Return("github.com/apache/incubator-devlake/plugins/jira")
+	err := core.RegisterPlugin("jira", mockMeta)
 	assert.Nil(t, err)
 	bs := &core.BlueprintScopeV200{
-		Entities: []string{"CICD"},
+		Entities: []string{"TICKET"},
 		Id:       "",
 		Name:     "",
 	}
@@ -44,39 +44,46 @@ func TestMakeDataSourcePipelinePlanV200(t *testing.T) {
 	plan := make(core.PipelinePlan, len(bpScopes))
 	scopes := make([]core.Scope, 0, len(bpScopes))
 	for i, bpScope := range bpScopes {
-		jenkinsJob := &models.JenkinsJob{
+		jiraBoard := &models.JiraBoard{
 			ConnectionId: 1,
-			FullName:     "a/b/ccc",
-			Path:         "a/b/",
-			Name:         "ccc",
+			BoardId:      10,
+			Name:         "a",
+			ProjectId:    20,
+			Self:         "self",
+			Type:         "type",
 		}
 
-		transformationRule := &models.JenkinsTransformationRule{
+		transformationRule := &models.JiraTransformationRule{
 			Model: common.Model{
 				ID: 1,
 			},
-			Name:              "github transformation rule",
-			DeploymentPattern: "hey,man,wasup",
+			Name:         "jira transformation rule",
+			EpicKeyField: "hey,man,wasup",
 		}
 
 		var scope []core.Scope
-		plan[i], scope, err = makeDataSourcePipelinePlanV200(nil, bpScope, jenkinsJob, transformationRule)
+		plan[i], scope, err = makeDataSourcePipelinePlanV200(nil, bpScope, jiraBoard, transformationRule)
 		assert.Nil(t, err)
 		scopes = append(scopes, scope...)
 	}
 	expectPlan := core.PipelinePlan{
 		core.PipelineStage{
 			{
-				Plugin:     "jenkins",
+				Plugin:     "jira",
 				Subtasks:   []string{},
 				SkipOnFail: false,
 				Options: map[string]interface{}{
-					"connectionId": uint64(1),
-					"fullName":     "a/b/ccc",
+					"connectionId":         uint64(1),
+					"boardId":              uint64(10),
+					"projectId":            uint(20),
+					"name":                 "a",
+					"self":                 "self",
+					"transformationRuleId": uint64(0),
 					"transformationRules": map[string]interface{}{
-						"name":              "github transformation rule",
-						"deploymentPattern": "hey,man,wasup",
+						"name":         "jira transformation rule",
+						"epicKeyField": "hey,man,wasup",
 					},
+					"type": "type",
 				},
 			},
 		},
@@ -84,11 +91,11 @@ func TestMakeDataSourcePipelinePlanV200(t *testing.T) {
 	assert.Equal(t, expectPlan, plan)
 
 	expectScopes := make([]core.Scope, 0)
-	scopeCicd := &devops.CicdScope{
+	scopeCicd := &ticket.Board{
 		DomainEntity: domainlayer.DomainEntity{
-			Id: "jenkins:JenkinsJob:1:a/b/ccc",
+			Id: "jira:JiraBoard:1:10",
 		},
-		Name:        "a/b/ccc",
+		Name:        "a",
 		Description: "",
 		Url:         "",
 		CreatedDate: nil,
diff --git a/plugins/jira/impl/impl.go b/plugins/jira/impl/impl.go
index 2aff6321..8d02d463 100644
--- a/plugins/jira/impl/impl.go
+++ b/plugins/jira/impl/impl.go
@@ -217,7 +217,11 @@ func (plugin Jira) PrepareTaskData(taskCtx core.TaskContext, options map[string]
 }
 
 func (plugin Jira) MakePipelinePlan(connectionId uint64, scope []*core.BlueprintScopeV100) (core.PipelinePlan, errors.Error) {
-	return api.MakePipelinePlan(plugin.SubTaskMetas(), connectionId, scope)
+	return api.MakePipelinePlanV100(plugin.SubTaskMetas(), connectionId, scope)
+}
+
+func (plugin Jira) MakeDataSourcePipelinePlanV200(connectionId uint64, scopes []*core.BlueprintScopeV200) (pp core.PipelinePlan, sc []core.Scope, err errors.Error) {
+	return api.MakeDataSourcePipelinePlanV200(plugin.SubTaskMetas(), connectionId, scopes)
 }
 
 func (plugin Jira) RootPkgPath() string {
diff --git a/plugins/jira/models/board.go b/plugins/jira/models/board.go
index 317ffd89..c1a3ab65 100644
--- a/plugins/jira/models/board.go
+++ b/plugins/jira/models/board.go
@@ -22,7 +22,7 @@ import (
 )
 
 type JiraBoard struct {
-	common.NoPKModel
+	common.NoPKModel     `mapstructure:"-"`
 	ConnectionId         uint64 `json:"connectionId" mapstructure:"connectionId" gorm:"primaryKey"`
 	BoardId              uint64 `json:"boardId" mapstructure:"boardId" gorm:"primaryKey"`
 	TransformationRuleId uint64 `json:"transformationRuleId" mapstructure:"transformationRuleId"`
diff --git a/plugins/jira/models/transformation_rules.go b/plugins/jira/models/transformation_rules.go
index 0c10f5df..448bcab6 100644
--- a/plugins/jira/models/transformation_rules.go
+++ b/plugins/jira/models/transformation_rules.go
@@ -24,12 +24,12 @@ import (
 )
 
 type JiraTransformationRule struct {
-	common.Model
-	Name                       string          `gorm:"type:varchar(255)"`
-	EpicKeyField               string          `json:"epicKeyField" gorm:"type:varchar(255)"`
-	StoryPointField            string          `json:"storyPointField" gorm:"type:varchar(255)"`
-	RemotelinkCommitShaPattern string          `json:"remotelinkCommitShaPattern" gorm:"type:varchar(255)"`
-	TypeMappings               json.RawMessage `json:"typeMappings"`
+	common.Model               `mapstructure:"-"`
+	Name                       string          `mapstructure:"name" json:"name" gorm:"type:varchar(255)"`
+	EpicKeyField               string          `mapstructure:"epicKeyField,omitempty" json:"epicKeyField" gorm:"type:varchar(255)"`
+	StoryPointField            string          `mapstructure:"storyPointField,omitempty" json:"storyPointField" gorm:"type:varchar(255)"`
+	RemotelinkCommitShaPattern string          `mapstructure:"remotelinkCommitShaPattern,omitempty" json:"remotelinkCommitShaPattern" gorm:"type:varchar(255)"`
+	TypeMappings               json.RawMessage `mapstructure:"typeMappings,omitempty" json:"typeMappings"`
 }
 
 func (JiraTransformationRule) TableName() string {