From cc158e3ec9d0dc29fcc0cd2a52efea9630c7dda1 Mon Sep 17 00:00:00 2001 From: YuTang Song <2313186065@qq.com> Date: Tue, 19 May 2026 16:27:19 +0800 Subject: [PATCH 1/2] feat (Workflow): add required validation and related field support for workflow remarks Signed-off-by: YuTang Song <2313186065@qq.com> --- .../core/common/repository/models/workflow_v4.go | 13 +++++++------ .../aslan/core/workflow/handler/workflow_task_v4.go | 9 +++++---- .../service/workflow/controller/workflow.go | 4 ++++ .../aslan/core/workflow/service/workflow/types.go | 1 + .../workflow/service/workflow/workflow_task_v4.go | 5 +++++ .../core/workflow/service/workflow/workflow_v4.go | 4 +++- 6 files changed, 25 insertions(+), 11 deletions(-) diff --git a/pkg/microservice/aslan/core/common/repository/models/workflow_v4.go b/pkg/microservice/aslan/core/common/repository/models/workflow_v4.go index dd7457eed5..1e55fb9d9c 100644 --- a/pkg/microservice/aslan/core/common/repository/models/workflow_v4.go +++ b/pkg/microservice/aslan/core/common/repository/models/workflow_v4.go @@ -60,6 +60,7 @@ type WorkflowV4 struct { HookPayload *HookPayload `bson:"hook_payload" yaml:"-" json:"hook_payload,omitempty"` BaseName string `bson:"base_name" yaml:"-" json:"base_name"` Remark string `bson:"remark" yaml:"-" json:"remark"` + RemarkRequired bool `bson:"remark_required" yaml:"remark_required" json:"remark_required"` IgnoreCache bool `bson:"ignore_cache,omitempty" yaml:"ignore_cache,omitempty" json:"ignore_cache,omitempty"` ShareStorages []*ShareStorage `bson:"share_storages" yaml:"share_storages" json:"share_storages"` Hash string `bson:"hash" yaml:"hash" json:"hash"` @@ -548,13 +549,13 @@ type DeployHelmChart struct { } type DeployBasicInfo struct { - ServiceName string `bson:"service_name" yaml:"service_name" json:"service_name"` + ServiceName string `bson:"service_name" yaml:"service_name" json:"service_name"` DeployStrategy setting.ServiceDeployStrategy `bson:"deploy_strategy" yaml:"deploy_strategy" json:"deploy_strategy"` - Modules []*DeployModuleInfo `bson:"modules" yaml:"modules" json:"modules"` - Deployed bool `bson:"deployed" yaml:"deployed" json:"deployed"` - AutoSync bool `bson:"-" yaml:"auto_sync" json:"auto_sync"` - UpdateConfig bool `bson:"update_config" yaml:"update_config" json:"update_config"` - Updatable bool `bson:"-" yaml:"updatable" json:"updatable"` + Modules []*DeployModuleInfo `bson:"modules" yaml:"modules" json:"modules"` + Deployed bool `bson:"deployed" yaml:"deployed" json:"deployed"` + AutoSync bool `bson:"-" yaml:"auto_sync" json:"auto_sync"` + UpdateConfig bool `bson:"update_config" yaml:"update_config" json:"update_config"` + Updatable bool `bson:"-" yaml:"updatable" json:"updatable"` } type DeployOptionInfo struct { diff --git a/pkg/microservice/aslan/core/workflow/handler/workflow_task_v4.go b/pkg/microservice/aslan/core/workflow/handler/workflow_task_v4.go index e0146cbb6e..b5a7294464 100644 --- a/pkg/microservice/aslan/core/workflow/handler/workflow_task_v4.go +++ b/pkg/microservice/aslan/core/workflow/handler/workflow_task_v4.go @@ -97,10 +97,11 @@ func CreateWorkflowTaskV4(c *gin.Context) { } ctx.Resp, ctx.RespErr = workflow.CreateWorkflowTaskV4(&workflow.CreateWorkflowTaskV4Args{ - Name: ctx.UserName, - Account: ctx.Account, - UserID: ctx.UserID, - ApprovalTicketID: ticketID, + Name: ctx.UserName, + Account: ctx.Account, + UserID: ctx.UserID, + ApprovalTicketID: ticketID, + ValidateRemarkRequired: true, }, args, ctx.Logger) } diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/controller/workflow.go b/pkg/microservice/aslan/core/workflow/service/workflow/controller/workflow.go index 966aaa461b..3d7b945f56 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/controller/workflow.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/controller/workflow.go @@ -442,6 +442,10 @@ func (w *Workflow) Validate(isExecution bool) error { if err != nil { return e.ErrFindWorkflow.AddDesc(fmt.Sprintf("cannot find workflow [%s]'s latest setting, error: %s", w.Name, err)) } + w.RemarkRequired = latestWorkflowSettings.RemarkRequired + if latestWorkflowSettings.RemarkRequired && strings.TrimSpace(w.Remark) == "" { + return e.ErrLintWorkflow.AddDesc("工作流备注不能为空") + } } for _, stage := range w.Stages { diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/types.go b/pkg/microservice/aslan/core/workflow/service/workflow/types.go index ddc0b45bea..41ebaeb377 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/types.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/types.go @@ -56,6 +56,7 @@ type Workflow struct { BaseName string `json:"base_name"` BaseRefs []string `json:"base_refs"` NeverRun bool `json:"never_run"` + RemarkRequired bool `json:"remark_required"` EnableApprovalTicket bool `json:"enable_approval_ticket"` } diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/workflow_task_v4.go b/pkg/microservice/aslan/core/workflow/service/workflow/workflow_task_v4.go index f891568b20..0f81737518 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/workflow_task_v4.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/workflow_task_v4.go @@ -451,6 +451,7 @@ type CreateWorkflowTaskV4Args struct { Account string UserID string Type config.CustomWorkflowTaskType + ValidateRemarkRequired bool ApprovalTicketID string SkipWorkflowUpdate bool NotifyInput []*CreateCustomTaskNotifyInput @@ -511,9 +512,13 @@ func CreateWorkflowTaskV4(args *CreateWorkflowTaskV4Args, workflow *commonmodels if err != nil { return resp, e.ErrCreateTask.AddErr(fmt.Errorf("cannot find workflow %s, error: %v", workflow.Name, err)) } + workflow.RemarkRequired = originalWorkflow.RemarkRequired if originalWorkflow.Disabled { return resp, e.ErrCreateTask.AddDesc("workflow is disabled") } + if args.ValidateRemarkRequired && originalWorkflow.RemarkRequired && strings.TrimSpace(workflow.Remark) == "" { + return resp, e.ErrCreateTask.AddDesc("工作流备注不能为空") + } // do approval ticket check if originalWorkflow.EnableApprovalTicket { diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/workflow_v4.go b/pkg/microservice/aslan/core/workflow/service/workflow/workflow_v4.go index 4a3e14b654..faff2421f8 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/workflow_v4.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/workflow_v4.go @@ -58,12 +58,12 @@ import ( commonservice "github.com/koderover/zadig/v2/pkg/microservice/aslan/core/common/service" "github.com/koderover/zadig/v2/pkg/microservice/aslan/core/common/service/collaboration" helmservice "github.com/koderover/zadig/v2/pkg/microservice/aslan/core/common/service/helm" - runtimeWorkflowController "github.com/koderover/zadig/v2/pkg/microservice/aslan/core/common/service/workflowcontroller" "github.com/koderover/zadig/v2/pkg/microservice/aslan/core/common/service/kube" larkservice "github.com/koderover/zadig/v2/pkg/microservice/aslan/core/common/service/lark" "github.com/koderover/zadig/v2/pkg/microservice/aslan/core/common/service/s3" commomtemplate "github.com/koderover/zadig/v2/pkg/microservice/aslan/core/common/service/template" "github.com/koderover/zadig/v2/pkg/microservice/aslan/core/common/service/webhook" + runtimeWorkflowController "github.com/koderover/zadig/v2/pkg/microservice/aslan/core/common/service/workflowcontroller" "github.com/koderover/zadig/v2/pkg/microservice/aslan/core/common/util" commonutil "github.com/koderover/zadig/v2/pkg/microservice/aslan/core/common/util" "github.com/koderover/zadig/v2/pkg/microservice/aslan/core/workflow/service/workflow/controller" @@ -428,6 +428,7 @@ func ListWorkflowV4(projectName, viewName, userID string, names, v4Names []strin Description: workflowModel.Description, BaseRefs: baseRefs, BaseName: workflowModel.BaseName, + RemarkRequired: workflowModel.RemarkRequired, EnableApprovalTicket: workflowModel.EnableApprovalTicket, } if workflowModel.Category == setting.ReleaseWorkflow { @@ -582,6 +583,7 @@ func ListWorkflowV4InGlobal(ctx *internalhandler.Context, query *ListGlobalWorkf WorkflowType: setting.CustomWorkflowType, Description: workflowModel.Description, BaseName: workflowModel.BaseName, + RemarkRequired: workflowModel.RemarkRequired, EnableApprovalTicket: workflowModel.EnableApprovalTicket, } From 6a967abc6b824d5a474dc81c1caabb837143d851 Mon Sep 17 00:00:00 2001 From: YuTang Song <2313186065@qq.com> Date: Tue, 19 May 2026 16:33:54 +0800 Subject: [PATCH 2/2] pref: change the error content from cn to en Signed-off-by: YuTang Song <2313186065@qq.com> --- .../service/workflow/controller/workflow.go | 2 +- .../service/workflow/workflow_task_v4.go | 28 +++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/controller/workflow.go b/pkg/microservice/aslan/core/workflow/service/workflow/controller/workflow.go index 3d7b945f56..2c0f9c7bd4 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/controller/workflow.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/controller/workflow.go @@ -444,7 +444,7 @@ func (w *Workflow) Validate(isExecution bool) error { } w.RemarkRequired = latestWorkflowSettings.RemarkRequired if latestWorkflowSettings.RemarkRequired && strings.TrimSpace(w.Remark) == "" { - return e.ErrLintWorkflow.AddDesc("工作流备注不能为空") + return e.ErrLintWorkflow.AddDesc("workflow remark is required.") } } diff --git a/pkg/microservice/aslan/core/workflow/service/workflow/workflow_task_v4.go b/pkg/microservice/aslan/core/workflow/service/workflow/workflow_task_v4.go index 0f81737518..3632382ba8 100644 --- a/pkg/microservice/aslan/core/workflow/service/workflow/workflow_task_v4.go +++ b/pkg/microservice/aslan/core/workflow/service/workflow/workflow_task_v4.go @@ -447,20 +447,20 @@ func CheckWorkflowV4ApprovalInitiator(workflowName, uid string, log *zap.Sugared } type CreateWorkflowTaskV4Args struct { - Name string - Account string - UserID string - Type config.CustomWorkflowTaskType + Name string + Account string + UserID string + Type config.CustomWorkflowTaskType ValidateRemarkRequired bool - ApprovalTicketID string - SkipWorkflowUpdate bool - NotifyInput []*CreateCustomTaskNotifyInput - LarkProjectKey string - LarkProjectSimpleName string - LarkWorkItemTypeKey string - LarkWorkItemAPIName string - LarkWorkItemID string - ReleasePlan *commonmodels.ReleasePlanRef + ApprovalTicketID string + SkipWorkflowUpdate bool + NotifyInput []*CreateCustomTaskNotifyInput + LarkProjectKey string + LarkProjectSimpleName string + LarkWorkItemTypeKey string + LarkWorkItemAPIName string + LarkWorkItemID string + ReleasePlan *commonmodels.ReleasePlanRef } func CreateWorkflowTaskV4ByBuildInTrigger(triggerName string, args *commonmodels.WorkflowV4, log *zap.SugaredLogger) (*CreateTaskV4Resp, error) { @@ -517,7 +517,7 @@ func CreateWorkflowTaskV4(args *CreateWorkflowTaskV4Args, workflow *commonmodels return resp, e.ErrCreateTask.AddDesc("workflow is disabled") } if args.ValidateRemarkRequired && originalWorkflow.RemarkRequired && strings.TrimSpace(workflow.Remark) == "" { - return resp, e.ErrCreateTask.AddDesc("工作流备注不能为空") + return resp, e.ErrCreateTask.AddDesc("workflow task creation denied: remark is required.") } // do approval ticket check