This is an automated email from the ASF dual-hosted git repository.
likyh 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 345b0cbe fix: fix webhook (#3217)
345b0cbe is described below
commit 345b0cbecfe44357290986dcd6e423da74cfb8a1
Author: mappjzc <[email protected]>
AuthorDate: Wed Sep 28 09:53:08 2022 +0800
fix: fix webhook (#3217)
changed issueId to be issueKey
finshed cicd_task in PostPipelineFinish
create domainBoard only if non-existent
Nddtfjiang <[email protected]>
---
plugins/webhook/api/cicd_pipeline.go | 47 ++++++++++++++++++++++++++++++++----
plugins/webhook/api/connection.go | 5 ++--
plugins/webhook/api/issue.go | 42 ++++++++++++++++++++++----------
plugins/webhook/impl/impl.go | 2 +-
4 files changed, 75 insertions(+), 21 deletions(-)
diff --git a/plugins/webhook/api/cicd_pipeline.go
b/plugins/webhook/api/cicd_pipeline.go
index 064ca983..aa383938 100644
--- a/plugins/webhook/api/cicd_pipeline.go
+++ b/plugins/webhook/api/cicd_pipeline.go
@@ -19,6 +19,10 @@ package api
import (
"fmt"
+ "net/http"
+ "reflect"
+ "time"
+
"github.com/apache/incubator-devlake/errors"
"github.com/apache/incubator-devlake/models/domainlayer"
"github.com/apache/incubator-devlake/models/domainlayer/devops"
@@ -28,8 +32,6 @@ import (
"github.com/apache/incubator-devlake/plugins/helper"
"github.com/apache/incubator-devlake/plugins/webhook/models"
"github.com/go-playground/validator/v10"
- "net/http"
- "time"
)
type WebhookTaskRequest struct {
@@ -161,14 +163,50 @@ func PostPipelineFinish(input *core.ApiResourceInput)
(*core.ApiResourceOutput,
db := basicRes.GetDal()
pipelineId := fmt.Sprintf("%s:%d:%s", "webhook", connection.ID,
input.Params[`pipelineName`])
- println(pipelineId)
+
+ now := time.Now()
+
+ // finished all CICDTask
+ cursor, err := db.Cursor(
+ dal.From(&devops.CICDTask{}),
+ dal.Where("pipeline_id = ?", pipelineId),
+ )
+ if err != nil {
+ return nil, errors.Default.Wrap(err, "error on select CICDTask")
+ }
+ batch, err := helper.NewBatchSave(basicRes,
reflect.TypeOf(&devops.CICDTask{}), 500)
+ if err != nil {
+ return nil, errors.Default.Wrap(err, "error getting batch from
CICDTask")
+ }
+ defer batch.Close()
+
+ domainTasks := []devops.CICDTask{}
+ for cursor.Next() {
+ task := &devops.CICDTask{}
+ err = errors.Convert(cursor.Scan(task))
+ if err != nil {
+ return nil, errors.Default.Wrap(err, "error on Convert
CICDTask data")
+ }
+ // set the IN_PROGRESS task to be ABORT
+ if task.Result == `IN_PROGRESS` {
+ task.Result = `ABORT`
+ task.FinishedDate = &now
+ }
+ task.Status = ticket.DONE
+ domainTasks = append(domainTasks, *task)
+ err = batch.Add(task)
+ if err != nil {
+ return nil, errors.Default.Wrap(err, fmt.Sprintf("error
on CICDTask batch add %v", task))
+ }
+ }
+
+ // finished CICDPipeline
domainPipeline := &devops.CICDPipeline{}
err = db.First(domainPipeline, dal.Where("id = ?", pipelineId))
if err != nil {
return nil, errors.NotFound.Wrap(err, `pipeline not found`)
}
- domainTasks := []devops.CICDTask{}
err = db.All(&domainTasks, dal.Where("pipeline_id = ?", pipelineId))
if err != nil {
return nil, errors.NotFound.Wrap(err, `tasks not found`)
@@ -177,7 +215,6 @@ func PostPipelineFinish(input *core.ApiResourceInput)
(*core.ApiResourceOutput,
domainPipeline.Type = pipelineType
domainPipeline.Result = result
domainPipeline.Status = ticket.DONE
- now := time.Now()
domainPipeline.FinishedDate = &now
domainPipeline.DurationSec =
uint64(domainPipeline.FinishedDate.Sub(domainPipeline.CreatedDate).Seconds())
diff --git a/plugins/webhook/api/connection.go
b/plugins/webhook/api/connection.go
index a7bdd7a0..652085ce 100644
--- a/plugins/webhook/api/connection.go
+++ b/plugins/webhook/api/connection.go
@@ -19,10 +19,11 @@ package api
import (
"fmt"
+ "net/http"
+
"github.com/apache/incubator-devlake/errors"
"github.com/apache/incubator-devlake/plugins/core"
"github.com/apache/incubator-devlake/plugins/webhook/models"
- "net/http"
)
// PostConnections
@@ -127,7 +128,7 @@ func GetConnection(input *core.ApiResourceInput)
(*core.ApiResourceOutput, error
func formatConnection(connection *models.WebhookConnection)
*WebhookConnectionResponse {
response := &WebhookConnectionResponse{WebhookConnection: *connection}
response.PostIssuesEndpoint = fmt.Sprintf(`/plugins/webhook/%d/issues`,
connection.ID)
- response.CloseIssuesEndpoint =
fmt.Sprintf(`/plugins/webhook/%d/issue/:boardKey/:issueId/close`, connection.ID)
+ response.CloseIssuesEndpoint =
fmt.Sprintf(`/plugins/webhook/%d/issue/:boardKey/:issueKey/close`,
connection.ID)
response.PostPipelineTaskEndpoint =
fmt.Sprintf(`/plugins/webhook/%d/cicd_tasks`, connection.ID)
response.ClosePipelineEndpoint =
fmt.Sprintf(`/plugins/webhook/%d/cicd_pipeline/:pipelineName/finish`,
connection.ID)
return response
diff --git a/plugins/webhook/api/issue.go b/plugins/webhook/api/issue.go
index 06a3fc4b..b93dae23 100644
--- a/plugins/webhook/api/issue.go
+++ b/plugins/webhook/api/issue.go
@@ -19,6 +19,9 @@ package api
import (
"fmt"
+ "net/http"
+ "time"
+
"github.com/apache/incubator-devlake/errors"
"github.com/apache/incubator-devlake/models/domainlayer"
"github.com/apache/incubator-devlake/models/domainlayer/ticket"
@@ -27,8 +30,6 @@ import (
"github.com/apache/incubator-devlake/plugins/helper"
"github.com/apache/incubator-devlake/plugins/webhook/models"
"github.com/go-playground/validator/v10"
- "net/http"
- "time"
)
type WebhookIssueRequest struct {
@@ -125,24 +126,39 @@ func PostIssue(input *core.ApiResourceInput)
(*core.ApiResourceOutput, errors.Er
if request.ParentIssueKey != "" {
domainIssue.ParentIssueId = fmt.Sprintf("%s:%d:%s:%s",
"webhook", connection.ID, request.BoardKey, request.ParentIssueKey)
}
- domainBoard := &ticket.Board{
- DomainEntity: domainlayer.DomainEntity{
- Id: fmt.Sprintf("%s:%d:%s", "webhook", connection.ID,
request.BoardKey),
- },
- }
+
+ domainBoardId := fmt.Sprintf("%s:%d:%s", "webhook", connection.ID,
request.BoardKey)
+
boardIssue := &ticket.BoardIssue{
- BoardId: domainBoard.Id,
+ BoardId: domainBoardId,
IssueId: domainIssue.Id,
}
- // save
- err = db.CreateOrUpdate(domainIssue)
+
+ // check if board exists
+ count, err := db.Count(dal.From(&ticket.Board{}), dal.Where("id = ?",
domainBoardId))
if err != nil {
return nil, err
}
- err = db.CreateOrUpdate(domainBoard)
+
+ // only create board with domainBoard non-existent
+ if count == 0 {
+ domainBoard := &ticket.Board{
+ DomainEntity: domainlayer.DomainEntity{
+ Id: domainBoardId,
+ },
+ }
+ err = db.Create(domainBoard)
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ // save
+ err = db.CreateOrUpdate(domainIssue)
if err != nil {
return nil, err
}
+
err = db.CreateOrUpdate(boardIssue)
if err != nil {
return nil, err
@@ -158,7 +174,7 @@ func PostIssue(input *core.ApiResourceInput)
(*core.ApiResourceOutput, errors.Er
// @Success 200 {string} noResponse ""
// @Failure 400 {string} errcode.Error "Bad Request"
// @Failure 500 {string} errcode.Error "Internal Error"
-// @Router /plugins/webhook/:connectionId/issue/:boardKey/:issueId/close [POST]
+// @Router /plugins/webhook/:connectionId/issue/:boardKey/:issueKey/close
[POST]
func CloseIssue(input *core.ApiResourceInput) (*core.ApiResourceOutput,
errors.Error) {
connection := &models.WebhookConnection{}
err := connectionHelper.First(connection, input.Params)
@@ -168,7 +184,7 @@ func CloseIssue(input *core.ApiResourceInput)
(*core.ApiResourceOutput, errors.E
db := basicRes.GetDal()
domainIssue := &ticket.Issue{}
- err = db.First(domainIssue, dal.Where("id = ?",
fmt.Sprintf("%s:%d:%s:%s", "webhook", connection.ID, input.Params[`boardKey`],
input.Params[`issueId`])))
+ err = db.First(domainIssue, dal.Where("id = ?",
fmt.Sprintf("%s:%d:%s:%s", "webhook", connection.ID, input.Params[`boardKey`],
input.Params[`issueKey`])))
if err != nil {
return nil, errors.NotFound.Wrap(err, `issue not found`)
}
diff --git a/plugins/webhook/impl/impl.go b/plugins/webhook/impl/impl.go
index b8001434..a939f560 100644
--- a/plugins/webhook/impl/impl.go
+++ b/plugins/webhook/impl/impl.go
@@ -72,7 +72,7 @@ func (plugin Webhook) ApiResources()
map[string]map[string]core.ApiResourceHandl
":connectionId/issues": {
"POST": api.PostIssue,
},
- ":connectionId/issue/:boardKey/:issueId/close": {
+ ":connectionId/issue/:boardKey/:issueKey/close": {
"POST": api.CloseIssue,
},
}