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 ad800f89 feat: jira support define standard status (#2881)
ad800f89 is described below
commit ad800f89ebd5aad0345b889d5504d8a8f3b31f1c
Author: mappjzc <[email protected]>
AuthorDate: Wed Aug 31 21:23:11 2022 +0800
feat: jira support define standard status (#2881)
* feat: jira support define standard status
Add support define StandardStatus.
Nddtfjiang <[email protected]>
* fix: debug fix
Add debug test code and remove it.
Fix some problem.
Nddtfjiang <[email protected]>
* style: review fix
Remove pointer of StatusMappings by review.
Nddtfjiang <[email protected]>
---
plugins/jira/api/swagger.go | 15 ++++-----------
plugins/jira/tasks/issue_extractor.go | 15 +++++++++++----
plugins/jira/tasks/task_data.go | 7 ++++++-
runner/run_task.go | 3 ++-
services/blueprint.go | 11 +++++++++--
5 files changed, 32 insertions(+), 19 deletions(-)
diff --git a/plugins/jira/api/swagger.go b/plugins/jira/api/swagger.go
index b27c7463..d9122162 100644
--- a/plugins/jira/api/swagger.go
+++ b/plugins/jira/api/swagger.go
@@ -17,6 +17,8 @@ limitations under the License.
package api
+import "github.com/apache/incubator-devlake/plugins/jira/tasks"
+
// @Summary blueprints setting for jira
// @Description blueprint setting for jira
// @Tags plugins/jira
@@ -31,7 +33,7 @@ type JiraBlueprintSetting []struct {
Plugin string `json:"plugin"`
ConnectionID int `json:"connectionId"`
Scope []struct {
- Transformation TicketTransformationRules
`json:"transformation"`
+ Transformation tasks.TransformationRules
`json:"transformation"`
Options struct {
BoardId uint64 `json:"boardId"`
Since string `json:"since"`
@@ -41,15 +43,6 @@ type JiraBlueprintSetting []struct {
} `json:"connections"`
}
-type TicketTransformationRules struct {
- EpicKeyField string `json:"epicKeyField"`
- StoryPointField string `json:"storyPointField"`
- RemotelinkCommitShaPattern string `json:"remotelinkCommitShaPattern"`
- TypeMappings map[string]struct {
- StandardType string `json:"standardType"`
- } `json:"typeMappings"`
-}
-
// @Summary pipelines plan for jira
// @Description pipelines plan for jira
// @Tags plugins/jira
@@ -64,6 +57,6 @@ type JiraPipelinePlan [][]struct {
Options struct {
BoardID int `json:"boardId"`
ConnectionID int
`json:"connectionId"`
- TransformationRules TicketTransformationRules
`json:"transformationRules"`
+ TransformationRules tasks.TransformationRules
`json:"transformationRules"`
} `json:"options"`
}
diff --git a/plugins/jira/tasks/issue_extractor.go
b/plugins/jira/tasks/issue_extractor.go
index a5dc4da6..bb731d05 100644
--- a/plugins/jira/tasks/issue_extractor.go
+++ b/plugins/jira/tasks/issue_extractor.go
@@ -42,8 +42,9 @@ var ExtractIssuesMeta = core.SubTaskMeta{
}
type typeMappings struct {
- typeIdMappings map[string]string
- stdTypeMappings map[string]string
+ typeIdMappings map[string]string
+ stdTypeMappings map[string]string
+ standardStatusMappings map[string]StatusMappings
}
func ExtractIssues(taskCtx core.SubTaskContext) error {
@@ -129,6 +130,9 @@ func extractIssues(data *JiraTaskData, mappings
*typeMappings, ignoreBoard bool,
issue.StdType = strings.ToUpper(issue.Type)
}
issue.StdStatus = getStdStatus(issue.StatusKey)
+ if value, ok :=
mappings.standardStatusMappings[issue.Type][issue.StatusKey]; ok {
+ issue.StdStatus = value.StandardStatus
+ }
results = append(results, issue)
for _, worklog := range worklogs {
results = append(results, worklog)
@@ -184,11 +188,14 @@ func getTypeMappings(data *JiraTaskData, db dal.Dal)
(*typeMappings, error) {
typeIdMapping[issueType.Id] = issueType.UntranslatedName
}
stdTypeMappings := make(map[string]string)
+ standardStatusMappings := make(map[string]StatusMappings)
for userType, stdType := range
data.Options.TransformationRules.TypeMappings {
stdTypeMappings[userType] =
strings.ToUpper(stdType.StandardType)
+ standardStatusMappings[userType] = stdType.StatusMappings
}
return &typeMappings{
- typeIdMappings: typeIdMapping,
- stdTypeMappings: stdTypeMappings,
+ typeIdMappings: typeIdMapping,
+ stdTypeMappings: stdTypeMappings,
+ standardStatusMappings: standardStatusMappings,
}, nil
}
diff --git a/plugins/jira/tasks/task_data.go b/plugins/jira/tasks/task_data.go
index 4d765e99..039e4080 100644
--- a/plugins/jira/tasks/task_data.go
+++ b/plugins/jira/tasks/task_data.go
@@ -26,12 +26,17 @@ import (
"github.com/mitchellh/mapstructure"
)
+type StatusMappings map[string]struct {
+ StandardStatus string `json:"standardStatus"`
+}
+
type TransformationRules struct {
EpicKeyField string `json:"epicKeyField"`
StoryPointField string `json:"storyPointField"`
RemotelinkCommitShaPattern string `json:"remotelinkCommitShaPattern"`
TypeMappings map[string]struct {
- StandardType string `json:"standardType"`
+ StandardType string `json:"standardType"`
+ StatusMappings StatusMappings `json:"statusMappings"`
} `json:"typeMappings"`
}
diff --git a/runner/run_task.go b/runner/run_task.go
index 1f5c2828..b1a21abb 100644
--- a/runner/run_task.go
+++ b/runner/run_task.go
@@ -21,9 +21,10 @@ import (
"context"
"encoding/json"
"fmt"
- "github.com/apache/incubator-devlake/logger"
"time"
+ "github.com/apache/incubator-devlake/logger"
+
"github.com/apache/incubator-devlake/config"
"github.com/apache/incubator-devlake/errors"
"github.com/apache/incubator-devlake/models"
diff --git a/services/blueprint.go b/services/blueprint.go
index 1c2544c7..bb72c942 100644
--- a/services/blueprint.go
+++ b/services/blueprint.go
@@ -107,6 +107,7 @@ func validateBlueprint(blueprint *models.Blueprint) error {
if strings.ToLower(blueprint.CronConfig) == "manual" {
blueprint.IsManual = true
}
+
if !blueprint.IsManual {
_, err = cron.ParseStandard(blueprint.CronConfig)
if err != nil {
@@ -116,6 +117,7 @@ func validateBlueprint(blueprint *models.Blueprint) error {
if blueprint.Mode == models.BLUEPRINT_MODE_ADVANCED {
plan := make(core.PipelinePlan, 0)
err = json.Unmarshal(blueprint.Plan, &plan)
+
if err != nil {
return fmt.Errorf("invalid plan: %w", err)
}
@@ -129,6 +131,7 @@ func validateBlueprint(blueprint *models.Blueprint) error {
return fmt.Errorf("invalid plan: %w", err)
}
}
+
return nil
}
@@ -141,6 +144,7 @@ func PatchBlueprint(id uint64, body map[string]interface{})
(*models.Blueprint,
}
originMode := blueprint.Mode
err = helper.DecodeMapStruct(body, blueprint)
+
if err != nil {
return nil, err
}
@@ -153,11 +157,13 @@ func PatchBlueprint(id uint64, body
map[string]interface{}) (*models.Blueprint,
if err != nil {
return nil, err
}
+
// save
err = db.Save(blueprint).Error
if err != nil {
return nil, errors.InternalError
}
+
// reload schedule
err = ReloadBlueprints(cronManager)
if err != nil {
@@ -238,9 +244,9 @@ func createPipelineByBlueprint(blueprintId uint64, name
string, plan core.Pipeli
func GeneratePlanJson(settings json.RawMessage) (json.RawMessage, error) {
bpSettings := new(models.BlueprintSettings)
err := json.Unmarshal(settings, bpSettings)
+
if err != nil {
- fmt.Println(string(settings))
- return nil, err
+ return nil, fmt.Errorf("settings:%s:%s", string(settings),
err.Error())
}
var plan interface{}
switch bpSettings.Version {
@@ -262,6 +268,7 @@ func GeneratePlanJsonV100(settings
*models.BlueprintSettings) (core.PipelinePlan
if err != nil {
return nil, err
}
+
plans := make([]core.PipelinePlan, len(connections))
for i, connection := range connections {
if len(connection.Scope) == 0 {