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/06/28 01:42:53 UTC

[incubator-devlake] branch main updated: feat: jira blueprint normal mode (#2364)

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 8ca740a1 feat: jira blueprint normal mode (#2364)
8ca740a1 is described below

commit 8ca740a125a8fb9d3279f72173af3cd5b4efd002
Author: mindlesscloud <li...@merico.dev>
AuthorDate: Tue Jun 28 09:42:49 2022 +0800

    feat: jira blueprint normal mode (#2364)
    
    * feat: jira blueprint normal mode
    
    * refactor: remove redundant codes
---
 plugins/jira/api/blueprint.go                      | 64 ++++++++++++++++++++++
 plugins/jira/impl/impl.go                          |  5 ++
 plugins/jira/models/migrationscripts/register.go   |  1 +
 .../migrationscripts/updateSchemas20220624.go      | 57 +++++++++++++++++++
 plugins/jira/tasks/board_collector.go              |  1 +
 plugins/jira/tasks/board_convertor.go              |  3 +-
 plugins/jira/tasks/board_extractor.go              |  1 +
 plugins/jira/tasks/changelog_collector.go          |  1 +
 plugins/jira/tasks/changelog_convertor.go          |  1 +
 plugins/jira/tasks/changelog_extractor.go          |  1 +
 plugins/jira/tasks/issue_collector.go              |  1 +
 plugins/jira/tasks/issue_commit_convertor.go       |  1 +
 plugins/jira/tasks/issue_convertor.go              |  1 +
 plugins/jira/tasks/issue_extractor.go              |  1 +
 plugins/jira/tasks/issue_repo_commit_convertor.go  |  1 +
 plugins/jira/tasks/project_collector.go            |  1 +
 plugins/jira/tasks/project_extractor.go            |  1 +
 plugins/jira/tasks/remotelink_collector.go         |  1 +
 plugins/jira/tasks/remotelink_extractor.go         |  1 +
 plugins/jira/tasks/sprint_collector.go             |  1 +
 plugins/jira/tasks/sprint_convertor.go             |  1 +
 plugins/jira/tasks/sprint_extractor.go             |  1 +
 plugins/jira/tasks/sprint_issues_convertor.go      |  1 +
 plugins/jira/tasks/status_collector.go             |  1 +
 plugins/jira/tasks/status_extractor.go             |  1 +
 plugins/jira/tasks/task_data.go                    | 22 +++++++-
 plugins/jira/tasks/user_collector.go               |  1 +
 plugins/jira/tasks/user_convertor.go               |  1 +
 plugins/jira/tasks/user_extractor.go               |  1 +
 plugins/jira/tasks/worklog_collector.go            |  1 +
 plugins/jira/tasks/worklog_convertor.go            |  1 +
 plugins/jira/tasks/worklog_extractor.go            |  1 +
 32 files changed, 174 insertions(+), 4 deletions(-)

diff --git a/plugins/jira/api/blueprint.go b/plugins/jira/api/blueprint.go
new file mode 100644
index 00000000..cbf5043b
--- /dev/null
+++ b/plugins/jira/api/blueprint.go
@@ -0,0 +1,64 @@
+/*
+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"
+
+	"github.com/apache/incubator-devlake/plugins/core"
+	"github.com/apache/incubator-devlake/plugins/helper"
+	"github.com/apache/incubator-devlake/plugins/jira/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 {
+		var transformationRules tasks.TransformationRules
+		if len(scopeElem.Transformation) > 0 {
+			err = json.Unmarshal(scopeElem.Transformation, &transformationRules)
+			if err != nil {
+				return nil, err
+			}
+		}
+		taskOptions := make(map[string]interface{})
+		err = json.Unmarshal(scopeElem.Options, &taskOptions)
+		if err != nil {
+			return nil, err
+		}
+		taskOptions["connectionId"] = connectionId
+		taskOptions["transformationRules"] = transformationRules
+		_, err := tasks.DecodeAndValidateTaskOptions(taskOptions)
+		if err != nil {
+			return nil, err
+		}
+		// subtasks
+		subtasks, err := helper.MakePipelinePlanSubtasks(subtaskMetas, scopeElem.Entities)
+		if err != nil {
+			return nil, err
+		}
+		plan[i] = core.PipelineStage{
+			{
+				Plugin:   "jira",
+				Subtasks: subtasks,
+				Options:  taskOptions,
+			},
+		}
+	}
+	return plan, nil
+}
diff --git a/plugins/jira/impl/impl.go b/plugins/jira/impl/impl.go
index ef434189..455d8ac7 100644
--- a/plugins/jira/impl/impl.go
+++ b/plugins/jira/impl/impl.go
@@ -39,6 +39,7 @@ var _ core.PluginInit = (*Jira)(nil)
 var _ core.PluginTask = (*Jira)(nil)
 var _ core.PluginApi = (*Jira)(nil)
 var _ core.Migratable = (*Jira)(nil)
+var _ core.PluginBlueprintV100 = (*Jira)(nil)
 
 type Jira struct{}
 
@@ -150,6 +151,10 @@ func (plugin Jira) PrepareTaskData(taskCtx core.TaskContext, options map[string]
 	return taskData, nil
 }
 
+func (plugin Jira) MakePipelinePlan(connectionId uint64, scope []*core.BlueprintScopeV100) (core.PipelinePlan, error) {
+	return api.MakePipelinePlan(plugin.SubTaskMetas(), connectionId, scope)
+}
+
 func (plugin Jira) RootPkgPath() string {
 	return "github.com/apache/incubator-devlake/plugins/jira"
 }
diff --git a/plugins/jira/models/migrationscripts/register.go b/plugins/jira/models/migrationscripts/register.go
index e3fcd0b4..6bfd0402 100644
--- a/plugins/jira/models/migrationscripts/register.go
+++ b/plugins/jira/models/migrationscripts/register.go
@@ -36,5 +36,6 @@ func All() []migration.Script {
 		new(UpdateSchemas20220615),
 		new(UpdateSchemas20220616),
 		new(UpdateSchemas20220620),
+		new(UpdateSchemas20220624),
 	}
 }
diff --git a/plugins/jira/models/migrationscripts/updateSchemas20220624.go b/plugins/jira/models/migrationscripts/updateSchemas20220624.go
new file mode 100644
index 00000000..5dc389fa
--- /dev/null
+++ b/plugins/jira/models/migrationscripts/updateSchemas20220624.go
@@ -0,0 +1,57 @@
+/*
+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 migrationscripts
+
+import (
+	"context"
+
+	"gorm.io/gorm"
+)
+
+type JiraConnection20220624 struct {
+	EpicKeyField               string `gorm:"type:varchar(50);" json:"epicKeyField"`
+	StoryPointField            string `gorm:"type:varchar(50);" json:"storyPointField"`
+	RemotelinkCommitShaPattern string `gorm:"type:varchar(255);comment='golang regexp, the first group will be recognized as commit sha, ref https://github.com/google/re2/wiki/Syntax'" json:"remotelinkCommitShaPattern"`
+}
+
+func (JiraConnection20220624) TableName() string {
+	return "_tool_jira_connections"
+}
+
+type UpdateSchemas20220624 struct {
+}
+
+func (u *UpdateSchemas20220624) Up(ctx context.Context, db *gorm.DB) error {
+	err := db.Migrator().DropColumn(&JiraConnection20220624{}, "epic_key_field")
+	if err != nil {
+		return err
+	}
+	err = db.Migrator().DropColumn(&JiraConnection20220624{}, "story_point_field")
+	if err != nil {
+		return err
+	}
+	return db.Migrator().DropColumn(&JiraConnection20220624{}, "remotelink_commit_sha_pattern")
+}
+
+func (*UpdateSchemas20220624) Version() uint64 {
+	return 20220624102636
+}
+
+func (*UpdateSchemas20220624) Name() string {
+	return "remove epic_key_field, story_point_field, remotelink_commit_sha_pattern"
+}
diff --git a/plugins/jira/tasks/board_collector.go b/plugins/jira/tasks/board_collector.go
index 2642a43f..f5b438bb 100644
--- a/plugins/jira/tasks/board_collector.go
+++ b/plugins/jira/tasks/board_collector.go
@@ -35,6 +35,7 @@ var CollectBoardMeta = core.SubTaskMeta{
 	EntryPoint:       CollectBoard,
 	EnabledByDefault: true,
 	Description:      "collect Jira board",
+	DomainTypes:      []string{core.DOMAIN_TYPE_TICKET},
 }
 
 func CollectBoard(taskCtx core.SubTaskContext) error {
diff --git a/plugins/jira/tasks/board_convertor.go b/plugins/jira/tasks/board_convertor.go
index 1fccfd09..4ef0a978 100644
--- a/plugins/jira/tasks/board_convertor.go
+++ b/plugins/jira/tasks/board_convertor.go
@@ -18,13 +18,13 @@ limitations under the License.
 package tasks
 
 import (
-	"github.com/apache/incubator-devlake/plugins/core/dal"
 	"reflect"
 
 	"github.com/apache/incubator-devlake/models/domainlayer"
 	"github.com/apache/incubator-devlake/models/domainlayer/didgen"
 	"github.com/apache/incubator-devlake/models/domainlayer/ticket"
 	"github.com/apache/incubator-devlake/plugins/core"
+	"github.com/apache/incubator-devlake/plugins/core/dal"
 	"github.com/apache/incubator-devlake/plugins/helper"
 	"github.com/apache/incubator-devlake/plugins/jira/models"
 )
@@ -34,6 +34,7 @@ var ConvertBoardMeta = core.SubTaskMeta{
 	EntryPoint:       ConvertBoard,
 	EnabledByDefault: true,
 	Description:      "convert Jira board",
+	DomainTypes:      []string{core.DOMAIN_TYPE_TICKET},
 }
 
 func ConvertBoard(taskCtx core.SubTaskContext) error {
diff --git a/plugins/jira/tasks/board_extractor.go b/plugins/jira/tasks/board_extractor.go
index cf00fec2..e0b370df 100644
--- a/plugins/jira/tasks/board_extractor.go
+++ b/plugins/jira/tasks/board_extractor.go
@@ -31,6 +31,7 @@ var ExtractBoardMeta = core.SubTaskMeta{Name: "extractBoard",
 	EntryPoint:       ExtractBoard,
 	EnabledByDefault: true,
 	Description:      "extract Jira board",
+	DomainTypes:      []string{core.DOMAIN_TYPE_TICKET},
 }
 
 func ExtractBoard(taskCtx core.SubTaskContext) error {
diff --git a/plugins/jira/tasks/changelog_collector.go b/plugins/jira/tasks/changelog_collector.go
index 09a9175a..bcfb38db 100644
--- a/plugins/jira/tasks/changelog_collector.go
+++ b/plugins/jira/tasks/changelog_collector.go
@@ -40,6 +40,7 @@ var CollectChangelogsMeta = core.SubTaskMeta{
 	EntryPoint:       CollectChangelogs,
 	EnabledByDefault: true,
 	Description:      "collect Jira change logs",
+	DomainTypes:      []string{core.DOMAIN_TYPE_TICKET},
 }
 
 func CollectChangelogs(taskCtx core.SubTaskContext) error {
diff --git a/plugins/jira/tasks/changelog_convertor.go b/plugins/jira/tasks/changelog_convertor.go
index 4b6fae3b..bbcbf8bb 100644
--- a/plugins/jira/tasks/changelog_convertor.go
+++ b/plugins/jira/tasks/changelog_convertor.go
@@ -37,6 +37,7 @@ var ConvertChangelogsMeta = core.SubTaskMeta{
 	EntryPoint:       ConvertChangelogs,
 	EnabledByDefault: true,
 	Description:      "convert Jira change logs",
+	DomainTypes:      []string{core.DOMAIN_TYPE_TICKET},
 }
 
 type ChangelogItemResult struct {
diff --git a/plugins/jira/tasks/changelog_extractor.go b/plugins/jira/tasks/changelog_extractor.go
index f15c9be3..cadd2815 100644
--- a/plugins/jira/tasks/changelog_extractor.go
+++ b/plugins/jira/tasks/changelog_extractor.go
@@ -33,6 +33,7 @@ var ExtractChangelogsMeta = core.SubTaskMeta{
 	EntryPoint:       ExtractChangelogs,
 	EnabledByDefault: true,
 	Description:      "extract Jira change logs",
+	DomainTypes:      []string{core.DOMAIN_TYPE_TICKET},
 }
 
 func ExtractChangelogs(taskCtx core.SubTaskContext) error {
diff --git a/plugins/jira/tasks/issue_collector.go b/plugins/jira/tasks/issue_collector.go
index 5b64d138..f252f940 100644
--- a/plugins/jira/tasks/issue_collector.go
+++ b/plugins/jira/tasks/issue_collector.go
@@ -46,6 +46,7 @@ var CollectIssuesMeta = core.SubTaskMeta{
 	EntryPoint:       CollectIssues,
 	EnabledByDefault: true,
 	Description:      "collect Jira issues",
+	DomainTypes:      []string{core.DOMAIN_TYPE_TICKET},
 }
 
 func CollectIssues(taskCtx core.SubTaskContext) error {
diff --git a/plugins/jira/tasks/issue_commit_convertor.go b/plugins/jira/tasks/issue_commit_convertor.go
index c228859b..a1174945 100644
--- a/plugins/jira/tasks/issue_commit_convertor.go
+++ b/plugins/jira/tasks/issue_commit_convertor.go
@@ -33,6 +33,7 @@ var ConvertIssueCommitsMeta = core.SubTaskMeta{
 	EntryPoint:       ConvertIssueCommits,
 	EnabledByDefault: true,
 	Description:      "convert Jira issue commits",
+	DomainTypes:      []string{core.DOMAIN_TYPE_TICKET},
 }
 
 func ConvertIssueCommits(taskCtx core.SubTaskContext) error {
diff --git a/plugins/jira/tasks/issue_convertor.go b/plugins/jira/tasks/issue_convertor.go
index 22a55dcf..0c2a4876 100644
--- a/plugins/jira/tasks/issue_convertor.go
+++ b/plugins/jira/tasks/issue_convertor.go
@@ -36,6 +36,7 @@ var ConvertIssuesMeta = core.SubTaskMeta{
 	EntryPoint:       ConvertIssues,
 	EnabledByDefault: true,
 	Description:      "convert Jira issues",
+	DomainTypes:      []string{core.DOMAIN_TYPE_TICKET},
 }
 
 func ConvertIssues(taskCtx core.SubTaskContext) error {
diff --git a/plugins/jira/tasks/issue_extractor.go b/plugins/jira/tasks/issue_extractor.go
index 870fb0a1..9def3d7d 100644
--- a/plugins/jira/tasks/issue_extractor.go
+++ b/plugins/jira/tasks/issue_extractor.go
@@ -36,6 +36,7 @@ var ExtractIssuesMeta = core.SubTaskMeta{
 	EntryPoint:       ExtractIssues,
 	EnabledByDefault: true,
 	Description:      "extract Jira issues",
+	DomainTypes:      []string{core.DOMAIN_TYPE_TICKET},
 }
 
 func ExtractIssues(taskCtx core.SubTaskContext) error {
diff --git a/plugins/jira/tasks/issue_repo_commit_convertor.go b/plugins/jira/tasks/issue_repo_commit_convertor.go
index 7de02746..c80d76ad 100644
--- a/plugins/jira/tasks/issue_repo_commit_convertor.go
+++ b/plugins/jira/tasks/issue_repo_commit_convertor.go
@@ -34,6 +34,7 @@ var ConvertIssueRepoCommitsMeta = core.SubTaskMeta{
 	EntryPoint:       ConvertIssueRepoCommits,
 	EnabledByDefault: false,
 	Description:      "convert Jira issue repo commits",
+	DomainTypes:      []string{core.DOMAIN_TYPE_CROSS},
 }
 
 // ConvertIssueRepoCommits is to extract issue_repo_commits from jira_issue_commits, nothing difference with
diff --git a/plugins/jira/tasks/project_collector.go b/plugins/jira/tasks/project_collector.go
index 811acf90..94f33ffb 100644
--- a/plugins/jira/tasks/project_collector.go
+++ b/plugins/jira/tasks/project_collector.go
@@ -35,6 +35,7 @@ var CollectProjectsMeta = core.SubTaskMeta{
 	EntryPoint:       CollectProjects,
 	EnabledByDefault: true,
 	Description:      "collect Jira projects",
+	DomainTypes:      []string{core.DOMAIN_TYPE_TICKET},
 }
 
 func CollectProjects(taskCtx core.SubTaskContext) error {
diff --git a/plugins/jira/tasks/project_extractor.go b/plugins/jira/tasks/project_extractor.go
index e37468ca..fc5a0461 100644
--- a/plugins/jira/tasks/project_extractor.go
+++ b/plugins/jira/tasks/project_extractor.go
@@ -32,6 +32,7 @@ var ExtractProjectsMeta = core.SubTaskMeta{
 	EntryPoint:       ExtractProjects,
 	EnabledByDefault: true,
 	Description:      "extract Jira projects",
+	DomainTypes:      []string{core.DOMAIN_TYPE_TICKET},
 }
 
 func ExtractProjects(taskCtx core.SubTaskContext) error {
diff --git a/plugins/jira/tasks/remotelink_collector.go b/plugins/jira/tasks/remotelink_collector.go
index 77a78f23..529a0949 100644
--- a/plugins/jira/tasks/remotelink_collector.go
+++ b/plugins/jira/tasks/remotelink_collector.go
@@ -37,6 +37,7 @@ var CollectRemotelinksMeta = core.SubTaskMeta{
 	EntryPoint:       CollectRemotelinks,
 	EnabledByDefault: true,
 	Description:      "collect Jira remote links",
+	DomainTypes:      []string{core.DOMAIN_TYPE_TICKET},
 }
 
 func CollectRemotelinks(taskCtx core.SubTaskContext) error {
diff --git a/plugins/jira/tasks/remotelink_extractor.go b/plugins/jira/tasks/remotelink_extractor.go
index 99ef2be5..d3027bd0 100644
--- a/plugins/jira/tasks/remotelink_extractor.go
+++ b/plugins/jira/tasks/remotelink_extractor.go
@@ -33,6 +33,7 @@ var ExtractRemotelinksMeta = core.SubTaskMeta{
 	EntryPoint:       ExtractRemotelinks,
 	EnabledByDefault: true,
 	Description:      "extract Jira remote links",
+	DomainTypes:      []string{core.DOMAIN_TYPE_TICKET},
 }
 
 func ExtractRemotelinks(taskCtx core.SubTaskContext) error {
diff --git a/plugins/jira/tasks/sprint_collector.go b/plugins/jira/tasks/sprint_collector.go
index 6f10fb8b..14b366b5 100644
--- a/plugins/jira/tasks/sprint_collector.go
+++ b/plugins/jira/tasks/sprint_collector.go
@@ -36,6 +36,7 @@ var CollectSprintsMeta = core.SubTaskMeta{
 	EntryPoint:       CollectSprints,
 	EnabledByDefault: true,
 	Description:      "collect Jira sprints",
+	DomainTypes:      []string{core.DOMAIN_TYPE_TICKET},
 }
 
 func CollectSprints(taskCtx core.SubTaskContext) error {
diff --git a/plugins/jira/tasks/sprint_convertor.go b/plugins/jira/tasks/sprint_convertor.go
index 54ddb3a9..13fc73e8 100644
--- a/plugins/jira/tasks/sprint_convertor.go
+++ b/plugins/jira/tasks/sprint_convertor.go
@@ -35,6 +35,7 @@ var ConvertSprintsMeta = core.SubTaskMeta{
 	EntryPoint:       ConvertSprints,
 	EnabledByDefault: true,
 	Description:      "convert Jira sprints",
+	DomainTypes:      []string{core.DOMAIN_TYPE_TICKET},
 }
 
 func ConvertSprints(taskCtx core.SubTaskContext) error {
diff --git a/plugins/jira/tasks/sprint_extractor.go b/plugins/jira/tasks/sprint_extractor.go
index bc9a588a..c994352c 100644
--- a/plugins/jira/tasks/sprint_extractor.go
+++ b/plugins/jira/tasks/sprint_extractor.go
@@ -33,6 +33,7 @@ var ExtractSprintsMeta = core.SubTaskMeta{
 	EntryPoint:       ExtractSprints,
 	EnabledByDefault: true,
 	Description:      "extract Jira sprints",
+	DomainTypes:      []string{core.DOMAIN_TYPE_TICKET},
 }
 
 func ExtractSprints(taskCtx core.SubTaskContext) error {
diff --git a/plugins/jira/tasks/sprint_issues_convertor.go b/plugins/jira/tasks/sprint_issues_convertor.go
index c5401bfd..182ce133 100644
--- a/plugins/jira/tasks/sprint_issues_convertor.go
+++ b/plugins/jira/tasks/sprint_issues_convertor.go
@@ -33,6 +33,7 @@ var ConvertSprintIssuesMeta = core.SubTaskMeta{
 	EntryPoint:       ConvertSprintIssues,
 	EnabledByDefault: true,
 	Description:      "convert Jira sprint_issues",
+	DomainTypes:      []string{core.DOMAIN_TYPE_TICKET},
 }
 
 func ConvertSprintIssues(taskCtx core.SubTaskContext) error {
diff --git a/plugins/jira/tasks/status_collector.go b/plugins/jira/tasks/status_collector.go
index da5bd952..300cca9d 100644
--- a/plugins/jira/tasks/status_collector.go
+++ b/plugins/jira/tasks/status_collector.go
@@ -32,6 +32,7 @@ var CollectStatusMeta = core.SubTaskMeta{
 	EntryPoint:       CollectStatus,
 	EnabledByDefault: true,
 	Description:      "collect Jira status",
+	DomainTypes:      []string{core.DOMAIN_TYPE_TICKET},
 }
 
 func CollectStatus(taskCtx core.SubTaskContext) error {
diff --git a/plugins/jira/tasks/status_extractor.go b/plugins/jira/tasks/status_extractor.go
index 73362814..56270a5b 100644
--- a/plugins/jira/tasks/status_extractor.go
+++ b/plugins/jira/tasks/status_extractor.go
@@ -31,6 +31,7 @@ var ExtractStatusMeta = core.SubTaskMeta{
 	EntryPoint:       ExtractStatus,
 	EnabledByDefault: true,
 	Description:      "extract Jira status",
+	DomainTypes:      []string{core.DOMAIN_TYPE_TICKET},
 }
 
 func ExtractStatus(taskCtx core.SubTaskContext) error {
diff --git a/plugins/jira/tasks/task_data.go b/plugins/jira/tasks/task_data.go
index 084fc1a6..2fc28699 100644
--- a/plugins/jira/tasks/task_data.go
+++ b/plugins/jira/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/jira/models"
+	"github.com/mitchellh/mapstructure"
 )
 
 type TransformationRules struct {
@@ -34,9 +36,8 @@ type TransformationRules struct {
 }
 
 type JiraOptions struct {
-	ConnectionId        uint64   `json:"connectionId"`
-	BoardId             uint64   `json:"boardId"`
-	Tasks               []string `json:"tasks,omitempty"`
+	ConnectionId        uint64 `json:"connectionId"`
+	BoardId             uint64 `json:"boardId"`
 	Since               string
 	TransformationRules TransformationRules `json:"transformationRules"`
 }
@@ -47,3 +48,18 @@ type JiraTaskData struct {
 	Since          *time.Time
 	JiraServerInfo models.JiraServerInfo
 }
+
+func DecodeAndValidateTaskOptions(options map[string]interface{}) (*JiraOptions, error) {
+	var op JiraOptions
+	err := mapstructure.Decode(options, &op)
+	if err != nil {
+		return nil, err
+	}
+	if op.ConnectionId == 0 {
+		return nil, fmt.Errorf("invalid connectionId:%d", op.ConnectionId)
+	}
+	if op.BoardId == 0 {
+		return nil, fmt.Errorf("invalid boardId:%d", op.BoardId)
+	}
+	return &op, nil
+}
diff --git a/plugins/jira/tasks/user_collector.go b/plugins/jira/tasks/user_collector.go
index 86bf3e60..fc5dfb65 100644
--- a/plugins/jira/tasks/user_collector.go
+++ b/plugins/jira/tasks/user_collector.go
@@ -36,6 +36,7 @@ var CollectUsersMeta = core.SubTaskMeta{
 	EntryPoint:       CollectUsers,
 	EnabledByDefault: true,
 	Description:      "collect Jira users",
+	DomainTypes:      []string{core.DOMAIN_TYPE_CROSS},
 }
 
 func CollectUsers(taskCtx core.SubTaskContext) error {
diff --git a/plugins/jira/tasks/user_convertor.go b/plugins/jira/tasks/user_convertor.go
index a163d20e..2d547466 100644
--- a/plugins/jira/tasks/user_convertor.go
+++ b/plugins/jira/tasks/user_convertor.go
@@ -33,6 +33,7 @@ var ConvertUsersMeta = core.SubTaskMeta{
 	EntryPoint:       ConvertUsers,
 	EnabledByDefault: true,
 	Description:      "convert Jira users",
+	DomainTypes:      []string{core.DOMAIN_TYPE_CROSS},
 }
 
 func ConvertUsers(taskCtx core.SubTaskContext) error {
diff --git a/plugins/jira/tasks/user_extractor.go b/plugins/jira/tasks/user_extractor.go
index d117e827..2d5c855f 100644
--- a/plugins/jira/tasks/user_extractor.go
+++ b/plugins/jira/tasks/user_extractor.go
@@ -32,6 +32,7 @@ var ExtractUsersMeta = core.SubTaskMeta{
 	EntryPoint:       ExtractUsers,
 	EnabledByDefault: true,
 	Description:      "extract Jira users",
+	DomainTypes:      []string{core.DOMAIN_TYPE_CROSS},
 }
 
 func ExtractUsers(taskCtx core.SubTaskContext) error {
diff --git a/plugins/jira/tasks/worklog_collector.go b/plugins/jira/tasks/worklog_collector.go
index cdb11eea..4d8b0e70 100644
--- a/plugins/jira/tasks/worklog_collector.go
+++ b/plugins/jira/tasks/worklog_collector.go
@@ -35,6 +35,7 @@ var CollectWorklogsMeta = core.SubTaskMeta{
 	EntryPoint:       CollectWorklogs,
 	EnabledByDefault: true,
 	Description:      "collect Jira work logs",
+	DomainTypes:      []string{core.DOMAIN_TYPE_TICKET},
 }
 
 func CollectWorklogs(taskCtx core.SubTaskContext) error {
diff --git a/plugins/jira/tasks/worklog_convertor.go b/plugins/jira/tasks/worklog_convertor.go
index 2f9385d4..ded11faa 100644
--- a/plugins/jira/tasks/worklog_convertor.go
+++ b/plugins/jira/tasks/worklog_convertor.go
@@ -34,6 +34,7 @@ var ConvertWorklogsMeta = core.SubTaskMeta{
 	EntryPoint:       ConvertWorklogs,
 	EnabledByDefault: true,
 	Description:      "convert Jira work logs",
+	DomainTypes:      []string{core.DOMAIN_TYPE_TICKET},
 }
 
 func ConvertWorklogs(taskCtx core.SubTaskContext) error {
diff --git a/plugins/jira/tasks/worklog_extractor.go b/plugins/jira/tasks/worklog_extractor.go
index 698c9c63..bd5e25e2 100644
--- a/plugins/jira/tasks/worklog_extractor.go
+++ b/plugins/jira/tasks/worklog_extractor.go
@@ -31,6 +31,7 @@ var ExtractWorklogsMeta = core.SubTaskMeta{
 	EntryPoint:       ExtractWorklogs,
 	EnabledByDefault: true,
 	Description:      "extract Jira work logs",
+	DomainTypes:      []string{core.DOMAIN_TYPE_TICKET},
 }
 
 func ExtractWorklogs(taskCtx core.SubTaskContext) error {