diff --git a/backend/internal/workflow/executor.go b/backend/internal/workflow/executor.go index 00ada84..f04b896 100644 --- a/backend/internal/workflow/executor.go +++ b/backend/internal/workflow/executor.go @@ -55,13 +55,84 @@ func deploy(params map[string]any) (any, error) { logger.Info("=============部署失败=============") return nil, errors.New("证书不存在") } - err := certDeploy.Deploy(params, logger) + certStr, ok := certificate.(string) + if !ok { + logger.Error("证书格式错误") + logger.Info("=============部署失败=============") + return nil, errors.New("证书格式错误") + } + nowSha256, err := public.GetSHA256(certStr) if err != nil { + logger.Error("解析证书sha256失败:" + err.Error()) + logger.Info("=============部署失败=============") + return nil, err + } + + s, err := public.NewSqlite("data/data.db", "") + if err != nil { + logger.Error("新建数据库连接失败" + err.Error()) + logger.Info("=============部署失败=============") + return nil, err + } + defer s.Close() + s.TableName = "workflow_history" + historyData, err := s.Where("id=?", []any{params["_runId"]}).Find() + if err != nil { + logger.Error("查询表workflow_history失败" + err.Error()) + logger.Info("=============部署失败=============") + return nil, err + } + workflowId := historyData["workflow_id"] + s.TableName = "workflow_deploy" + deployData, err := s.Where("workflow_id=? and id=?", []any{workflowId, params["NodeId"]}).Select() + if err != nil { + logger.Error("查询表workflow_deploy失败" + err.Error()) + logger.Info("=============部署失败=============") + return nil, err + } + + if params["skip"] != nil { + var skip int + switch v := params["skip"].(type) { + case int: + skip = v + case float64: + skip = int(v) + case string: + skip, _ = strconv.Atoi(v) + } + if skip == 1 { + if len(deployData) > 0 { + beSha256, ok := deployData[0]["cert_hash"].(string) + if !ok { + logger.Error("证书hash格式错误") + logger.Info("=============部署失败=============") + return nil, errors.New("证书hash格式错误") + } + if beSha256 == nowSha256 && deployData[0]["status"].(string) == "success" { + logger.Info("与上次部署的证书sha256相同且上次部署成功,跳过重复部署") + logger.Info("=============部署成功=============") + return nil, nil + } + } + } + } + + err = certDeploy.Deploy(params, logger) + var status string + if err != nil { + status = "fail" logger.Error(err.Error()) logger.Info("=============部署失败=============") } else { + status = "success" logger.Info("=============部署成功=============") } + if len(deployData) > 0 { + s.Where("workflow_id=? and id=?", []any{workflowId, params["NodeId"]}).Update(map[string]interface{}{"cert_hash": nowSha256, "status": status}) + } else { + s.Insert(map[string]interface{}{"cert_hash": nowSha256, "workflow_id": workflowId, "id": params["NodeId"], "status": status}) + } return nil, err } diff --git a/backend/internal/workflow/workflow.go b/backend/internal/workflow/workflow.go index 8d63876..bbc051b 100644 --- a/backend/internal/workflow/workflow.go +++ b/backend/internal/workflow/workflow.go @@ -218,6 +218,7 @@ func RunNode(node *WorkflowNode, ctx *ExecutionContext) error { } node.Config["_runId"] = ctx.RunID node.Config["logger"] = ctx.Logger + node.Config["NodeId"] = node.Id // 执行当前节点 result, err := Executors(node.Type, node.Config) diff --git a/backend/migrations/init.go b/backend/migrations/init.go index 9974eb5..78f2adb 100644 --- a/backend/migrations/init.go +++ b/backend/migrations/init.go @@ -185,14 +185,14 @@ func init() { workflow_id TEXT not null ); - create table IF NOT EXISTS workflow_deploy + create table workflow_deploy ( - id TEXT - constraint workflow_deploy_pk - primary key, + id TEXT, workflow_id TEXT, cert_hash TEXT, - status TEXT + status TEXT, + constraint workflow_deploy_pk + primary key (id, workflow_id) ); `)