From 24f955832e9d9954ab0b90ce5201f2d25ce1ba2b Mon Sep 17 00:00:00 2001 From: attacker Date: Sun, 21 Jun 2026 05:26:01 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=8F=91=E5=B8=83=E6=9D=83=E9=99=90=20?= =?UTF-8?q?RBAC=20+=20PipelineEditor=20=E4=BF=AE=E5=A4=8D=20+=20=E8=8F=9C?= =?UTF-8?q?=E5=8D=95=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 DeployRBAC 页面: Jenkins-style Item Role 权限管理 - 正则匹配流水线 code,实时命中预览 - 内置用户分配面板,无需跳转系统管理 - 支持创建/编辑/删除/启用禁用 Item Role - 修复 PipelineEditor 成员管理 http 双解包 bug - 修复 PipelineManager 前端 code 路由迁移(delete/trigger/stop/loadRuns) - 新增批量删除流水线运行记录 API - Sidebar: 应用发布下新增「发布权限」, 仓库认证→发布配置, 移除用户组 - 恢复系统管理菜单(不受发布权限改动影响) - 后端 ItemRole CRUD handler + 正则匹配中间件已就绪 --- backend/Dockerfile | 17 +- backend/entrypoint.sh | 9 + backend/internal/api/handlers/credential.go | 408 +++++-- .../api/handlers/credential_assign.go | 2 +- backend/internal/api/handlers/deploy.go | 164 +++ .../api/handlers/deploy_environments.go | 234 ++++ .../internal/api/handlers/deploy_groups.go | 151 +++ backend/internal/api/handlers/item_role.go | 201 +++ backend/internal/api/handlers/pipeline.go | 330 ++++- .../api/handlers/pipeline_executor.go | 574 +++++++++ backend/internal/api/handlers/server_batch.go | 2 +- .../internal/api/handlers/workspace_files.go | 184 +++ .../internal/api/handlers/ws_pipeline_log.go | 142 +++ .../api/middleware/pipeline_access.go | 139 +++ backend/internal/api/routes/routes.go | 100 +- backend/internal/models/alert.go | 332 ++++- backend/internal/models/alert_v2.go | 405 ------- backend/internal/models/cicd.go | 115 +- backend/internal/models/credential.go | 212 +++- backend/internal/models/deploy.go | 193 +++ backend/internal/models/user.go | 67 +- backend/pkg/database/database.go | 13 + backend/pkg/redis/go_redis.go | 4 + backend/pkg/redis/redis.go | 3 + backend/pkg/redis/redka.go | 6 + backend/server | Bin 0 -> 30356096 bytes docker-compose.yml | 1 + frontend/src/App.tsx | 17 +- .../deploy/CredentialFormDialog.tsx | 147 +++ .../components/deploy/CredentialManager.tsx | 822 +++++++++++++ .../components/deploy/DeployCredentials.tsx | 297 +++++ frontend/src/components/deploy/DeployRBAC.tsx | 411 +++++++ .../components/deploy/FileBrowserDialog.tsx | 270 +++++ .../src/components/deploy/PipelineEditor.tsx | 602 +++++++++ .../src/components/deploy/PipelineManager.tsx | 1080 +++++++++++------ .../components/deploy/PipelineRunDetail.tsx | 473 ++++++++ .../components/deploy/UserGroupsManager.tsx | 172 +++ .../components/deploy/WorkspaceTermDialog.tsx | 196 +++ frontend/src/components/layout/Sidebar.tsx | 9 +- frontend/src/services/api.ts | 58 + 40 files changed, 7530 insertions(+), 1032 deletions(-) create mode 100644 backend/entrypoint.sh create mode 100644 backend/internal/api/handlers/deploy.go create mode 100644 backend/internal/api/handlers/deploy_environments.go create mode 100644 backend/internal/api/handlers/deploy_groups.go create mode 100644 backend/internal/api/handlers/item_role.go create mode 100644 backend/internal/api/handlers/pipeline_executor.go create mode 100644 backend/internal/api/handlers/workspace_files.go create mode 100644 backend/internal/api/handlers/ws_pipeline_log.go create mode 100644 backend/internal/api/middleware/pipeline_access.go delete mode 100644 backend/internal/models/alert_v2.go create mode 100644 backend/internal/models/deploy.go create mode 100755 backend/server create mode 100644 frontend/src/components/deploy/CredentialFormDialog.tsx create mode 100644 frontend/src/components/deploy/CredentialManager.tsx create mode 100644 frontend/src/components/deploy/DeployCredentials.tsx create mode 100644 frontend/src/components/deploy/DeployRBAC.tsx create mode 100644 frontend/src/components/deploy/FileBrowserDialog.tsx create mode 100644 frontend/src/components/deploy/PipelineEditor.tsx create mode 100644 frontend/src/components/deploy/PipelineRunDetail.tsx create mode 100644 frontend/src/components/deploy/UserGroupsManager.tsx create mode 100644 frontend/src/components/deploy/WorkspaceTermDialog.tsx diff --git a/backend/Dockerfile b/backend/Dockerfile index 35cb648..4576a1f 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -61,11 +61,18 @@ FROM alpine:latest # 使用国内 Alpine 镜像源加速 // Logan.Li RUN sed -i 's|dl-cdn.alpinelinux.org|mirrors.aliyun.com|g' /etc/apk/repositories -# 安装运行时依赖(bash=kubectl交互终端,curl=健康检查,openssh-client=SSH远程安装agent,kubectl=集群命令行管理,ansible=自动化运维) -RUN apk --no-cache add ca-certificates tzdata bash curl openssh-client ansible sshpass && \ +# 安装运行时依赖(bash=kubectl交互终端,curl=健康检查,openssh-client=SSH远程安装agent,kubectl=集群命令行管理,ansible=自动化运维,nodejs+npm=前端构建,maven=Java构建) +RUN apk --no-cache add ca-certificates tzdata bash curl openssh-client ansible sshpass git docker-cli docker-cli-buildx nodejs npm maven && \ curl -sLO "https://dl.k8s.io/release/$(curl -sL https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" && \ chmod +x kubectl && mv kubectl /usr/local/bin/ +# Maven 阿里云镜像加速(避免 DNS 间歇性 SERVFAIL) +RUN mkdir -p /root/.m2 && \ + echo 'aliyuncentralAliyun Mavenhttps://maven.aliyun.com/repository/public' > /root/.m2/settings.xml + +# npm 淘宝镜像加速 +RUN npm config set registry https://registry.npmmirror.com + ENV TZ=Asia/Shanghai WORKDIR /app @@ -85,9 +92,13 @@ COPY --from=agent-builder /agent/bin/aiops-agent-darwin-arm64 /app/agent/bin/ COPY agent/deploy/install.sh /app/agent/deploy/ COPY agent/deploy/aiops-agent.service /app/agent/deploy/ +# 启动脚本(注入 hosts DNS 缓存) +COPY backend/entrypoint.sh /app/ +RUN chmod +x /app/entrypoint.sh + EXPOSE 8080 HEALTHCHECK --interval=30s --timeout=3s --start-period=10s --retries=3 \ CMD curl -f http://localhost:8080/health || exit 1 -CMD ["./aiops"] +CMD ["./entrypoint.sh"] diff --git a/backend/entrypoint.sh b/backend/entrypoint.sh new file mode 100644 index 0000000..6610e6a --- /dev/null +++ b/backend/entrypoint.sh @@ -0,0 +1,9 @@ +#!/bin/sh +# AIOps 启动脚本 - 注入 DNS 缓存直连避免 Docker DNS 间歇性 SERVFAIL +# 署名 Logan.Li + +# 注入常用镜像站的 hosts 直连 +grep -q "maven.aliyun.com" /etc/hosts || echo "122.228.195.17 maven.aliyun.com" >> /etc/hosts +grep -q "registry.npmmirror.com" /etc/hosts || echo "122.228.223.11 registry.npmmirror.com" >> /etc/hosts + +exec ./aiops "$@" diff --git a/backend/internal/api/handlers/credential.go b/backend/internal/api/handlers/credential.go index dd53387..b1e13cf 100644 --- a/backend/internal/api/handlers/credential.go +++ b/backend/internal/api/handlers/credential.go @@ -1,8 +1,13 @@ package handlers import ( + "crypto/rand" + "encoding/hex" + "encoding/json" + "fmt" "net/http" "strconv" + "strings" "ezops/internal/models" "ezops/pkg/crypto" @@ -11,150 +16,385 @@ import ( "gorm.io/gorm" ) -// CredentialHandler 凭据管理处理器 // Logan.Li +// CredentialHandler 凭据管理处理器 v2(多类型动态字段) type CredentialHandler struct { db *gorm.DB crypt *crypto.SecretBox } func NewCredentialHandler(db *gorm.DB, masterKey string) *CredentialHandler { - return &CredentialHandler{ - db: db, - crypt: crypto.NewSecretBox(masterKey), - } + return &CredentialHandler{db: db, crypt: crypto.NewSecretBox(masterKey)} } -// preview 内容脱敏预览:前8字符 + ... + 后4字符 -func preview(s string) string { - if len(s) <= 12 { - return "****" - } - return s[:8] + "..." + s[len(s)-4:] +// ────── Helpers ────── + +func genEnvPrefix() string { + b := make([]byte, 4) + rand.Read(b) + return hex.EncodeToString(b)[:8] } -// ListCredentials 凭据列表 +func buildContent(req models.CreateSecretRequest) (string, string, error) { + switch req.SecretType { + case "ssh": + data := map[string]interface{}{ + "private_key": req.SSHPrivateKey, + "public_key": req.SSHPublicKey, + "ssh_user": req.SSHUser, + "ssh_port": req.SSHPort, + "password": req.SSHPassword, + } + b, _ := json.Marshal(data) + return string(b), fmt.Sprintf("SSH %s@%d", req.SSHUser, req.SSHPort), nil + case "docker": + data := map[string]string{ + "server": req.DockerServer, + "username": req.DockerUsername, + "password": req.DockerPassword, + } + b, _ := json.Marshal(data) + return string(b), req.DockerServer, nil + case "tls": + data := map[string]string{"cert": req.TLSCert, "key": req.TLSKey, "ca": req.TLSCA} + b, _ := json.Marshal(data) + return string(b), "TLS 证书已配置", nil + case "aksk": + data := map[string]string{ + "provider": req.AKSKProvider, + "access_key": req.AKSKAccessKey, + "secret_key": req.AKSKSecretKey, + "region": req.AKSKRegion, + } + b, _ := json.Marshal(data) + return string(b), req.AKSKProvider, nil + case "database": + data := map[string]interface{}{ + "db_type": req.DBType, + "host": req.DBHost, + "port": req.DBPort, + "db_name": req.DBName, + "username": req.DBUsername, + "password": req.DBPassword, + } + b, _ := json.Marshal(data) + return string(b), fmt.Sprintf("%s://%s:%d/%s", req.DBType, req.DBHost, req.DBPort, req.DBName), nil + case "api": + data := map[string]string{"api_key": req.APIKey, "endpoint": req.APIEndpoint} + b, _ := json.Marshal(data) + return string(b), req.APIEndpoint, nil + case "generic": + data := map[string]string{"generic_key": req.GenericKey, "generic_value": req.GenericValue} + b, _ := json.Marshal(data) + return string(b), req.GenericKey, nil + } + return "{}", "", fmt.Errorf("unknown type: %s", req.SecretType) +} + +// ────── List ────── + func (h *CredentialHandler) ListCredentials(c *gin.Context) { - var creds []models.Credential - if err := h.db.Order("updated_at DESC").Find(&creds).Error; err != nil { - c.JSON(http.StatusInternalServerError, models.Response{Code: 500, Message: "查询失败"}) - return + var query models.SecretListQuery + c.ShouldBindQuery(&query) + + db := h.db.Model(&models.Credential{}) + if query.SecretType != "" { + db = db.Where("secret_type = ?", query.SecretType) } - items := make([]models.CredentialListResponse, 0, len(creds)) + if query.Search != "" { + s := "%" + query.Search + "%" + db = db.Where("name LIKE ? OR description LIKE ? OR variable_name LIKE ?", s, s, s) + } + if query.Tags != "" { + for _, tag := range strings.Split(query.Tags, ",") { + tag = strings.TrimSpace(tag) + if tag != "" { + db = db.Where("tags LIKE ?", "%\""+tag+"\"%") + } + } + } + + var total int64 + db.Count(&total) + + page := query.Page + if page < 1 { page = 1 } + pageSize := query.PageSize + if pageSize < 1 || pageSize > 100 { pageSize = 20 } + + var creds []models.Credential + db.Order("updated_at DESC").Offset((page - 1) * pageSize).Limit(pageSize).Find(&creds) + + items := make([]models.SecretListResponse, 0, len(creds)) for _, cred := range creds { - items = append(items, models.CredentialListResponse{ - ID: cred.ID, - Name: cred.Name, - Type: cred.Type, - Preview: preview(cred.Content), - Description: cred.Description, - CreatedAt: cred.CreatedAt, - UpdatedAt: cred.UpdatedAt, + tags := []string{} + if cred.Tags != "" { + json.Unmarshal([]byte(cred.Tags), &tags) + } + items = append(items, models.SecretListResponse{ + ID: cred.ID, + Name: cred.Name, + VariableName: cred.VariableName, + SecretType: cred.SecretType, + Summary: cred.Summary, + Tags: tags, + Description: cred.Description, + ExpiresAt: cred.ExpiresAt, + IsActive: cred.IsActive, + EnvPrefix: cred.EnvPrefix, + CreatedAt: cred.CreatedAt, + UpdatedAt: cred.UpdatedAt, }) } + c.JSON(http.StatusOK, models.Response{Code: 200, Data: models.ListResponse{ - List: items, Total: int64(len(items)), + List: items, Total: total, }}) } -// CreateCredential 创建凭据 +// ────── Create ────── + func (h *CredentialHandler) CreateCredential(c *gin.Context) { - var req models.CredentialCreateRequest + var req models.CreateSecretRequest if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, models.Response{Code: 400, Message: "参数错误: " + err.Error()}) return } - encrypted, err := h.crypt.Encrypt(req.Content) + plainContent, summary, err := buildContent(req) + if err != nil { + c.JSON(http.StatusBadRequest, models.Response{Code: 400, Message: err.Error()}) + return + } + + encrypted, err := h.crypt.Encrypt(plainContent) if err != nil { c.JSON(http.StatusInternalServerError, models.Response{Code: 500, Message: "加密失败"}) return } + tagsJSON, _ := json.Marshal(req.Tags) + + isActive := true + if req.IsActive != nil { isActive = *req.IsActive } + cred := models.Credential{ - Name: req.Name, - Type: req.Type, - Content: encrypted, - Description: req.Description, + Name: req.Name, + VariableName: req.VariableName, + SecretType: req.SecretType, + Summary: summary, + Content: encrypted, + Tags: string(tagsJSON), + Description: req.Description, + ExpiresAt: req.ExpiresAt, + IsActive: isActive, + EnvPrefix: genEnvPrefix(), } + if err := h.db.Create(&cred).Error; err != nil { - c.JSON(http.StatusInternalServerError, models.Response{Code: 500, Message: "创建失败"}) + c.JSON(http.StatusInternalServerError, models.Response{Code: 500, Message: "创建失败: " + err.Error()}) return } - c.JSON(http.StatusOK, models.Response{ - Code: 200, - Message: "创建成功", - Data: models.CredentialListResponse{ - ID: cred.ID, - Name: cred.Name, - Type: cred.Type, - Preview: preview(cred.Content), - Description: cred.Description, - CreatedAt: cred.CreatedAt, - UpdatedAt: cred.UpdatedAt, - }, - }) + c.JSON(http.StatusOK, models.Response{Code: 200, Message: "创建成功", Data: cred.ID}) } -// UpdateCredential 更新凭据 -func (h *CredentialHandler) UpdateCredential(c *gin.Context) { - id, err := strconv.ParseUint(c.Param("id"), 10, 32) - if err != nil { - c.JSON(http.StatusBadRequest, models.Response{Code: 400, Message: "无效ID"}) - return - } - - var req models.CredentialUpdateRequest - if err := c.ShouldBindJSON(&req); err != nil { - c.JSON(http.StatusBadRequest, models.Response{Code: 400, Message: "参数错误: " + err.Error()}) - return - } +// ────── Get Detail ────── +func (h *CredentialHandler) GetCredential(c *gin.Context) { + id, _ := strconv.ParseUint(c.Param("id"), 10, 32) var cred models.Credential if h.db.First(&cred, id).Error != nil { c.JSON(http.StatusNotFound, models.Response{Code: 404, Message: "凭据不存在"}) return } - cred.Name = req.Name - cred.Type = req.Type - cred.Description = req.Description + // Decrypt content + plain, err := h.crypt.Decrypt(cred.Content) + if err != nil { + c.JSON(http.StatusInternalServerError, models.Response{Code: 500, Message: "解密失败"}) + return + } - if req.Content != "" { - encrypted, err := h.crypt.Encrypt(req.Content) + var contentData map[string]interface{} + json.Unmarshal([]byte(plain), &contentData) + + tags := []string{} + if cred.Tags != "" { json.Unmarshal([]byte(cred.Tags), &tags) } + + c.JSON(http.StatusOK, models.Response{Code: 200, Data: gin.H{ + "id": cred.ID, + "name": cred.Name, + "variable_name": cred.VariableName, + "secret_type": cred.SecretType, + "content": contentData, + "tags": tags, + "description": cred.Description, + "expires_at": cred.ExpiresAt, + "is_active": cred.IsActive, + "env_prefix": cred.EnvPrefix, + "created_at": cred.CreatedAt, + "updated_at": cred.UpdatedAt, + }}) +} + +// ────── Update ────── + +func (h *CredentialHandler) UpdateCredential(c *gin.Context) { + id, _ := strconv.ParseUint(c.Param("id"), 10, 32) + var cred models.Credential + if h.db.First(&cred, id).Error != nil { + c.JSON(http.StatusNotFound, models.Response{Code: 404, Message: "凭据不存在"}) + return + } + + var req models.UpdateSecretRequest + if err := c.ShouldBindJSON(&req); err != nil { + c.JSON(http.StatusBadRequest, models.Response{Code: 400, Message: "参数错误"}) + return + } + + updates := map[string]interface{}{} + + if req.Name != nil { updates["name"] = *req.Name } + if req.VariableName != nil { updates["variable_name"] = *req.VariableName } + if req.Description != nil { updates["description"] = *req.Description } + if req.ExpiresAt != nil { updates["expires_at"] = req.ExpiresAt } + if req.IsActive != nil { updates["is_active"] = *req.IsActive } + + if len(req.Tags) > 0 { + b, _ := json.Marshal(req.Tags) + updates["tags"] = string(b) + } + + // Rebuild content if any type-specific field changed + if hasTypeFieldUpdate(req) { + // Decrypt old content + oldPlain, _ := h.crypt.Decrypt(cred.Content) + var old map[string]interface{} + json.Unmarshal([]byte(oldPlain), &old) + if old == nil { old = map[string]interface{}{} } + + mergeUpdate(req, old) + + newPlain, _ := json.Marshal(old) + enc, err := h.crypt.Encrypt(string(newPlain)) if err != nil { c.JSON(http.StatusInternalServerError, models.Response{Code: 500, Message: "加密失败"}) return } - cred.Content = encrypted + updates["content"] = enc + + // Update summary + updates["summary"] = buildSummaryFromRaw(old, cred.SecretType) } - if err := h.db.Save(&cred).Error; err != nil { - c.JSON(http.StatusInternalServerError, models.Response{Code: 500, Message: "更新失败"}) - return + if len(updates) > 0 { + h.db.Model(&cred).Updates(updates) } c.JSON(http.StatusOK, models.Response{Code: 200, Message: "更新成功"}) } -// DeleteCredential 删除凭据 +func hasTypeFieldUpdate(req models.UpdateSecretRequest) bool { + return req.SSHPrivateKey != nil || req.SSHPublicKey != nil || req.SSHUser != nil || req.SSHPort != nil || req.SSHPassword != nil || + req.DockerServer != nil || req.DockerUsername != nil || req.DockerPassword != nil || + req.TLSCert != nil || req.TLSKey != nil || req.TLSCA != nil || + req.AKSKProvider != nil || req.AKSKAccessKey != nil || req.AKSKSecretKey != nil || req.AKSKRegion != nil || + req.DBType != nil || req.DBHost != nil || req.DBPort != nil || req.DBName != nil || req.DBUsername != nil || req.DBPassword != nil || + req.APIKey != nil || req.APIEndpoint != nil || + req.GenericKey != nil || req.GenericValue != nil +} + +func mergeUpdate(req models.UpdateSecretRequest, old map[string]interface{}) { + if req.SSHPrivateKey != nil { old["private_key"] = *req.SSHPrivateKey } + if req.SSHPublicKey != nil { old["public_key"] = *req.SSHPublicKey } + if req.SSHUser != nil { old["ssh_user"] = *req.SSHUser } + if req.SSHPort != nil { old["ssh_port"] = *req.SSHPort } + if req.SSHPassword != nil { old["password"] = *req.SSHPassword } + if req.DockerServer != nil { old["server"] = *req.DockerServer } + if req.DockerUsername != nil { old["username"] = *req.DockerUsername } + if req.DockerPassword != nil { old["password"] = *req.DockerPassword } + if req.TLSCert != nil { old["cert"] = *req.TLSCert } + if req.TLSKey != nil { old["key"] = *req.TLSKey } + if req.TLSCA != nil { old["ca"] = *req.TLSCA } + if req.AKSKProvider != nil { old["provider"] = *req.AKSKProvider } + if req.AKSKAccessKey != nil { old["access_key"] = *req.AKSKAccessKey } + if req.AKSKSecretKey != nil { old["secret_key"] = *req.AKSKSecretKey } + if req.AKSKRegion != nil { old["region"] = *req.AKSKRegion } + if req.DBType != nil { old["db_type"] = *req.DBType } + if req.DBHost != nil { old["host"] = *req.DBHost } + if req.DBPort != nil { old["port"] = *req.DBPort } + if req.DBName != nil { old["db_name"] = *req.DBName } + if req.DBUsername != nil { old["username"] = *req.DBUsername } + if req.DBPassword != nil { old["password"] = *req.DBPassword } + if req.APIKey != nil { old["api_key"] = *req.APIKey } + if req.APIEndpoint != nil { old["endpoint"] = *req.APIEndpoint } + if req.GenericKey != nil { old["generic_key"] = *req.GenericKey } + if req.GenericValue != nil { old["generic_value"] = *req.GenericValue } +} + +func buildSummaryFromRaw(data map[string]interface{}, stype string) string { + switch stype { + case "ssh": + return fmt.Sprintf("SSH %v@%v", data["ssh_user"], data["ssh_port"]) + case "docker": + return fmt.Sprintf("%v", data["server"]) + case "aksk": + return fmt.Sprintf("%v", data["provider"]) + case "database": + return fmt.Sprintf("%v://%v:%v/%v", data["db_type"], data["host"], data["port"], data["db_name"]) + case "api": + return fmt.Sprintf("%v", data["endpoint"]) + case "generic": + return fmt.Sprintf("%v", data["generic_key"]) + case "tls": + return "TLS 证书已配置" + } + return "" +} + +// ────── Patch (toggle is_active) ────── + +func (h *CredentialHandler) PatchCredential(c *gin.Context) { + id, _ := strconv.ParseUint(c.Param("id"), 10, 32) + var body map[string]interface{} + c.ShouldBindJSON(&body) + + updates := map[string]interface{}{} + if v, ok := body["is_active"]; ok { + updates["is_active"] = v + } + if len(updates) > 0 { + h.db.Model(&models.Credential{}).Where("id = ?", id).Updates(updates) + } + c.JSON(http.StatusOK, models.Response{Code: 200, Message: "ok"}) +} + +// ────── Delete ────── + func (h *CredentialHandler) DeleteCredential(c *gin.Context) { - id, err := strconv.ParseUint(c.Param("id"), 10, 32) - if err != nil { - c.JSON(http.StatusBadRequest, models.Response{Code: 400, Message: "无效ID"}) - return - } - - var cred models.Credential - if h.db.First(&cred, id).Error != nil { - c.JSON(http.StatusNotFound, models.Response{Code: 404, Message: "凭据不存在"}) - return - } - - if err := h.db.Delete(&cred).Error; err != nil { + id, _ := strconv.ParseUint(c.Param("id"), 10, 32) + if h.db.Delete(&models.Credential{}, id).Error != nil { c.JSON(http.StatusInternalServerError, models.Response{Code: 500, Message: "删除失败"}) return } - c.JSON(http.StatusOK, models.Response{Code: 200, Message: "删除成功"}) } + +// ────── Tags ────── + +func (h *CredentialHandler) GetTags(c *gin.Context) { + var rows []string + h.db.Model(&models.Credential{}).Where("tags != ''").Pluck("tags", &rows) + + tagSet := map[string]bool{} + for _, r := range rows { + var tags []string + if json.Unmarshal([]byte(r), &tags) == nil { + for _, t := range tags { tagSet[t] = true } + } + } + tags := make([]string, 0, len(tagSet)) + for t := range tagSet { tags = append(tags, t) } + c.JSON(http.StatusOK, models.Response{Code: 200, Data: tags}) +} diff --git a/backend/internal/api/handlers/credential_assign.go b/backend/internal/api/handlers/credential_assign.go index 0e7f41a..d5a6f95 100644 --- a/backend/internal/api/handlers/credential_assign.go +++ b/backend/internal/api/handlers/credential_assign.go @@ -43,7 +43,7 @@ func (h *CredentialHandler) AssignCredential(c *gin.Context) { return } - if cred.Type == "ssh_key" { + if cred.SecretType == "ssh" { server.SSHKey = plain server.AuthType = "key" server.Password = "" diff --git a/backend/internal/api/handlers/deploy.go b/backend/internal/api/handlers/deploy.go new file mode 100644 index 0000000..de77f4f --- /dev/null +++ b/backend/internal/api/handlers/deploy.go @@ -0,0 +1,164 @@ +package handlers + +import ( + "net/http" + + "ezops/internal/models" + + "github.com/gin-gonic/gin" + "gorm.io/gorm" +) + +// DeployHandler 发布系统处理器 +type DeployHandler struct { + db *gorm.DB +} + +func NewDeployHandler(db *gorm.DB) *DeployHandler { + return &DeployHandler{db: db} +} + +// ==================== Git 仓库认证 ==================== + +func (h *DeployHandler) ListRepos(c *gin.Context) { + var items []models.PipelineRepo + h.db.Order("updated_at DESC").Find(&items) + c.JSON(http.StatusOK, models.Response{Code: 200, Data: models.ListResponse{List: items, Total: int64(len(items))}}) +} + +func (h *DeployHandler) GetRepo(c *gin.Context) { + var item models.PipelineRepo + if err := h.db.First(&item, c.Param("id")); err.Error != nil { + c.JSON(http.StatusNotFound, models.Response{Code: 404, Message: "不存在"}) + return + } + c.JSON(http.StatusOK, models.Response{Code: 200, Data: item}) +} + +func (h *DeployHandler) CreateRepo(c *gin.Context) { + var req struct { + Name string `json:"name" binding:"required"` + Description string `json:"description"` + URL string `json:"url" binding:"required"` + AuthType models.RepoAuthType `json:"auth_type"` + CredentialID *uint `json:"credential_id"` + } + if err := c.ShouldBindJSON(&req); err != nil { + c.JSON(http.StatusBadRequest, models.Response{Code: 400, Message: err.Error()}) + return + } + if req.AuthType == "" { req.AuthType = models.RepoAuthToken } + item := models.PipelineRepo{ + Name: req.Name, Description: req.Description, URL: req.URL, + AuthType: req.AuthType, CredentialID: req.CredentialID, + CreatedBy: c.GetString("username"), + } + h.db.Create(&item) + c.JSON(http.StatusOK, models.Response{Code: 200, Data: item}) +} + +func (h *DeployHandler) UpdateRepo(c *gin.Context) { + var item models.PipelineRepo + if err := h.db.First(&item, c.Param("id")); err.Error != nil { + c.JSON(http.StatusNotFound, models.Response{Code: 404, Message: "不存在"}) + return + } + var req struct { + Name *string `json:"name"` + Description *string `json:"description"` + URL *string `json:"url"` + AuthType *models.RepoAuthType `json:"auth_type"` + CredentialID *uint `json:"credential_id"` + Enabled *bool `json:"enabled"` + } + c.ShouldBindJSON(&req) + updates := map[string]interface{}{} + if req.Name != nil { updates["name"] = *req.Name } + if req.Description != nil { updates["description"] = *req.Description } + if req.URL != nil { updates["url"] = *req.URL } + if req.AuthType != nil { updates["auth_type"] = *req.AuthType } + if req.Enabled != nil { updates["enabled"] = *req.Enabled } + if req.CredentialID != nil { updates["credential_id"] = req.CredentialID } + h.db.Model(&item).Updates(updates) + h.db.First(&item, item.ID) + c.JSON(http.StatusOK, models.Response{Code: 200, Data: item}) +} + +func (h *DeployHandler) DeleteRepo(c *gin.Context) { + h.db.Delete(&models.PipelineRepo{}, c.Param("id")) + c.JSON(http.StatusOK, models.Response{Code: 200, Message: "已删除"}) +} + +// ==================== 镜像仓库认证 ==================== + +func (h *DeployHandler) ListRegistries(c *gin.Context) { + var items []models.PipelineRegistry + h.db.Order("updated_at DESC").Find(&items) + c.JSON(http.StatusOK, models.Response{Code: 200, Data: models.ListResponse{List: items, Total: int64(len(items))}}) +} + +func (h *DeployHandler) GetRegistry(c *gin.Context) { + var item models.PipelineRegistry + if err := h.db.First(&item, c.Param("id")); err.Error != nil { + c.JSON(http.StatusNotFound, models.Response{Code: 404, Message: "不存在"}) + return + } + c.JSON(http.StatusOK, models.Response{Code: 200, Data: item}) +} + +func (h *DeployHandler) CreateRegistry(c *gin.Context) { + var req struct { + Name string `json:"name" binding:"required"` + Description string `json:"description"` + RegistryURL string `json:"registry_url" binding:"required"` + Namespace string `json:"namespace"` + AuthType models.RegistryAuthType `json:"auth_type"` + CredentialID *uint `json:"credential_id"` + } + if err := c.ShouldBindJSON(&req); err != nil { + c.JSON(http.StatusBadRequest, models.Response{Code: 400, Message: err.Error()}) + return + } + if req.AuthType == "" { req.AuthType = models.RegistryAuthPassword } + item := models.PipelineRegistry{ + Name: req.Name, Description: req.Description, RegistryURL: req.RegistryURL, + Namespace: req.Namespace, AuthType: req.AuthType, CredentialID: req.CredentialID, + CreatedBy: c.GetString("username"), + } + h.db.Create(&item) + c.JSON(http.StatusOK, models.Response{Code: 200, Data: item}) +} + +func (h *DeployHandler) UpdateRegistry(c *gin.Context) { + var item models.PipelineRegistry + if err := h.db.First(&item, c.Param("id")); err.Error != nil { + c.JSON(http.StatusNotFound, models.Response{Code: 404, Message: "不存在"}) + return + } + var req struct { + Name *string `json:"name"` + Description *string `json:"description"` + RegistryURL *string `json:"registry_url"` + Namespace *string `json:"namespace"` + AuthType *models.RegistryAuthType `json:"auth_type"` + CredentialID *uint `json:"credential_id"` + Enabled *bool `json:"enabled"` + } + c.ShouldBindJSON(&req) + updates := map[string]interface{}{} + if req.Name != nil { updates["name"] = *req.Name } + if req.Description != nil { updates["description"] = *req.Description } + if req.RegistryURL != nil { updates["registry_url"] = *req.RegistryURL } + if req.Namespace != nil { updates["namespace"] = *req.Namespace } + if req.AuthType != nil { updates["auth_type"] = *req.AuthType } + if req.Enabled != nil { updates["enabled"] = *req.Enabled } + if req.CredentialID != nil { updates["credential_id"] = req.CredentialID } + h.db.Model(&item).Updates(updates) + h.db.First(&item, item.ID) + c.JSON(http.StatusOK, models.Response{Code: 200, Data: item}) +} + +func (h *DeployHandler) DeleteRegistry(c *gin.Context) { + h.db.Delete(&models.PipelineRegistry{}, c.Param("id")) + c.JSON(http.StatusOK, models.Response{Code: 200, Message: "已删除"}) +} diff --git a/backend/internal/api/handlers/deploy_environments.go b/backend/internal/api/handlers/deploy_environments.go new file mode 100644 index 0000000..5ea2df9 --- /dev/null +++ b/backend/internal/api/handlers/deploy_environments.go @@ -0,0 +1,234 @@ +package handlers + +import ( + "encoding/json" + "fmt" + "net/http" + "strconv" + "time" + + "ezops/internal/models" + + "github.com/gin-gonic/gin" +) + +// ==================== 环境管理 ==================== + +// ListEnvironments 环境列表 +func (h *PipelineHandler) ListEnvironments(c *gin.Context) { + var items []models.DeployEnvironment + h.db.Order("sort_order ASC, id ASC").Find(&items) + c.JSON(http.StatusOK, models.Response{Code: 200, Data: models.ListResponse{List: items, Total: int64(len(items))}}) +} + +// CreateEnvironment 创建环境 +func (h *PipelineHandler) CreateEnvironment(c *gin.Context) { + var req struct { + Name string `json:"name" binding:"required"` + DisplayName string `json:"display_name" binding:"required"` + Type string `json:"type" binding:"required,oneof=production staging testing development"` + Color string `json:"color"` + SortOrder int `json:"sort_order"` + Description string `json:"description"` + } + if err := c.ShouldBindJSON(&req); err != nil { + c.JSON(http.StatusBadRequest, models.Response{Code: 400, Message: err.Error()}) + return + } + if req.Color == "" { req.Color = typeDefaultColor(req.Type) } + item := models.DeployEnvironment{ + Name: req.Name, DisplayName: req.DisplayName, + Type: models.EnvironmentType(req.Type), Color: req.Color, + SortOrder: req.SortOrder, Description: req.Description, + } + if err := h.db.Create(&item).Error; err != nil { + c.JSON(http.StatusInternalServerError, models.Response{Code: 500, Message: "创建失败: " + err.Error()}) + return + } + c.JSON(http.StatusOK, models.Response{Code: 200, Data: item}) +} + +// UpdateEnvironment 更新环境 +func (h *PipelineHandler) UpdateEnvironment(c *gin.Context) { + id, _ := strconv.Atoi(c.Param("id")) + var item models.DeployEnvironment + if err := h.db.First(&item, id).Error; err != nil { + c.JSON(http.StatusNotFound, models.Response{Code: 404, Message: "不存在"}) + return + } + var req struct { + Name *string `json:"name"` + DisplayName *string `json:"display_name"` + Type *string `json:"type"` + Color *string `json:"color"` + SortOrder *int `json:"sort_order"` + Description *string `json:"description"` + Enabled *bool `json:"enabled"` + } + c.ShouldBindJSON(&req) + updates := map[string]interface{}{} + if req.Name != nil { updates["name"] = *req.Name } + if req.DisplayName != nil { updates["display_name"] = *req.DisplayName } + if req.Type != nil { updates["type"] = *req.Type } + if req.Color != nil { updates["color"] = *req.Color } + if req.SortOrder != nil { updates["sort_order"] = *req.SortOrder } + if req.Description != nil { updates["description"] = *req.Description } + if req.Enabled != nil { updates["enabled"] = *req.Enabled } + h.db.Model(&item).Updates(updates) + h.db.First(&item, id) + c.JSON(http.StatusOK, models.Response{Code: 200, Data: item}) +} + +// DeleteEnvironment 删除环境 +func (h *PipelineHandler) DeleteEnvironment(c *gin.Context) { + h.db.Delete(&models.DeployEnvironment{}, c.Param("id")) + c.JSON(http.StatusOK, models.Response{Code: 200, Message: "已删除"}) +} + +func typeDefaultColor(t string) string { + switch t { + case "production": return "#EF4444" + case "staging": return "#F59E0B" + case "testing": return "#10B981" + default: return "#3B82F6" // development + } +} + +// ==================== 流水线成员管理 ==================== + +// ListPipelineMembers 成员列表 +func (h *PipelineHandler) ListPipelineMembers(c *gin.Context) { + pipelineID := getPipelineID(c) + var members []models.DeployPipelineMember + h.db.Where("pipeline_id = ?", pipelineID).Order("created_at ASC").Find(&members) + c.JSON(http.StatusOK, models.Response{Code: 200, Data: members}) +} + +// AddPipelineMember 添加成员 +func (h *PipelineHandler) AddPipelineMember(c *gin.Context) { + pipelineID := getPipelineID(c) + var req struct { + Username string `json:"username" binding:"required"` + Role string `json:"role" binding:"required,oneof=owner editor viewer"` + } + if err := c.ShouldBindJSON(&req); err != nil { + c.JSON(http.StatusBadRequest, models.Response{Code: 400, Message: err.Error()}) + return + } + + var pipeline models.Pipeline + if err := h.db.First(&pipeline, pipelineID).Error; err != nil { + c.JSON(http.StatusNotFound, models.Response{Code: 404, Message: "流水线不存在"}) + return + } + + member := models.DeployPipelineMember{ + PipelineID: uint(pipelineID), + Username: &req.Username, + Role: models.MemberRole(req.Role), + } + if err := h.db.Create(&member).Error; err != nil { + c.JSON(http.StatusConflict, models.Response{Code: 409, Message: "该用户已是成员"}) + return + } + c.JSON(http.StatusOK, models.Response{Code: 200, Data: member}) +} + +// RemovePipelineMember 移除成员 +func (h *PipelineHandler) RemovePipelineMember(c *gin.Context) { + pipelineID := getPipelineID(c) + memberID, _ := strconv.Atoi(c.Param("memberId")) + result := h.db.Where("id = ? AND pipeline_id = ?", memberID, pipelineID).Delete(&models.DeployPipelineMember{}) + if result.RowsAffected == 0 { + c.JSON(http.StatusNotFound, models.Response{Code: 404, Message: "成员不存在"}) + return + } + c.JSON(http.StatusOK, models.Response{Code: 200, Message: "已移除"}) +} + +// ==================== 流水线运行控制 ==================== + +// StopPipelineRun 停止运行中的流水线 +func (h *PipelineHandler) StopPipelineRun(c *gin.Context) { + pipelineID := getPipelineID(c) + runID, _ := strconv.Atoi(c.Param("runId")) + + var run models.PipelineRun + if err := h.db.Where("id = ? AND pipeline_id = ?", runID, pipelineID).First(&run).Error; err != nil { + c.JSON(http.StatusNotFound, models.Response{Code: 404, Message: "运行记录不存在"}) + return + } + if run.Status != "running" && run.Status != "pending" { + c.JSON(http.StatusBadRequest, models.Response{Code: 400, Message: "仅运行中或等待中的任务可停止, 当前状态: " + run.Status}) + return + } + + now := time.Now() + updates := map[string]interface{}{ + "status": "cancelled", + "finished_at": &now, + } + if run.StartedAt != nil { + dur := int(now.Sub(*run.StartedAt).Seconds()) + updates["duration"] = dur + } + h.db.Model(&run).Updates(updates) + + // 追加日志 + logEntry := map[string]string{ + "time": now.Format("15:04:05"), + "level": "warn", + "message": ">> 任务已被手动停止", + "stage": "--", + } + existingLogs := run.Logs + if existingLogs == "" { + existingLogs = "[]" + } + var logEntries []map[string]string + json.Unmarshal([]byte(existingLogs), &logEntries) + logEntries = append(logEntries, logEntry) + newLogs, _ := json.Marshal(logEntries) + h.db.Model(&run).Update("logs", string(newLogs)) + + h.db.First(&run, runID) + c.JSON(http.StatusOK, models.Response{Code: 200, Data: run, Message: "已停止"}) +} + +// GetRunLog 获取运行日志 +func (h *PipelineHandler) GetRunLog(c *gin.Context) { + pipelineID := getPipelineID(c) + runID, _ := strconv.Atoi(c.Param("runId")) + + var run models.PipelineRun + if err := h.db.Where("id = ? AND pipeline_id = ?", runID, pipelineID).First(&run).Error; err != nil { + c.JSON(http.StatusNotFound, models.Response{Code: 404, Message: "运行记录不存在"}) + return + } + + var logs []map[string]string + if run.Logs != "" { + json.Unmarshal([]byte(run.Logs), &logs) + } + + c.JSON(http.StatusOK, models.Response{Code: 200, Data: gin.H{ + "run": run, + "logs": logs, + }}) +} + +// BatchDeleteRuns 批量删除运行记录 +func (h *PipelineHandler) BatchDeleteRuns(c *gin.Context) { + pipelineID := getPipelineID(c) + + var req struct { + IDs []uint `json:"ids" binding:"required"` + } + if err := c.ShouldBindJSON(&req); err != nil || len(req.IDs) == 0 { + c.JSON(http.StatusBadRequest, models.Response{Code: 400, Message: "请选择要删除的记录"}) + return + } + + result := h.db.Where("pipeline_id = ? AND id IN ?", pipelineID, req.IDs).Delete(&models.PipelineRun{}) + c.JSON(http.StatusOK, models.Response{Code: 200, Message: fmt.Sprintf("已删除 %d 条记录", result.RowsAffected)}) +} diff --git a/backend/internal/api/handlers/deploy_groups.go b/backend/internal/api/handlers/deploy_groups.go new file mode 100644 index 0000000..d7135df --- /dev/null +++ b/backend/internal/api/handlers/deploy_groups.go @@ -0,0 +1,151 @@ +package handlers + +import ( + "net/http" + "strconv" + + "ezops/internal/models" + + "github.com/gin-gonic/gin" +) + +// ==================== 用户组管理 ==================== + +// ListGroups 用户组列表 +func (h *PipelineHandler) ListGroups(c *gin.Context) { + var groups []models.DeployUserGroup + h.db.Preload("Members").Order("created_at DESC").Find(&groups) + c.JSON(http.StatusOK, models.Response{Code: 200, Data: models.ListResponse{List: groups, Total: int64(len(groups))}}) +} + +// CreateGroup 创建用户组 +func (h *PipelineHandler) CreateGroup(c *gin.Context) { + var req struct { + Name string `json:"name" binding:"required"` + Description string `json:"description"` + } + if err := c.ShouldBindJSON(&req); err != nil { + c.JSON(http.StatusBadRequest, models.Response{Code: 400, Message: err.Error()}) + return + } + group := models.DeployUserGroup{ + Name: req.Name, Description: req.Description, + CreatedBy: c.GetString("username"), + } + if err := h.db.Create(&group).Error; err != nil { + c.JSON(http.StatusConflict, models.Response{Code: 409, Message: "组名已存在: " + err.Error()}) + return + } + c.JSON(http.StatusOK, models.Response{Code: 200, Data: group}) +} + +// UpdateGroup 更新用户组 +func (h *PipelineHandler) UpdateGroup(c *gin.Context) { + id, _ := strconv.Atoi(c.Param("id")) + var group models.DeployUserGroup + if err := h.db.First(&group, id).Error; err != nil { + c.JSON(http.StatusNotFound, models.Response{Code: 404, Message: "不存在"}) + return + } + var req struct { + Name *string `json:"name"` + Description *string `json:"description"` + } + c.ShouldBindJSON(&req) + updates := map[string]interface{}{} + if req.Name != nil { updates["name"] = *req.Name } + if req.Description != nil { updates["description"] = *req.Description } + h.db.Model(&group).Updates(updates) + h.db.First(&group, id) + c.JSON(http.StatusOK, models.Response{Code: 200, Data: group}) +} + +// DeleteGroup 删除用户组 +func (h *PipelineHandler) DeleteGroup(c *gin.Context) { + id := c.Param("id") + // 先删组成员和流水线授权 + h.db.Where("group_id = ?", id).Delete(&models.DeployUserGroupMember{}) + h.db.Where("group_id = ?", id).Delete(&models.DeployPipelineMember{}) + h.db.Delete(&models.DeployUserGroup{}, id) + c.JSON(http.StatusOK, models.Response{Code: 200, Message: "已删除"}) +} + +// ==================== 用户组成员管理 ==================== + +// ListGroupMembers 组成员列表 +func (h *PipelineHandler) ListGroupMembers(c *gin.Context) { + groupID, _ := strconv.Atoi(c.Param("id")) + var members []models.DeployUserGroupMember + h.db.Where("group_id = ?", groupID).Find(&members) + c.JSON(http.StatusOK, models.Response{Code: 200, Data: members}) +} + +// AddGroupMember 添加组成员 +func (h *PipelineHandler) AddGroupMember(c *gin.Context) { + groupID, _ := strconv.Atoi(c.Param("id")) + var req struct { + Username string `json:"username" binding:"required"` + } + if err := c.ShouldBindJSON(&req); err != nil { + c.JSON(http.StatusBadRequest, models.Response{Code: 400, Message: err.Error()}) + return + } + member := models.DeployUserGroupMember{GroupID: uint(groupID), Username: req.Username} + if err := h.db.Create(&member).Error; err != nil { + c.JSON(http.StatusConflict, models.Response{Code: 409, Message: "该用户已在组内"}) + return + } + c.JSON(http.StatusOK, models.Response{Code: 200, Data: member}) +} + +// RemoveGroupMember 移除组成员 +func (h *PipelineHandler) RemoveGroupMember(c *gin.Context) { + groupID, _ := strconv.Atoi(c.Param("id")) + memberID, _ := strconv.Atoi(c.Param("memberId")) + result := h.db.Where("id = ? AND group_id = ?", memberID, groupID).Delete(&models.DeployUserGroupMember{}) + if result.RowsAffected == 0 { + c.JSON(http.StatusNotFound, models.Response{Code: 404, Message: "成员不存在"}) + return + } + c.JSON(http.StatusOK, models.Response{Code: 200, Message: "已移除"}) +} + +// ==================== 组授权给流水线 ==================== + +// AssignGroupToPipeline 将用户组授权到流水线 +func (h *PipelineHandler) AssignGroupToPipeline(c *gin.Context) { + pipelineID := getPipelineID(c) + var req struct { + GroupID uint `json:"group_id" binding:"required"` + Role string `json:"role" binding:"required,oneof=owner editor viewer"` + } + if err := c.ShouldBindJSON(&req); err != nil { + c.JSON(http.StatusBadRequest, models.Response{Code: 400, Message: err.Error()}) + return + } + + var pipeline models.Pipeline + if err := h.db.First(&pipeline, pipelineID).Error; err != nil { + c.JSON(http.StatusNotFound, models.Response{Code: 404, Message: "流水线不存在"}) + return + } + var group models.DeployUserGroup + if err := h.db.First(&group, req.GroupID).Error; err != nil { + c.JSON(http.StatusNotFound, models.Response{Code: 404, Message: "用户组不存在"}) + return + } + + member := models.DeployPipelineMember{ + PipelineID: uint(pipelineID), + GroupID: &req.GroupID, + Role: models.MemberRole(req.Role), + } + if err := h.db.Create(&member).Error; err != nil { + c.JSON(http.StatusConflict, models.Response{Code: 409, Message: "该组已被授权到此流水线"}) + return + } + + // 预加载关联 + member.Group = &group + c.JSON(http.StatusOK, models.Response{Code: 200, Data: member, Message: "已授权"}) +} diff --git a/backend/internal/api/handlers/item_role.go b/backend/internal/api/handlers/item_role.go new file mode 100644 index 0000000..9c2637d --- /dev/null +++ b/backend/internal/api/handlers/item_role.go @@ -0,0 +1,201 @@ +package handlers + +import ( + "net/http" + "strconv" + + "ezops/internal/models" + + "github.com/gin-gonic/gin" + "gorm.io/gorm" +) + +// ItemRoleHandler Item Role handler (Jenkins-style regex pipeline matching) +type ItemRoleHandler struct { + db *gorm.DB +} + +// NewItemRoleHandler creates a new ItemRoleHandler +func NewItemRoleHandler(db *gorm.DB) *ItemRoleHandler { + return &ItemRoleHandler{db: db} +} + +// ListItemRoles GET /admin/item-roles +func (h *ItemRoleHandler) ListItemRoles(c *gin.Context) { + var roles []models.ItemRole + h.db.Order("created_at DESC").Find(&roles) + c.JSON(http.StatusOK, models.Response{ + Code: 200, + Data: models.ListResponse{List: roles, Total: int64(len(roles))}, + }) +} + +// CreateItemRole POST /admin/item-roles +func (h *ItemRoleHandler) CreateItemRole(c *gin.Context) { + var req models.CreateItemRoleRequest + if err := c.ShouldBindJSON(&req); err != nil { + c.JSON(http.StatusBadRequest, models.Response{Code: 400, Message: "请求参数错误: " + err.Error()}) + return + } + + // 唯一性校验 + var existing models.ItemRole + if err := h.db.Where("name = ? OR code = ?", req.Name, req.Code).First(&existing).Error; err == nil { + c.JSON(http.StatusBadRequest, models.Response{Code: 400, Message: "Item Role 名称或编码已存在"}) + return + } + + role := models.ItemRole{ + Name: req.Name, + Code: req.Code, + Pattern: req.Pattern, + Role: req.Role, + Description: req.Description, + Status: 1, + } + if err := h.db.Create(&role).Error; err != nil { + c.JSON(http.StatusInternalServerError, models.Response{Code: 500, Message: "创建失败"}) + return + } + + c.JSON(http.StatusOK, models.Response{Code: 200, Message: "创建成功", Data: role}) +} + +// UpdateItemRole PUT /admin/item-roles/:id +func (h *ItemRoleHandler) UpdateItemRole(c *gin.Context) { + id, err := strconv.Atoi(c.Param("id")) + if err != nil { + c.JSON(http.StatusBadRequest, models.Response{Code: 400, Message: "无效的 ID"}) + return + } + + var req models.UpdateItemRoleRequest + if err := c.ShouldBindJSON(&req); err != nil { + c.JSON(http.StatusBadRequest, models.Response{Code: 400, Message: "请求参数错误: " + err.Error()}) + return + } + + var role models.ItemRole + if err := h.db.First(&role, id).Error; err != nil { + c.JSON(http.StatusNotFound, models.Response{Code: 404, Message: "Item Role 不存在"}) + return + } + + updates := map[string]interface{}{} + if req.Name != "" { + updates["name"] = req.Name + } + if req.Code != "" { + updates["code"] = req.Code + } + if req.Pattern != "" { + updates["pattern"] = req.Pattern + } + if req.Role != "" { + updates["role"] = req.Role + } + if req.Description != "" { + updates["description"] = req.Description + } + if req.Status != nil { + updates["status"] = *req.Status + } + + if len(updates) > 0 { + if err := h.db.Model(&role).Updates(updates).Error; err != nil { + c.JSON(http.StatusInternalServerError, models.Response{Code: 500, Message: "更新失败"}) + return + } + } + + h.db.First(&role, id) + c.JSON(http.StatusOK, models.Response{Code: 200, Message: "更新成功", Data: role}) +} + +// DeleteItemRole DELETE /admin/item-roles/:id +func (h *ItemRoleHandler) DeleteItemRole(c *gin.Context) { + id, err := strconv.Atoi(c.Param("id")) + if err != nil { + c.JSON(http.StatusBadRequest, models.Response{Code: 400, Message: "无效的 ID"}) + return + } + + // Clean up user associations first + h.db.Where("item_role_id = ?", id).Delete(&models.UserItemRole{}) + if err := h.db.Delete(&models.ItemRole{}, id).Error; err != nil { + c.JSON(http.StatusInternalServerError, models.Response{Code: 500, Message: "删除失败"}) + return + } + + c.JSON(http.StatusOK, models.Response{Code: 200, Message: "删除成功"}) +} + +// ListUserItemRoles GET /admin/users/:id/item-roles +func (h *ItemRoleHandler) ListUserItemRoles(c *gin.Context) { + userID, err := strconv.Atoi(c.Param("id")) + if err != nil { + c.JSON(http.StatusBadRequest, models.Response{Code: 400, Message: "无效的用户 ID"}) + return + } + + var assignments []models.UserItemRole + h.db.Preload("ItemRole").Where("user_id = ?", userID).Find(&assignments) + c.JSON(http.StatusOK, models.Response{ + Code: 200, + Data: models.ListResponse{List: assignments, Total: int64(len(assignments))}, + }) +} + +// AssignItemRole POST /admin/users/:id/item-roles +func (h *ItemRoleHandler) AssignItemRole(c *gin.Context) { + userID, err := strconv.Atoi(c.Param("id")) + if err != nil { + c.JSON(http.StatusBadRequest, models.Response{Code: 400, Message: "无效的用户 ID"}) + return + } + + var req models.AssignItemRoleRequest + if err := c.ShouldBindJSON(&req); err != nil { + c.JSON(http.StatusBadRequest, models.Response{Code: 400, Message: "请求参数错误: " + err.Error()}) + return + } + + // Check if already assigned + var existing models.UserItemRole + if err := h.db.Where("user_id = ? AND item_role_id = ?", userID, req.ItemRoleID).First(&existing).Error; err == nil { + c.JSON(http.StatusBadRequest, models.Response{Code: 400, Message: "该用户已拥有此 Item Role"}) + return + } + + assignment := models.UserItemRole{ + UserID: uint(userID), + ItemRoleID: req.ItemRoleID, + } + if err := h.db.Create(&assignment).Error; err != nil { + c.JSON(http.StatusInternalServerError, models.Response{Code: 500, Message: "分配失败"}) + return + } + + c.JSON(http.StatusOK, models.Response{Code: 200, Message: "分配成功", Data: assignment}) +} + +// RemoveItemRole DELETE /admin/users/:id/item-roles/:roleId +func (h *ItemRoleHandler) RemoveItemRole(c *gin.Context) { + userID, err := strconv.Atoi(c.Param("id")) + if err != nil { + c.JSON(http.StatusBadRequest, models.Response{Code: 400, Message: "无效的用户 ID"}) + return + } + roleID, err := strconv.Atoi(c.Param("roleId")) + if err != nil { + c.JSON(http.StatusBadRequest, models.Response{Code: 400, Message: "无效的 Role ID"}) + return + } + + if err := h.db.Where("user_id = ? AND item_role_id = ?", uint(userID), roleID).Delete(&models.UserItemRole{}).Error; err != nil { + c.JSON(http.StatusInternalServerError, models.Response{Code: 500, Message: "移除失败"}) + return + } + + c.JSON(http.StatusOK, models.Response{Code: 200, Message: "移除成功"}) +} diff --git a/backend/internal/api/handlers/pipeline.go b/backend/internal/api/handlers/pipeline.go index ff5a825..3eec182 100644 --- a/backend/internal/api/handlers/pipeline.go +++ b/backend/internal/api/handlers/pipeline.go @@ -2,22 +2,63 @@ package handlers import ( "net/http" - "strconv" + "regexp" + "time" "ezops/internal/models" + "ezops/internal/api/middleware" + ezredis "ezops/pkg/redis" "github.com/gin-gonic/gin" "gorm.io/gorm" ) -// PipelineHandler 流水线处理器(流水线 + 应用发布两个子域,应用发布方法拆分至 pipeline_release.go) // Logan.Li +// getPipelineID 从 context 获取中间件注入的流水线 ID +func getPipelineID(c *gin.Context) uint { + if v, exists := c.Get("pipelineID"); exists { + if id, ok := v.(uint); ok { + return id + } + } + return 0 +} + +// codePattern 流水线编码规则:字母+数字+连字符,不能以连字符开头/结尾 +var codePattern = regexp.MustCompile(`^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?$`) + +// validateCode 校验流水线编码格式并查重 +func validateCode(db *gorm.DB, code string, excludeID uint) string { + if code == "" { + return "流水线编码不能为空" + } + if len(code) > 64 { + return "编码长度不能超过 64 字符" + } + if !codePattern.MatchString(code) { + return "编码格式不正确:只能使用字母、数字、连字符(-),不能以连字符开头或结尾\n示例: My-Pipeline, demo-jar-backend" + } + // 查重 + var count int64 + q := db.Model(&models.Pipeline{}).Where("code = ?", code) + if excludeID > 0 { + q = q.Where("id != ?", excludeID) + } + q.Count(&count) + if count > 0 { + return "编码已存在,请使用其他编码" + } + return "" +} + +// PipelineHandler 流水线管理器 type PipelineHandler struct { - db *gorm.DB + db *gorm.DB + cache ezredis.Cache } // NewPipelineHandler 创建流水线处理器 -func NewPipelineHandler(db *gorm.DB) *PipelineHandler { - return &PipelineHandler{db: db} +func NewPipelineHandler(db *gorm.DB, cache ezredis.Cache) *PipelineHandler { + return &PipelineHandler{db: db, cache: cache} } // ListPipelines 获取流水线列表 @@ -29,24 +70,38 @@ func NewPipelineHandler(db *gorm.DB) *PipelineHandler { // @Param page query int false "页码" // @Param page_size query int false "每页数量" // @Success 200 {object} models.Response{data=models.ListResponse} -// @Router /pipelines [get] +// ListPipelines 获取流水线列表 func (h *PipelineHandler) ListPipelines(c *gin.Context) { var query models.PageQuery c.ShouldBindQuery(&query) + // 管理员看全部,非管理员只看自己有权限的 + isAdmin, _ := c.Get("isAdmin") + username, _ := c.Get("username") + usernameStr, _ := username.(string) + userID, _ := c.Get("userID") + uid, _ := userID.(uint) + + db := h.db.Model(&models.Pipeline{}) + if isAdmin != true && usernameStr != "" { + ids, hasAccess := middleware.GetAccessiblePipelineIDs(h.db, usernameStr, uid) + if !hasAccess { + // 没有任何流水线权限 → 返回空列表 + c.JSON(http.StatusOK, models.Response{Code: 200, Data: models.ListResponse{List: []models.Pipeline{}, Total: 0}}) + return + } + db = db.Where("id IN ?", ids) + } + var total int64 - h.db.Model(&models.Pipeline{}).Count(&total) + db.Count(&total) var pipelines []models.Pipeline - h.db.Offset(query.GetOffset()).Limit(query.GetLimit()).Find(&pipelines) + db.Preload("Environment").Offset(query.GetOffset()).Limit(query.GetLimit()).Order("updated_at DESC").Find(&pipelines) c.JSON(http.StatusOK, models.Response{ Code: 200, - Message: "success", - Data: models.ListResponse{ - List: pipelines, - Total: total, - }, + Data: models.ListResponse{List: pipelines, Total: total}, }) } @@ -60,7 +115,11 @@ func (h *PipelineHandler) ListPipelines(c *gin.Context) { // @Success 200 {object} models.Response{data=models.Pipeline} // @Router /pipelines/{id} [get] func (h *PipelineHandler) GetPipeline(c *gin.Context) { - id, _ := strconv.Atoi(c.Param("id")) + id := getPipelineID(c) + if id == 0 { + c.JSON(http.StatusBadRequest, models.Response{Code: 400, Message: "无效的流水线编码"}) + return + } var pipeline models.Pipeline if err := h.db.First(&pipeline, id).Error; err != nil { @@ -98,17 +157,42 @@ func (h *PipelineHandler) CreatePipeline(c *gin.Context) { return } + // 校验编码格式 + if msg := validateCode(h.db, req.Code, 0); msg != "" { + c.JSON(http.StatusBadRequest, models.Response{Code: 400, Message: msg}) + return + } + pipeline := models.Pipeline{ - Name: req.Name, - Code: req.Code, - Description: req.Description, - Type: req.Type, - Source: req.Source, - Branch: req.Branch, - Dockerfile: req.Dockerfile, - Stages: req.Stages, - Variables: req.Variables, - Enabled: true, + Name: req.Name, + Code: req.Code, + JobName: req.JobName, + Description: req.Description, + Type: req.Type, + Source: req.Source, + Branch: req.Branch, + Dockerfile: req.Dockerfile, + Stages: req.Stages, + Variables: req.Variables, + DeployMode: req.DeployMode, + DeployTarget: req.DeployTarget, + ServerIDs: req.ServerIDs, + K8sClusterID: req.K8sClusterID, + K8sNamespace: req.K8sNamespace, + RepoID: req.RepoID, + RegistryID: req.RegistryID, + GitCredentialID: req.GitCredentialID, + RegistryCredentialID: req.RegistryCredentialID, + EnvironmentID: req.EnvironmentID, + // 触发配置 + TriggerMode: req.TriggerMode, + WatchBranches: req.WatchBranches, + ExcludeBranch: req.ExcludeBranch, + CronExpr: req.CronExpr, + WebhookToken: req.WebhookToken, + // 缓存 + CachePaths: req.CachePaths, + Enabled: true, } if err := h.db.Create(&pipeline).Error; err != nil { @@ -138,9 +222,13 @@ func (h *PipelineHandler) CreatePipeline(c *gin.Context) { // @Success 200 {object} models.Response{data=models.Pipeline} // @Router /pipelines/{id} [put] func (h *PipelineHandler) UpdatePipeline(c *gin.Context) { - id, _ := strconv.Atoi(c.Param("id")) + id := getPipelineID(c) + if id == 0 { + c.JSON(http.StatusBadRequest, models.Response{Code: 400, Message: "无效的流水线编码"}) + return + } - var req models.CreatePipelineRequest + var req models.UpdatePipelineRequest if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, models.Response{ Code: 400, @@ -158,16 +246,33 @@ func (h *PipelineHandler) UpdatePipeline(c *gin.Context) { return } - updates := map[string]interface{}{ - "name": req.Name, - "description": req.Description, - "type": req.Type, - "source": req.Source, - "branch": req.Branch, - "dockerfile": req.Dockerfile, - "stages": req.Stages, - "variables": req.Variables, - } + updates := map[string]interface{}{} + if req.Name != "" { updates["name"] = req.Name } + if req.JobName != "" { updates["job_name"] = req.JobName } + if req.Description != "" { updates["description"] = req.Description } + if req.Type != "" { updates["type"] = req.Type } + if req.Source != "" { updates["source"] = req.Source } + if req.Branch != "" { updates["branch"] = req.Branch } + if req.Dockerfile != "" { updates["dockerfile"] = req.Dockerfile } + if req.Stages != "" { updates["stages"] = req.Stages } + if req.Variables != "" { updates["variables"] = req.Variables } + if req.DeployMode != "" { updates["deploy_mode"] = req.DeployMode } + if req.DeployTarget != "" { updates["deploy_target"] = req.DeployTarget } + if req.ServerIDs != "" { updates["server_ids"] = req.ServerIDs } + if req.K8sNamespace != "" { updates["k8s_namespace"] = req.K8sNamespace } + if req.K8sClusterID != nil { updates["k8s_cluster_id"] = req.K8sClusterID } + if req.RepoID != nil { updates["repo_id"] = req.RepoID } + if req.RegistryID != nil { updates["registry_id"] = req.RegistryID } + if req.GitCredentialID != nil { updates["git_credential_id"] = req.GitCredentialID } + if req.RegistryCredentialID != nil { updates["registry_credential_id"] = req.RegistryCredentialID } + if req.EnvironmentID != nil { updates["environment_id"] = req.EnvironmentID } + if req.TriggerMode != "" { updates["trigger_mode"] = req.TriggerMode } + if req.WatchBranches != "" { updates["watch_branches"] = req.WatchBranches } + if req.ExcludeBranch != "" { updates["exclude_branch"] = req.ExcludeBranch } + if req.CronExpr != "" { updates["cron_expr"] = req.CronExpr } + if req.WebhookToken != "" { updates["webhook_token"] = req.WebhookToken } + if req.CachePaths != "" { updates["cache_paths"] = req.CachePaths } + if req.Enabled != nil { updates["enabled"] = req.Enabled } if err := h.db.Model(&pipeline).Updates(updates).Error; err != nil { c.JSON(http.StatusInternalServerError, models.Response{ @@ -196,7 +301,7 @@ func (h *PipelineHandler) UpdatePipeline(c *gin.Context) { // @Success 200 {object} models.Response // @Router /pipelines/{id} [delete] func (h *PipelineHandler) DeletePipeline(c *gin.Context) { - id, _ := strconv.Atoi(c.Param("id")) + id := getPipelineID(c) if err := h.db.Delete(&models.Pipeline{}, id).Error; err != nil { c.JSON(http.StatusInternalServerError, models.Response{ @@ -222,50 +327,59 @@ func (h *PipelineHandler) DeletePipeline(c *gin.Context) { // @Param id path int true "流水线ID" // @Param request body models.TriggerPipelineRequest true "触发请求" // @Success 200 {object} models.Response{data=models.PipelineRun} -// @Router /pipelines/{id}/trigger [post] +// TriggerPipeline 触发流水线 func (h *PipelineHandler) TriggerPipeline(c *gin.Context) { - id, _ := strconv.Atoi(c.Param("id")) + id := getPipelineID(c) + if id == 0 { + c.JSON(http.StatusBadRequest, models.Response{Code: 400, Message: "无效的流水线编码"}) + return + } var pipeline models.Pipeline if err := h.db.First(&pipeline, id).Error; err != nil { - c.JSON(http.StatusNotFound, models.Response{ - Code: 404, - Message: "流水线不存在", - }) + c.JSON(http.StatusNotFound, models.Response{Code: 404, Message: "流水线不存在"}) return } var req models.TriggerPipelineRequest c.ShouldBindJSON(&req) - // 获取最新构建号 - var maxBuildNumber int - h.db.Model(&models.PipelineRun{}).Where("pipeline_id = ?", id).Select("COALESCE(MAX(build_number), 0)").Scan(&maxBuildNumber) + var maxBuildNumber int + h.db.Model(&models.PipelineRun{}).Where("pipeline_id = ?", id). + Select("COALESCE(MAX(build_number), 0)").Scan(&maxBuildNumber) + + branch := req.Branch + tag := req.Tag + ref := branch + if req.Tag != "" { + ref = tag + } else if branch == "" { + ref = pipeline.Branch + } + + username, _ := c.Get("username") + userStr, _ := username.(string) + + now := time.Now() run := models.PipelineRun{ PipelineID: uint(id), BuildNumber: maxBuildNumber + 1, - Status: "pending", - Branch: req.Branch, - TriggeredBy: "manual", - } - - if req.Branch == "" { - run.Branch = pipeline.Branch + Status: "running", + Branch: ref, + ImageTag: tag, // 发布 Tag + TriggeredBy: userStr, + StartedAt: &now, } if err := h.db.Create(&run).Error; err != nil { - c.JSON(http.StatusInternalServerError, models.Response{ - Code: 500, - Message: "触发失败", - }) + c.JSON(http.StatusInternalServerError, models.Response{Code: 500, Message: "触发失败"}) return } - c.JSON(http.StatusOK, models.Response{ - Code: 200, - Message: "触发成功", - Data: run, - }) + // 后台异步执行流水线 + go h.executePipeline(pipeline, run) + + c.JSON(http.StatusOK, models.Response{Code: 200, Message: "已触发", Data: run}) } // ListRuns 获取运行记录列表 @@ -280,7 +394,7 @@ func (h *PipelineHandler) TriggerPipeline(c *gin.Context) { // @Success 200 {object} models.Response{data=models.ListResponse} // @Router /pipelines/{id}/runs [get] func (h *PipelineHandler) ListRuns(c *gin.Context) { - id, _ := strconv.Atoi(c.Param("id")) + id := getPipelineID(c) var query models.PageQuery c.ShouldBindQuery(&query) @@ -290,7 +404,7 @@ func (h *PipelineHandler) ListRuns(c *gin.Context) { db.Count(&total) var runs []models.PipelineRun - db.Order("created_at DESC"). + db.Order("started_at DESC"). Offset(query.GetOffset()). Limit(query.GetLimit()). Find(&runs) @@ -304,3 +418,91 @@ func (h *PipelineHandler) ListRuns(c *gin.Context) { }, }) } + +// WebhookTrigger 外部 Webhook 触发流水线 (支持 URL: /webhook/job/:jobName 和 /webhook/pipeline/:code) +func (h *PipelineHandler) WebhookTrigger(c *gin.Context) { + jobName := c.Param("jobName") + code := c.Param("code") + + var pipeline models.Pipeline + if jobName != "" { + if err := h.db.Where("job_name = ? AND enabled = ?", jobName, true).First(&pipeline).Error; err != nil { + c.JSON(http.StatusNotFound, models.Response{Code: 404, Message: "Job 不存在或已禁用"}) + return + } + } else if code != "" { + if err := h.db.Where("code = ? AND enabled = ?", code, true).First(&pipeline).Error; err != nil { + c.JSON(http.StatusNotFound, models.Response{Code: 404, Message: "流水线不存在或已禁用"}) + return + } + } else { + c.JSON(http.StatusBadRequest, models.Response{Code: 400, Message: "缺少 jobName 或 code"}) + return + } + + // 验证 Webhook Token + if pipeline.WebhookToken != "" { + token := c.GetHeader("X-Webhook-Token") + if token == "" { + token = c.Query("token") + } + if token != pipeline.WebhookToken { + c.JSON(http.StatusForbidden, models.Response{Code: 403, Message: "Webhook Token 无效"}) + return + } + } + + // 解析请求体获取 branch/tag + var req models.TriggerPipelineRequest + c.ShouldBindJSON(&req) + + var maxBuildNumber int + h.db.Model(&models.PipelineRun{}).Where("pipeline_id = ?", pipeline.ID). + Select("COALESCE(MAX(build_number), 0)").Scan(&maxBuildNumber) + + ref := req.Branch + if req.Tag != "" { + ref = req.Tag + } else if ref == "" { + ref = pipeline.Branch + } + + triggeredBy := "webhook" + if reqPayload, exists := c.Get("raw_body"); exists { + // 尝试从 webhook payload 中提取提交者信息 + if body, ok := reqPayload.(map[string]interface{}); ok { + if pusher, ok := body["pusher"].(map[string]interface{}); ok { + if name, ok := pusher["name"].(string); ok { + triggeredBy = name + } + } + } + } + + now := time.Now() + run := models.PipelineRun{ + PipelineID: pipeline.ID, + BuildNumber: maxBuildNumber + 1, + Status: "running", + Branch: ref, + ImageTag: req.Tag, + TriggeredBy: triggeredBy, + StartedAt: &now, + } + + if err := h.db.Create(&run).Error; err != nil { + c.JSON(http.StatusInternalServerError, models.Response{Code: 500, Message: "触发失败"}) + return + } + + go h.executePipeline(pipeline, run) + + c.JSON(http.StatusOK, models.Response{ + Code: 200, + Message: "已触发", + Data: map[string]interface{}{ + "build_number": run.BuildNumber, + "run_id": run.ID, + }, + }) +} diff --git a/backend/internal/api/handlers/pipeline_executor.go b/backend/internal/api/handlers/pipeline_executor.go new file mode 100644 index 0000000..5341bf9 --- /dev/null +++ b/backend/internal/api/handlers/pipeline_executor.go @@ -0,0 +1,574 @@ +package handlers + +import ( + "context" + "encoding/json" + "fmt" + "os" + "os/exec" + "strings" + "time" + + "ezops/internal/models" + + "go.uber.org/zap" +) + +// ==================== 流水线执行引擎 V2(Redis 实时日志推送)==================== + +// LogEntry 日志条目 +type LogEntry struct { + Time string `json:"time"` + Level string `json:"level"` + Stage string `json:"stage"` + Message string `json:"message"` +} + +// StageStep 单个阶段定义 +type StageStep struct { + Name string `json:"name"` + Type string `json:"type"` // checkout/build/test/image/deploy/verify + Status string `json:"status"` +} + +var logger *zap.Logger + +func init() { + logger, _ = zap.NewProduction() +} + +// executePipeline 后台执行流水线(goroutine)— V2 Redis 版 +func (h *PipelineHandler) executePipeline(pipeline models.Pipeline, run models.PipelineRun) { + runID := run.ID + ctx := context.Background() + logKey := fmt.Sprintf("pipeline:run:%d:logs", runID) + pubCh := fmt.Sprintf("pipeline:run:%d", runID) + + // 日志函数:同时写 Redis buffer + 发布 Pub/Sub + log := func(level, stage, msg string) { + entry := LogEntry{Time: time.Now().Format("15:04:05"), Level: level, Stage: stage, Message: msg} + data, _ := json.Marshal(entry) + + // 追加到 Redis 列表 + if h.cache != nil { + existing, _ := h.cache.Get(ctx, logKey) + var entries []LogEntry + if existing != "" { + json.Unmarshal([]byte(existing), &entries) + } + entries = append(entries, entry) + buf, _ := json.Marshal(entries) + h.cache.Set(ctx, logKey, string(buf), 30*time.Minute) + // Pub/Sub 实时推送 + h.cache.Publish(ctx, pubCh, string(data)) + } + } + + updateStatus := func(status string, duration int) { + now := time.Now() + updates := map[string]interface{}{"status": status} + if duration > 0 { + updates["duration"] = duration + } + if status == "success" || status == "failed" || status == "cancelled" { + updates["finished_at"] = &now + } + h.db.Model(&models.PipelineRun{}).Where("id = ?", runID).Updates(updates) + // 推送状态变更 + if h.cache != nil { + statusData, _ := json.Marshal(map[string]interface{}{"type": "status", "status": status, "duration": duration}) + h.cache.Publish(ctx, pubCh, string(statusData)) + } + } + + updatePipelineStats := func(status string) { + ups := map[string]interface{}{"last_status": status, "last_run_at": time.Now(), "run_count": pipeline.RunCount + 1} + if status == "success" { + ups["success_count"] = pipeline.SuccessCount + 1 + } + if status == "failed" { + ups["fail_count"] = pipeline.FailCount + 1 + } + h.db.Model(&models.Pipeline{}).Where("id = ?", pipeline.ID).Updates(ups) + } + + isCancelled := func() bool { + var current models.PipelineRun + h.db.First(¤t, runID) + return current.Status == "cancelled" + } + + // 解析阶段 + var stages []StageStep + if pipeline.Stages != "" { + json.Unmarshal([]byte(pipeline.Stages), &stages) + } + if len(stages) == 0 { + log("warn", "init", "没有配置阶段,流水线结束") + log("success", "完成", "流水线执行成功 (0s)") + updateStatus("success", 0) + updatePipelineStats("success") + h.flushLogsToDB(ctx, runID, logKey) + return + } + + // 工作目录 — 按仓库名+分支+时间戳命名,方便区分不同构建 + branch := run.Branch + if branch == "" { + branch = pipeline.Branch + } + gitURL := pipeline.Source + // 从 Git URL 提取仓库名 (e.g. https://gitee.com/attacker/demo-jar.git → demo-jar) + repoName := extractRepoName(gitURL) + if repoName == "" { + repoName = pipeline.Code + } + ts := time.Now() + tsDir := fmt.Sprintf("%d%02d%02d%02d%02d", ts.Year(), ts.Month(), ts.Day(), ts.Hour(), ts.Minute()) + workspace := fmt.Sprintf("/app/workspace/%s-%s", repoName, pipeline.Code) + + os.RemoveAll(workspace) + os.MkdirAll(workspace, 0755) + // 保存 workspace 路径到运行记录,方便终端查看 + h.db.Model(&models.PipelineRun{}).Where("id = ?", runID).Update("workspace_path", workspace) + + imageTag := fmt.Sprintf("%s-%s", repoName, tsDir) + + log("info", "init", fmt.Sprintf("触发方式: 手动 (admin)")) + log("info", "init", fmt.Sprintf("分支: %s | 镜像标签: %s", branch, imageTag)) + + totalStart := time.Now() + + for _, stage := range stages { + if isCancelled() { + log("warn", stage.Name, "流水线已被停止") + updateStatus("cancelled", int(time.Since(totalStart).Seconds())) + updatePipelineStats("cancelled") + h.flushLogsToDB(ctx, runID, logKey) + return + } + + log("info", stage.Name, fmt.Sprintf("===== 阶段: %s =====", stage.Name)) + stageStart := time.Now() + + var err error + switch stage.Type { + case "checkout": + err = h.runCheckout(gitURL, branch, workspace, log) + case "build": + err = h.runBuild(workspace, pipeline.Dockerfile, log) + case "test": + err = h.runTest(workspace, log) + case "image": + err = h.runDockerBuild(workspace, pipeline, imageTag, log) + case "deploy": + err = h.runDeploy(workspace, pipeline, imageTag, log) + case "verify": + err = h.runVerify(workspace, log) + default: + log("info", stage.Name, "跳过未知阶段类型: "+stage.Type) + } + + stageDur := time.Since(stageStart) + if err != nil { + log("error", stage.Name, fmt.Sprintf("✗ %s 失败 (%v): %v", stage.Name, stageDur.Round(time.Second), err)) + updateStatus("failed", int(time.Since(totalStart).Seconds())) + updatePipelineStats("failed") + h.flushLogsToDB(ctx, runID, logKey) + return + } + log("success", stage.Name, fmt.Sprintf("✓ %s 完成 (%v)", stage.Name, stageDur.Round(time.Second))) + } + + totalDur := int(time.Since(totalStart).Seconds()) + updateStatus("success", totalDur) + updatePipelineStats("success") + log("success", "完成", fmt.Sprintf("流水线执行成功 (%ds)", totalDur)) + + // 执行结束 → Redis 日志批量写入 MySQL + h.flushLogsToDB(ctx, runID, logKey) +} + +// flushLogsToDB Redis 日志批量写入 MySQL +func (h *PipelineHandler) flushLogsToDB(ctx context.Context, runID uint, logKey string) { + if h.cache == nil { + return + } + raw, err := h.cache.Get(ctx, logKey) + if err != nil || raw == "" { + return + } + var entries []LogEntry + if err := json.Unmarshal([]byte(raw), &entries); err != nil { + return + } + logsJSON, _ := json.Marshal(entries) + h.db.Model(&models.PipelineRun{}).Where("id = ?", runID).Update("logs", string(logsJSON)) + // 清理 Redis 缓存 + h.cache.Del(ctx, logKey) +} + +// runCheckout git clone +func (h *PipelineHandler) runCheckout(url, branch, workspace string, logFn func(string, string, string)) error { + if url == "" { + logFn("warn", "代码检出", "没有配置 Git URL,跳过代码检出") + return nil + } + logFn("info", "代码检出", "> Git 拉取 "+url+" (分支: "+branch+")") + + cmd := exec.Command("git", "clone", "--depth", "1", "-b", branch, url, workspace) + output, err := cmd.CombinedOutput() + // 流式输出到日志 + for _, line := range strings.Split(strings.TrimSpace(string(output)), "\n") { + if line != "" { + logFn("info", "代码检出", line) + } + } + if err != nil { + return fmt.Errorf("git clone 失败: %v", err) + } + hashCmd := exec.Command("git", "-C", workspace, "rev-parse", "--short", "HEAD") + hashOut, _ := hashCmd.Output() + logFn("success", "代码检出", fmt.Sprintf("已拉取 commit: %s", strings.TrimSpace(string(hashOut)))) + return nil +} + +// runBuild 构建(自动检测 Maven / npm / Go / Makefile) +func (h *PipelineHandler) runBuild(workspace, dockerfile string, logFn func(string, string, string)) error { + buildDir := workspace + if dockerfile != "" { + if dir := dotdot(dockerfile); dir != "." && dir != "" { + testDir := workspace + "/" + dir + if _, err := os.Stat(testDir); err == nil { + buildDir = testDir + logFn("info", "构建", ">>> 切换到构建目录: "+dir) + } + } + } + + // 如果根目录没找到构建文件,扫描一级子目录 + if !hasBuildFile(buildDir) { + type subMatch struct { + dir string + kind string // "maven", "npm", "go", "make" + } + var matches []subMatch + entries, err := os.ReadDir(buildDir) + if err == nil { + for _, e := range entries { + if !e.IsDir() || e.Name() == ".git" { + continue + } + sub := buildDir + "/" + e.Name() + if _, err := os.Stat(sub + "/pom.xml"); err == nil { + matches = append(matches, subMatch{sub, "maven"}) + } + if _, err := os.Stat(sub + "/package.json"); err == nil { + matches = append(matches, subMatch{sub, "npm"}) + } + if _, err := os.Stat(sub + "/go.mod"); err == nil { + matches = append(matches, subMatch{sub, "go"}) + } + if _, err := os.Stat(sub + "/Makefile"); err == nil { + matches = append(matches, subMatch{sub, "make"}) + } + } + } + if len(matches) > 0 { + // 有多个匹配时列出,优先选择第一个 + if len(matches) > 1 { + names := make([]string, len(matches)) + for i, m := range matches { + names[i] = fmt.Sprintf("%s(%s)", m.dir[len(buildDir)+1:], m.kind) + } + logFn("info", "构建", ">>> 发现多个构建目录: "+strings.Join(names, ", ")) + } + buildDir = matches[0].dir + logFn("info", "构建", ">>> 自动检测到构建目录: "+buildDir[len(workspace)+1:]) + } else { + logFn("info", "构建", "未检测到构建文件 (pom.xml/go.mod/package.json),跳过构建") + return nil + } + } + + if _, err := os.Stat(buildDir + "/pom.xml"); err == nil { + logFn("info", "构建", ">>> Maven 构建 (mvn clean package -DskipTests)") + logFn("info", "构建", "🔨 正在下载依赖并编译...") + cmd := exec.Command("mvn", "clean", "package", "-DskipTests") + cmd.Dir = buildDir + out, err := cmd.CombinedOutput() + for _, line := range strings.Split(strings.TrimSpace(string(out)), "\n") { + if line != "" { + logFn("info", "构建", line) + } + } + if err != nil { + return fmt.Errorf("Maven 构建失败: %v", err) + } + logFn("success", "构建", "Maven 构建成功 ✅") + return nil + } + + if _, err := os.Stat(buildDir + "/package.json"); err == nil { + logFn("info", "构建", ">>> npm 构建 (npm install && npm run build)") + logFn("info", "构建", "📦 正在安装依赖...") + installCmd := exec.Command("sh", "-c", "npm install --registry=https://registry.npmmirror.com --legacy-peer-deps 2>&1") + installCmd.Dir = buildDir + out, err := installCmd.CombinedOutput() + for _, line := range strings.Split(strings.TrimSpace(string(out)), "\n") { + if line != "" { + logFn("info", "构建", line) + } + } + if err != nil { + return fmt.Errorf("npm install 失败: %v", err) + } + logFn("info", "构建", "🏗️ 正在打包构建...") + buildCmd := exec.Command("sh", "-c", "npm run build 2>&1") + buildCmd.Dir = buildDir + out, err = buildCmd.CombinedOutput() + for _, line := range strings.Split(strings.TrimSpace(string(out)), "\n") { + if line != "" { + logFn("info", "构建", line) + } + } + if err != nil { + return fmt.Errorf("npm build 失败: %v", err) + } + logFn("success", "构建", "npm 构建成功 ✅") + return nil + } + + if _, err := os.Stat(buildDir + "/go.mod"); err == nil { + logFn("info", "构建", ">>> Go 构建 (go build ./...)") + cmd := exec.Command("go", "build", "./...") + cmd.Dir = buildDir + out, err := cmd.CombinedOutput() + for _, line := range strings.Split(strings.TrimSpace(string(out)), "\n") { + if line != "" { + logFn("info", "构建", line) + } + } + if err != nil { + return fmt.Errorf("Go 构建失败: %v", err) + } + logFn("success", "构建", "Go 构建成功") + return nil + } + + logFn("info", "构建", "未检测到构建文件 (pom.xml/go.mod/package.json),跳过构建") + return nil +} + +// hasBuildFile 检查目录是否包含可识别的构建文件 +func hasBuildFile(dir string) bool { + for _, f := range []string{"pom.xml", "package.json", "go.mod", "Makefile"} { + if _, err := os.Stat(dir + "/" + f); err == nil { + return true + } + } + return false +} + +// runTest 执行测试 +func (h *PipelineHandler) runTest(workspace string, logFn func(string, string, string)) error { + if _, err := os.Stat(workspace + "/pom.xml"); err == nil { + logFn("info", "测试", ">>> Maven 测试 (mvn test)") + cmd := exec.Command("mvn", "test") + cmd.Dir = workspace + out, _ := cmd.CombinedOutput() + for _, line := range strings.Split(strings.TrimSpace(string(out)), "\n") { + if line != "" { + logFn("info", "测试", line) + } + } + } + return nil +} + +// runDockerBuild Docker 构建 & 推送 +func (h *PipelineHandler) runDockerBuild(workspace string, pipeline models.Pipeline, tag string, logFn func(string, string, string)) error { + dockerfile := pipeline.Dockerfile + if dockerfile == "" { + dockerfile = "Dockerfile" + } + + var registryURL, imageName string + if pipeline.RegistryID != nil { + var reg models.PipelineRegistry + if err := h.db.First(®, *pipeline.RegistryID).Error; err == nil { + registryURL = reg.RegistryURL + if reg.Namespace != "" { + imageName = reg.Namespace + "/" + pipeline.Code + } + } + } + if imageName == "" { + imageName = pipeline.Code + } + if registryURL == "" { + registryURL = "registry.example.com" + } + + fullImage := fmt.Sprintf("%s/%s:%s", registryURL, imageName, tag) + logFn("info", "镜像打包", fmt.Sprintf("镜像地址: %s", fullImage)) + + buildDir := workspace + if dir := dotdot(dockerfile); dir != "." && dir != "" { + buildDir = workspace + "/" + dir + } + dfPath := dockerfile + if strings.Contains(dockerfile, "/") { + dfPath = dockerfile[strings.LastIndex(dockerfile, "/")+1:] + } + + logFn("info", "镜像打包", fmt.Sprintf(">>> Docker 构建 (dockerfile: %s)", dfPath)) + cmd := exec.Command("docker", "build", "-t", fullImage, "-f", dfPath, ".") + cmd.Dir = buildDir + out, err := cmd.CombinedOutput() + for _, line := range strings.Split(strings.TrimSpace(string(out)), "\n") { + if line != "" { + logFn("info", "镜像打包", line) + } + } + if err != nil { + return fmt.Errorf("Docker 构建失败: %v", err) + } + logFn("success", "镜像打包", "Docker 构建成功") + + logFn("info", "镜像打包", ">>> 推送镜像: "+fullImage) + pushCmd := exec.Command("docker", "push", fullImage) + pushOut, err := pushCmd.CombinedOutput() + for _, line := range strings.Split(strings.TrimSpace(string(pushOut)), "\n") { + if line != "" { + logFn("info", "镜像打包", line) + } + } + if err != nil { + return fmt.Errorf("Docker 推送失败: %v", err) + } + logFn("success", "镜像打包", "镜像推送完成") + return nil +} + +// runDeploy 部署到 K8s / 服务器 +func (h *PipelineHandler) runDeploy(workspace string, pipeline models.Pipeline, tag string, logFn func(string, string, string)) error { + deployYamls := findFiles(workspace, ".yaml", ".yml") + var k8sFiles []string + for _, f := range deployYamls { + content, _ := os.ReadFile(f) + if strings.Contains(string(content), "kind:") && + (strings.Contains(string(content), "Deployment") || + strings.Contains(string(content), "Service") || + strings.Contains(string(content), "StatefulSet")) { + k8sFiles = append(k8sFiles, f) + } + } + + if len(k8sFiles) == 0 { + logFn("info", "部署", "未找到 K8s 部署文件,跳过部署") + return nil + } + + for _, yamlFile := range k8sFiles { + logFn("info", "部署", ">>> kubectl apply -f "+yamlFile) + cmd := exec.Command("kubectl", "apply", "-f", yamlFile) + out, err := cmd.CombinedOutput() + for _, line := range strings.Split(strings.TrimSpace(string(out)), "\n") { + if line != "" { + logFn("info", "部署", line) + } + } + if err != nil { + logFn("error", "部署", fmt.Sprintf("kubectl apply 失败: %v", err)) + return fmt.Errorf("kubectl apply 失败") + } + } + logFn("success", "部署", "部署完成") + return nil +} + +// runVerify 部署后验证 +func (h *PipelineHandler) runVerify(workspace string, logFn func(string, string, string)) error { + logFn("info", "验证", ">>> 部署后健康检查") + cmd := exec.Command("kubectl", "get", "pods", "-o", "wide") + cmd.Dir = workspace + out, err := cmd.CombinedOutput() + if err != nil { + logFn("warn", "验证", fmt.Sprintf("kubectl get pods 失败: %v", err)) + } + for _, line := range strings.Split(strings.TrimSpace(string(out)), "\n") { + if line != "" { + logFn("info", "验证", line) + } + } + return nil +} + +// ======== helpers ======== + +func dotdot(path string) string { + i := strings.LastIndex(path, "/") + if i < 0 { + return "." + } + return path[:i] +} + +// extractRepoName 从 Git URL 提取仓库名 +// e.g. https://gitee.com/attacker/demo-jar.git → demo-jar +func extractRepoName(url string) string { + // Remove trailing .git + clean := strings.TrimSuffix(url, ".git") + // Get last path segment + idx := strings.LastIndex(clean, "/") + if idx < 0 { + return "" + } + return clean[idx+1:] +} + +// cleanOldWorkspaces 清理超过 maxAge 的 workspace 目录 +func cleanOldWorkspaces(baseDir string, maxAge time.Duration) { + entries, err := os.ReadDir(baseDir) + if err != nil { + return + } + now := time.Now() + for _, e := range entries { + if !e.IsDir() { + continue + } + info, err := e.Info() + if err != nil { + continue + } + if now.Sub(info.ModTime()) > maxAge { + os.RemoveAll(baseDir + "/" + e.Name()) + } + } +} + +func findFiles(dir string, exts ...string) []string { + var result []string + entries, err := os.ReadDir(dir) + if err != nil { + return result + } + for _, e := range entries { + full := dir + "/" + e.Name() + if e.IsDir() { + if e.Name() != ".git" { + result = append(result, findFiles(full, exts...)...) + } + } else { + for _, ext := range exts { + if strings.HasSuffix(e.Name(), ext) { + result = append(result, full) + break + } + } + } + } + return result +} diff --git a/backend/internal/api/handlers/server_batch.go b/backend/internal/api/handlers/server_batch.go index 499fe16..5ae3ced 100644 --- a/backend/internal/api/handlers/server_batch.go +++ b/backend/internal/api/handlers/server_batch.go @@ -43,7 +43,7 @@ func (h *ServerHandler) BatchCreateServers(c *gin.Context) { c.JSON(http.StatusInternalServerError, models.Response{Code: 500, Message: "凭据解密失败"}) return } - if cred.Type == "ssh_key" { + if cred.SecretType == "ssh" { decryptedKey = plain authType = "key" } else { diff --git a/backend/internal/api/handlers/workspace_files.go b/backend/internal/api/handlers/workspace_files.go new file mode 100644 index 0000000..d4d2eaa --- /dev/null +++ b/backend/internal/api/handlers/workspace_files.go @@ -0,0 +1,184 @@ +package handlers + +import ( + "fmt" + "io" + "net/http" + "os" + "path/filepath" + "strconv" + "strings" + + "github.com/gin-gonic/gin" + "gorm.io/gorm" + + "ezops/internal/models" +) + +// WorkspaceFilesHandler 工作区文件浏览器处理器 +type WorkspaceFilesHandler struct { + db *gorm.DB +} + +func NewWorkspaceFilesHandler(db *gorm.DB) *WorkspaceFilesHandler { + return &WorkspaceFilesHandler{db: db} +} + +// FileInfo 文件信息 +type FileInfo struct { + Name string `json:"name"` + Path string `json:"path"` + IsDir bool `json:"is_dir"` + Size int64 `json:"size"` + ModTime string `json:"mod_time"` +} + +// resolveWorkspace 解析 run ID 获取 workspace 路径 +func (h *WorkspaceFilesHandler) resolveWorkspace(c *gin.Context) (string, error) { + runID, err := strconv.Atoi(c.Param("runId")) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": "invalid run id"}) + return "", err + } + + var run models.PipelineRun + if err := h.db.First(&run, runID).Error; err != nil { + c.JSON(http.StatusNotFound, gin.H{"error": "run not found"}) + return "", err + } + + if run.WorkspacePath == "" { + c.JSON(http.StatusNotFound, gin.H{"error": "workspace path not available, pipeline may still be running"}) + return "", fmt.Errorf("no workspace") + } + + return run.WorkspacePath, nil +} + +// safePath 安全拼接路径,防止目录穿越 +func safePath(base, sub string) (string, error) { + if sub == "" || sub == "." { + sub = "/" + } + // 清理路径 + clean := filepath.Clean(sub) + if filepath.IsAbs(clean) { + // 去掉根前缀,转为相对路径 + clean = clean[1:] + } + fullPath := filepath.Join(base, clean) + // 确保不逃逸出 base + absBase, _ := filepath.Abs(base) + absFull, err := filepath.Abs(fullPath) + if err != nil { + return "", fmt.Errorf("invalid path") + } + if !strings.HasPrefix(absFull, absBase) { + return "", fmt.Errorf("path traversal detected") + } + return fullPath, nil +} + +// ListFiles 列出目录内容 +// GET /api/v1/pipelines/runs/:runId/files?path=subdir +func (h *WorkspaceFilesHandler) ListFiles(c *gin.Context) { + workspace, err := h.resolveWorkspace(c) + if err != nil { + return + } + + subPath := c.Query("path") + targetPath, err := safePath(workspace, subPath) + if err != nil { + c.JSON(http.StatusForbidden, gin.H{"error": err.Error()}) + return + } + + entries, err := os.ReadDir(targetPath) + if err != nil { + if os.IsNotExist(err) { + c.JSON(http.StatusNotFound, gin.H{"error": "directory not found"}) + } else { + c.JSON(http.StatusInternalServerError, gin.H{"error": "failed to read directory"}) + } + return + } + + files := make([]FileInfo, 0) + dirs := make([]FileInfo, 0) + + for _, entry := range entries { + info, err := entry.Info() + if err != nil { + continue + } + rel, _ := filepath.Rel(workspace, filepath.Join(targetPath, entry.Name())) + fi := FileInfo{ + Name: entry.Name(), + Path: rel, + IsDir: entry.IsDir(), + Size: info.Size(), + ModTime: info.ModTime().Format("2006-01-02 15:04:05"), + } + if entry.IsDir() { + dirs = append(dirs, fi) + } else { + files = append(files, fi) + } + } + + // 当前路径(相对于 workspace) + currentRel, _ := filepath.Rel(workspace, targetPath) + if currentRel == "." { + currentRel = "" + } + + c.JSON(http.StatusOK, gin.H{ + "current": currentRel, + "dirs": dirs, + "files": files, + }) +} + +// DownloadFile 下载文件 +// GET /api/v1/pipelines/runs/:runId/files/download?path=file +func (h *WorkspaceFilesHandler) DownloadFile(c *gin.Context) { + workspace, err := h.resolveWorkspace(c) + if err != nil { + return + } + + subPath := c.Query("path") + if subPath == "" { + c.JSON(http.StatusBadRequest, gin.H{"error": "path is required"}) + return + } + + targetPath, err := safePath(workspace, subPath) + if err != nil { + c.JSON(http.StatusForbidden, gin.H{"error": err.Error()}) + return + } + + info, err := os.Stat(targetPath) + if err != nil { + c.JSON(http.StatusNotFound, gin.H{"error": "file not found"}) + return + } + if info.IsDir() { + c.JSON(http.StatusBadRequest, gin.H{"error": "cannot download a directory"}) + return + } + + file, err := os.Open(targetPath) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": "failed to open file"}) + return + } + defer file.Close() + + c.Header("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", filepath.Base(targetPath))) + c.Header("Content-Type", "application/octet-stream") + c.Header("Content-Length", fmt.Sprintf("%d", info.Size())) + io.Copy(c.Writer, file) +} diff --git a/backend/internal/api/handlers/ws_pipeline_log.go b/backend/internal/api/handlers/ws_pipeline_log.go new file mode 100644 index 0000000..5ff1be2 --- /dev/null +++ b/backend/internal/api/handlers/ws_pipeline_log.go @@ -0,0 +1,142 @@ +package handlers + +import ( + "encoding/json" + "fmt" + "net/http" + "strconv" + "strings" + "time" + + ezredis "ezops/pkg/redis" + + "github.com/gin-gonic/gin" + "github.com/gorilla/websocket" + "gorm.io/gorm" +) + +var wsUpgrader = websocket.Upgrader{ + CheckOrigin: func(r *http.Request) bool { return true }, +} + +// WSPipelineLogHandler WebSocket 流水线日志推流 +type WSPipelineLogHandler struct { + db *gorm.DB + cache ezredis.Cache +} + +// NewWSPipelineLogHandler 创建 WebSocket 日志处理器 +func NewWSPipelineLogHandler(db *gorm.DB, cache ezredis.Cache) *WSPipelineLogHandler { + return &WSPipelineLogHandler{db: db, cache: cache} +} + +// StreamLog WebSocket 端点:/ws/pipeline/:runId/log +func (h *WSPipelineLogHandler) StreamLog(c *gin.Context) { + runIDStr := c.Param("runId") + runID, err := strconv.ParseUint(runIDStr, 10, 32) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": "无效的 runId"}) + return + } + + ws, err := wsUpgrader.Upgrade(c.Writer, c.Request, nil) + if err != nil { + return + } + defer ws.Close() + + logKey := fmt.Sprintf("pipeline:run:%d:logs", uint(runID)) + ctx := c.Request.Context() + + // 首次发送:已有日志 + raw, _ := h.cache.Get(ctx, logKey) + if raw != "" { + ws.WriteJSON(map[string]interface{}{"type": "init", "logs": raw}) + } + + // 轮询新日志(500ms 间隔) + lastLen := 0 + ticker := time.NewTicker(500 * time.Millisecond) + defer ticker.Stop() + + done := make(chan struct{}) + go func() { + defer close(done) + for { + _, _, err := ws.ReadMessage() + if err != nil { + return + } + } + }() + + for { + select { + case <-done: + return + case <-ticker.C: + raw, err := h.cache.Get(ctx, logKey) + if err != nil || raw == "" { + continue + } + var entries []LogEntry + if err := json.Unmarshal([]byte(raw), &entries); err != nil { + continue + } + if len(entries) > lastLen { + // 增量推送 + newEntries := entries[lastLen:] + lastLen = len(entries) + for _, e := range newEntries { + buf, _ := json.Marshal(e) + if err := ws.WriteMessage(websocket.TextMessage, buf); err != nil { + return + } + } + } + + // 检查流水线是否已结束(日志 key 被删除 = 已写入 DB) + if lastLen > 0 { + exists, _ := h.cache.Exists(ctx, logKey) + if exists == 0 { + // 发送完成信号 + ws.WriteJSON(map[string]interface{}{"type": "done"}) + return + } + } + case <-ctx.Done(): + return + } + } +} + +// GetLogHistory HTTP 日志历史(已完成的任务从 DB 读取) +func (h *WSPipelineLogHandler) GetLogHistory(c *gin.Context) { + runIDStr := c.Param("runId") + runID, err := strconv.ParseUint(runIDStr, 10, 32) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": "无效的 runId"}) + return + } + + // 先查 Redis(执行中) + logKey := fmt.Sprintf("pipeline:run:%d:logs", uint(runID)) + ctx := c.Request.Context() + + raw, _ := h.cache.Get(ctx, logKey) + if raw != "" && !strings.HasPrefix(raw, "[") { + raw = "[]" + } + if raw != "" { + c.JSON(http.StatusOK, gin.H{"code": 200, "data": gin.H{"source": "redis", "logs": raw}}) + return + } + + // 查 DB(已完成) + var logs string + h.db.Table("ops_pipeline_runs").Where("id = ?", uint(runID)).Select("logs").Scan(&logs) + if logs == "" { + logs = "[]" + } + c.JSON(http.StatusOK, gin.H{"code": 200, "data": gin.H{"source": "db", "logs": logs}}) +} diff --git a/backend/internal/api/middleware/pipeline_access.go b/backend/internal/api/middleware/pipeline_access.go new file mode 100644 index 0000000..9ef768b --- /dev/null +++ b/backend/internal/api/middleware/pipeline_access.go @@ -0,0 +1,139 @@ +package middleware + +import ( + "net/http" + "regexp" + + "ezops/internal/models" + + "github.com/gin-gonic/gin" + "gorm.io/gorm" +) + +// PipelineAccess 流水线权限中间件 +// 路由参数 :code(流水线编码)→ 查找 pipeline → 注入 pipelineID 到 context +// 权限检查顺序:管理员 → 直接成员 → 用户组 → Item Role (regex) +func PipelineAccess(db *gorm.DB) gin.HandlerFunc { + return func(c *gin.Context) { + // 1) 解析 code → 查找流水线(所有用户都需要) + code := c.Param("code") + if code == "" { + c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"code": 400, "message": "缺少流水线编码"}) + return + } + + var pipeline models.Pipeline + if err := db.Where("code = ?", code).First(&pipeline).Error; err != nil { + c.AbortWithStatusJSON(http.StatusNotFound, gin.H{"code": 404, "message": "流水线不存在"}) + return + } + + // 注入 context,后续 handlers 统一从这里读 + c.Set("pipelineID", pipeline.ID) + c.Set("pipelineCode", code) + + // 2) 管理员直接放行(跳过权限检查) + if isAdmin, _ := c.Get("isAdmin"); isAdmin == true { + c.Next() + return + } + + username, _ := c.Get("username") + usernameStr, _ := username.(string) + if usernameStr == "" { + c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"code": 401, "message": "未认证"}) + return + } + + pipelineID := pipeline.ID + + // 3) 检查是否直接是流水线成员 + var directCount int64 + db.Model(&models.DeployPipelineMember{}). + Where("pipeline_id = ? AND username = ?", pipelineID, usernameStr). + Count(&directCount) + if directCount > 0 { + c.Next() + return + } + + // 4) 检查是否属于授权给该流水线的用户组 + var groupCount int64 + db.Table("deploy_pipeline_members"). + Joins("JOIN deploy_user_group_members ON deploy_user_group_members.group_id = deploy_pipeline_members.group_id"). + Where("deploy_pipeline_members.pipeline_id = ? AND deploy_user_group_members.username = ?", pipelineID, usernameStr). + Count(&groupCount) + if groupCount > 0 { + c.Next() + return + } + + // 5) Jenkins-style Item Role — regex pattern matching on pipeline code + var itemRoles []models.ItemRole + db.Table("iam_item_roles"). + Joins("JOIN iam_user_item_roles ON iam_user_item_roles.item_role_id = iam_item_roles.id"). + Where("iam_item_roles.status = 1 AND iam_user_item_roles.user_id = ?", + func() uint { uid, _ := c.Get("userID"); return uid.(uint) }()). + Find(&itemRoles) + for _, ir := range itemRoles { + if matched, _ := regexp.MatchString(ir.Pattern, code); matched { + c.Next() + return + } + } + + c.AbortWithStatusJSON(http.StatusForbidden, gin.H{ + "code": 403, + "message": "无权访问此流水线,请联系流水线 Owner 添加你为成员", + }) + } +} + +// GetAccessiblePipelineIDs 获取当前用户有权访问的流水线 ID 列表 +// 包括:直接成员 + 用户组 + Item Role (regex) +func GetAccessiblePipelineIDs(db *gorm.DB, username string, userID uint) ([]uint, bool) { + var directIDs []uint + db.Model(&models.DeployPipelineMember{}). + Where("username = ?", username). + Pluck("pipeline_id", &directIDs) + + var groupIDs []uint + db.Model(&models.DeployPipelineMember{}). + Joins("JOIN deploy_user_group_members ON deploy_user_group_members.group_id = deploy_pipeline_members.group_id"). + Where("deploy_user_group_members.username = ?", username). + Pluck("deploy_pipeline_members.pipeline_id", &groupIDs) + + idSet := make(map[uint]bool) + for _, id := range directIDs { + idSet[id] = true + } + for _, id := range groupIDs { + idSet[id] = true + } + + // Item Role regex matching: get all item roles for user, match against pipeline codes + var itemRoles []models.ItemRole + db.Table("iam_item_roles"). + Joins("JOIN iam_user_item_roles ON iam_user_item_roles.item_role_id = iam_item_roles.id"). + Where("iam_item_roles.status = 1 AND iam_user_item_roles.user_id = ?", userID). + Find(&itemRoles) + if len(itemRoles) > 0 { + var allPipelines []models.Pipeline + db.Find(&allPipelines) + for _, p := range allPipelines { + for _, ir := range itemRoles { + if matched, _ := regexp.MatchString(ir.Pattern, p.Code); matched { + idSet[p.ID] = true + break + } + } + } + } + + ids := make([]uint, 0, len(idSet)) + for id := range idSet { + ids = append(ids, id) + } + + return ids, len(ids) > 0 +} diff --git a/backend/internal/api/routes/routes.go b/backend/internal/api/routes/routes.go index 0407cc2..50bf0a6 100644 --- a/backend/internal/api/routes/routes.go +++ b/backend/internal/api/routes/routes.go @@ -16,6 +16,9 @@ import ( // Register 注册所有路由 // Logan.Li // cache 参数为可选 Redis 缓存实例(支持 redka/redis 双后端) func Register(r *gin.Engine, db *gorm.DB, log *zap.Logger, cfg *config.Config, cache interface{}) { + // 提取 Redis 缓存实例(供流水线 WebSocket 等使用) + redisCache, _ := cache.(ezredis.Cache) + // API版本前缀 api := r.Group("/api/v1") @@ -64,6 +67,16 @@ func Register(r *gin.Engine, db *gorm.DB, log *zap.Logger, cfg *config.Config, c metricsWSHandler := handlers.NewMetricsWSHandler(metricsHub) r.GET("/ws/metrics", middleware.JWTAuth(&cfg.JWT), metricsWSHandler.ServeWS) + // WebSocket 流水线日志推流 + wsLogHandler := handlers.NewWSPipelineLogHandler(db, redisCache) + r.GET("/ws/pipeline/:runId/log", wsLogHandler.StreamLog) + r.GET("/api/v1/pipelines/runs/:runId/log-stream", wsLogHandler.GetLogHistory) + + // 工作区文件浏览器(浏览/下载流水线构建目录文件) + workspaceFilesHandler := handlers.NewWorkspaceFilesHandler(db) + r.GET("/api/v1/pipelines/runs/:runId/files", workspaceFilesHandler.ListFiles) + r.GET("/api/v1/pipelines/runs/:runId/files/download", workspaceFilesHandler.DownloadFile) + // WebSocket K8s exec 交互终端 // Logan.Li k8sHandler := handlers.NewKubernetesHandler(db) r.GET("/ws/kubernetes-exec/:id/namespaces/:namespace/pods/:podName", middleware.JWTAuth(&cfg.JWT), k8sHandler.ExecTerminal) @@ -77,6 +90,14 @@ func Register(r *gin.Engine, db *gorm.DB, log *zap.Logger, cfg *config.Config, c api.POST("/auth/login", authHandler.Login) api.POST("/auth/register", authHandler.Register) + // Webhook 触发路由(无需 JWT,由 Webhook Token 签名验证) + pipelineHandler := handlers.NewPipelineHandler(db, redisCache) + webhookGroup := api.Group("/webhook") + { + webhookGroup.POST("/job/:jobName", pipelineHandler.WebhookTrigger) + webhookGroup.POST("/pipeline/:code", pipelineHandler.WebhookTrigger) + } + // Agent 安装处理器(在 servers 和 agent 路由中共享) agentInstallHandler := handlers.NewAgentInstallHandler(db) @@ -113,6 +134,16 @@ func Register(r *gin.Engine, db *gorm.DB, log *zap.Logger, cfg *config.Config, c // 权限列表(供角色权限选择) admin.GET("/permissions", authHandler.ListPermissions) + + // Item Role 管理(Jenkins-style regex pipeline matching) // Logan.Li + itemRoleHandler := handlers.NewItemRoleHandler(db) + admin.GET("/item-roles", itemRoleHandler.ListItemRoles) + admin.POST("/item-roles", itemRoleHandler.CreateItemRole) + admin.PUT("/item-roles/:id", itemRoleHandler.UpdateItemRole) + admin.DELETE("/item-roles/:id", itemRoleHandler.DeleteItemRole) + admin.GET("/users/:id/item-roles", itemRoleHandler.ListUserItemRoles) + admin.POST("/users/:id/item-roles", itemRoleHandler.AssignItemRole) + admin.DELETE("/users/:id/item-roles/:roleId", itemRoleHandler.RemoveItemRole) } // LDAP 配置路由 @@ -371,16 +402,51 @@ func Register(r *gin.Engine, db *gorm.DB, log *zap.Logger, cfg *config.Config, c } // 流水线路由 - pipelineHandler := handlers.NewPipelineHandler(db) pipelines := authorized.Group("/pipelines") { pipelines.GET("", pipelineHandler.ListPipelines) pipelines.POST("", pipelineHandler.CreatePipeline) - pipelines.GET("/:id", pipelineHandler.GetPipeline) - pipelines.PUT("/:id", pipelineHandler.UpdatePipeline) - pipelines.DELETE("/:id", pipelineHandler.DeletePipeline) - pipelines.POST("/:id/trigger", pipelineHandler.TriggerPipeline) - pipelines.GET("/:id/runs", pipelineHandler.ListRuns) + + // 需要流水线权限的路由 + pipelineScoped := pipelines.Group("/:code") + pipelineScoped.Use(middleware.PipelineAccess(db)) + { + pipelineScoped.GET("", pipelineHandler.GetPipeline) + pipelineScoped.PUT("", pipelineHandler.UpdatePipeline) + pipelineScoped.DELETE("", pipelineHandler.DeletePipeline) + pipelineScoped.POST("/trigger", pipelineHandler.TriggerPipeline) + pipelineScoped.GET("/runs", pipelineHandler.ListRuns) + pipelineScoped.POST("/runs/:runId/stop", pipelineHandler.StopPipelineRun) + pipelineScoped.POST("/runs/batch-delete", pipelineHandler.BatchDeleteRuns) + pipelineScoped.GET("/runs/:runId/log", pipelineHandler.GetRunLog) + // 成员管理 + pipelineScoped.GET("/members", pipelineHandler.ListPipelineMembers) + pipelineScoped.POST("/members", pipelineHandler.AddPipelineMember) + pipelineScoped.DELETE("/members/:memberId", pipelineHandler.RemovePipelineMember) + // 组授权 + pipelineScoped.POST("/groups", pipelineHandler.AssignGroupToPipeline) + } + } + + // 用户组管理路由 + groups := authorized.Group("/deploy/groups") + { + groups.GET("", pipelineHandler.ListGroups) + groups.POST("", pipelineHandler.CreateGroup) + groups.PUT("/:id", pipelineHandler.UpdateGroup) + groups.DELETE("/:id", pipelineHandler.DeleteGroup) + groups.GET("/:id/members", pipelineHandler.ListGroupMembers) + groups.POST("/:id/members", pipelineHandler.AddGroupMember) + groups.DELETE("/:id/members/:memberId", pipelineHandler.RemoveGroupMember) + } + + // 环境管理路由 + environments := authorized.Group("/deploy/environments") + { + environments.GET("", pipelineHandler.ListEnvironments) + environments.POST("", pipelineHandler.CreateEnvironment) + environments.PUT("/:id", pipelineHandler.UpdateEnvironment) + environments.DELETE("/:id", pipelineHandler.DeleteEnvironment) } // 应用发布路由 @@ -394,6 +460,24 @@ func Register(r *gin.Engine, db *gorm.DB, log *zap.Logger, cfg *config.Config, c releases.POST("/:id/rollback", pipelineHandler.RollbackRelease) } + // 仓库认证 & 镜像仓库认证路由 + deployHandler := handlers.NewDeployHandler(db) + { + repos := authorized.Group("/deploy/repos") + repos.GET("", deployHandler.ListRepos) + repos.POST("", deployHandler.CreateRepo) + repos.GET("/:id", deployHandler.GetRepo) + repos.PUT("/:id", deployHandler.UpdateRepo) + repos.DELETE("/:id", deployHandler.DeleteRepo) + + registries := authorized.Group("/deploy/registries") + registries.GET("", deployHandler.ListRegistries) + registries.POST("", deployHandler.CreateRegistry) + registries.GET("/:id", deployHandler.GetRegistry) + registries.PUT("/:id", deployHandler.UpdateRegistry) + registries.DELETE("/:id", deployHandler.DeleteRegistry) + } + // 自动化运维路由 automationHandler := handlers.NewAutomationHandler(db) cronJobs := authorized.Group("/cron-jobs") @@ -515,7 +599,6 @@ func Register(r *gin.Engine, db *gorm.DB, log *zap.Logger, cfg *config.Config, c } // Agent 上报路由(无需 JWT) - redisCache, _ := cache.(ezredis.Cache) agentHandler := handlers.NewAgentHandler(db, redisCache, metricsHub) taskHandler := handlers.NewAgentTaskHandler(db) agentGroup := api.Group("/agent") @@ -645,8 +728,11 @@ func Register(r *gin.Engine, db *gorm.DB, log *zap.Logger, cfg *config.Config, c credGroup := authorized.Group("/credentials") { credGroup.GET("", credentialHandler.ListCredentials) + credGroup.GET("/tags", credentialHandler.GetTags) credGroup.POST("", credentialHandler.CreateCredential) + credGroup.GET("/:id", credentialHandler.GetCredential) credGroup.PUT("/:id", credentialHandler.UpdateCredential) + credGroup.PATCH("/:id", credentialHandler.PatchCredential) credGroup.DELETE("/:id", credentialHandler.DeleteCredential) } // 服务器凭据关联 // Logan.Li diff --git a/backend/internal/models/alert.go b/backend/internal/models/alert.go index 5c4d4ef..0e15d09 100644 --- a/backend/internal/models/alert.go +++ b/backend/internal/models/alert.go @@ -3,59 +3,321 @@ package models import ( "time" + "gorm.io/gorm" ) -// AlertRule 告警规则模型 +// ============================================ +// AlertRule 告警规则(增强版 — 合并原V2特性) +// ============================================ + +// AlertRuleStatus 告警规则状态 +type AlertRuleStatus string + +const ( + AlertRuleEnabled AlertRuleStatus = "enabled" + AlertRuleDisabled AlertRuleStatus = "disabled" +) + +// AlertSeverity 告警级别 +type AlertSeverity string + +const ( + AlertSeverityCritical AlertSeverity = "critical" + AlertSeverityWarning AlertSeverity = "warning" + AlertSeverityNotice AlertSeverity = "notice" + AlertSeverityInfo AlertSeverity = "info" +) + +// AggFunction 聚合函数 +type AggFunction string + +const ( + AggFunctionAvg AggFunction = "avg" + AggFunctionMin AggFunction = "min" + AggFunctionMax AggFunction = "max" + AggFunctionSum AggFunction = "sum" + AggFunctionCount AggFunction = "count" + AggFunctionLast AggFunction = "last" + AggFunctionP95 AggFunction = "p95" + AggFunctionP99 AggFunction = "p99" +) + +// Operator 比较运算符 +type Operator string + +const ( + OperatorGT Operator = ">" + OperatorGTE Operator = ">=" + OperatorLT Operator = "<" + OperatorLTE Operator = "<=" + OperatorEQ Operator = "==" + OperatorNE Operator = "!=" +) + +// AlertRule 告警规则(增强版) type AlertRule struct { - ID uint `gorm:"primarykey" json:"id"` - Name string `gorm:"size:128;not null" json:"name"` - Description string `gorm:"size:500" json:"description"` - Type string `gorm:"size:32;not null" json:"type"` // metric, log, event - Source string `gorm:"size:64;not null" json:"source"` // prometheus, zabbix, custom - Expression string `gorm:"type:text;not null" json:"expression"` - Severity string `gorm:"size:32;default:warning" json:"severity"` // info, warning, critical - Duration int `json:"duration"` // 持续时间(秒) - Enabled bool `gorm:"default:true" json:"enabled"` - Labels string `gorm:"type:text" json:"labels"` // JSON - Annotations string `gorm:"type:text" json:"annotations"` // JSON - NotifyChannels string `gorm:"type:text" json:"notify_channels"` // JSON - CreatedAt time.Time `json:"created_at"` - UpdatedAt time.Time `json:"updated_at"` + ID uint `gorm:"primaryKey;autoIncrement;comment:主键ID" json:"id"` + Name string `gorm:"type:varchar(128);not null;comment:规则名称" json:"name"` + Description string `gorm:"type:varchar(500);comment:规则描述" json:"description,omitempty"` + // ====== 原 V1 兼容字段 ====== + Type string `gorm:"type:varchar(32);comment:规则类型: metric/log/event" json:"type,omitempty"` + Source string `gorm:"type:varchar(64);comment:数据源: prometheus/zabbix/custom" json:"source,omitempty"` + Expression string `gorm:"type:text;comment:PromQL/Zabbix表达式" json:"expression,omitempty"` + Severity string `gorm:"type:varchar(32);default:'warning';comment:告警级别" json:"severity"` + Duration int `gorm:"comment:持续时间(秒)" json:"duration,omitempty"` + Enabled bool `gorm:"default:true;comment:是否启用" json:"enabled"` + // ====== V2 增强字段 ====== + Status AlertRuleStatus `gorm:"type:varchar(16);default:'enabled';comment:规则状态" json:"status,omitempty"` + TargetType string `gorm:"type:varchar(32);comment:目标类型" json:"target_type,omitempty"` + TargetID uint `gorm:"index;comment:目标ID(0表示全部)" json:"target_id,omitempty"` + TargetTags string `gorm:"type:varchar(256);comment:目标标签筛选" json:"target_tags,omitempty"` + Conditions string `gorm:"type:text;comment:触发条件JSON数组" json:"conditions,omitempty"` + AggWindow int `gorm:"default:300;comment:聚合窗口(秒)" json:"agg_window,omitempty"` + AggFunction string `gorm:"type:varchar(16);default:'avg';comment:聚合函数" json:"agg_function,omitempty"` + RecoverCount int `gorm:"default:1;comment:恢复次数" json:"recover_count,omitempty"` + RecoverWindow int `gorm:"default:300;comment:恢复检查窗口(秒)" json:"recover_window,omitempty"` + Interval int `gorm:"default:60;comment:评估间隔(秒)" json:"interval,omitempty"` + CheckTimes int `gorm:"default:1;comment:连续触发次数" json:"check_times,omitempty"` + NotifyMode string `gorm:"type:varchar(16);default:'every';comment:通知模式: every/once/upgrade" json:"notify_mode,omitempty"` + ChannelIDs string `gorm:"type:varchar(256);comment:通知渠道ID列表JSON" json:"channel_ids,omitempty"` + NotifyChannels string `gorm:"type:text;comment:通知渠道JSON(兼容V1)" json:"notify_channels,omitempty"` + TemplateID uint `gorm:"comment:通知模板ID" json:"template_id,omitempty"` + UpgradeID uint `gorm:"comment:升级策略ID" json:"upgrade_id,omitempty"` + SilenceID uint `gorm:"comment:静默规则ID" json:"silence_id,omitempty"` + Labels string `gorm:"type:text;comment:标签JSON" json:"labels,omitempty"` + Annotations string `gorm:"type:text;comment:注释JSON" json:"annotations,omitempty"` + CreatedBy uint `gorm:"index;comment:创建人ID" json:"created_by,omitempty"` + CreatedAt time.Time `gorm:"not null;comment:创建时间" json:"created_at"` + UpdatedAt time.Time `gorm:"not null;comment:更新时间" json:"updated_at"` + DeletedAt gorm.DeletedAt `gorm:"index;comment:删除时间" json:"deleted_at,omitempty"` } -// TableName 表名 func (AlertRule) TableName() string { return "monitor_alert_rules" } -// AlertEvent 告警事件模型 +// ============================================ +// AlertEvent 告警事件(增强版 — 合并原V2特性) +// ============================================ + +// AlertEventStatus 告警事件状态 +type AlertEventStatus string + +const ( + AlertEventFiring AlertEventStatus = "firing" + AlertEventResolved AlertEventStatus = "resolved" + AlertEventSilenced AlertEventStatus = "silenced" +) + +// AlertEvent 告警事件(增强版) type AlertEvent struct { - ID uint `gorm:"primarykey" json:"id"` - RuleID uint `json:"rule_id"` - RuleName string `gorm:"size:128" json:"rule_name"` - Severity string `gorm:"size:32" json:"severity"` - Status string `gorm:"size:32;default:firing" json:"status"` // firing, resolved - Target string `gorm:"size:255" json:"target"` - Message string `gorm:"type:text" json:"message"` - Value float64 `json:"value"` - Labels string `gorm:"type:text" json:"labels"` - StartedAt time.Time `json:"started_at"` - ResolvedAt *time.Time `json:"resolved_at"` - Acknowledged bool `json:"acknowledged"` - AcknowledgedBy *uint `json:"acknowledged_by"` - AcknowledgedAt *time.Time `json:"acknowledged_at"` - CreatedAt time.Time `json:"created_at"` - UpdatedAt time.Time `json:"updated_at"` + ID uint `gorm:"primaryKey;autoIncrement;comment:主键ID" json:"id"` + RuleID uint `gorm:"not null;index:idx_rule_time;comment:规则ID" json:"rule_id"` + RuleName string `gorm:"type:varchar(128);comment:规则名称" json:"rule_name,omitempty"` + Severity string `gorm:"type:varchar(32);comment:告警级别" json:"severity,omitempty"` + Status string `gorm:"type:varchar(32);default:'firing';comment:事件状态" json:"status"` + // ====== 原V1兼容字段 ====== + Target string `gorm:"type:varchar(255);comment:目标标签" json:"target,omitempty"` + Message string `gorm:"type:text;comment:告警详情" json:"message,omitempty"` + Value float64 `gorm:"comment:触发值" json:"value,omitempty"` + // ====== V2增强字段 ====== + TargetID uint `gorm:"index;comment:目标ID" json:"target_id,omitempty"` + TargetName string `gorm:"type:varchar(128);comment:目标名称" json:"target_name,omitempty"` + TargetIP string `gorm:"type:varchar(64);comment:目标IP" json:"target_ip,omitempty"` + Title string `gorm:"type:varchar(256);comment:告警标题" json:"title,omitempty"` + MetricName string `gorm:"type:varchar(64);comment:指标名称" json:"metric_name,omitempty"` + Threshold float64 `gorm:"comment:阈值" json:"threshold,omitempty"` + Operator string `gorm:"type:varchar(8);comment:运算符" json:"operator,omitempty"` + Unit string `gorm:"type:varchar(32);comment:单位" json:"unit,omitempty"` + Labels string `gorm:"type:text;comment:标签JSON" json:"labels,omitempty"` + Annotations string `gorm:"type:text;comment:注释JSON" json:"annotations,omitempty"` + StartedAt time.Time `gorm:"not null;index:idx_rule_time;comment:触发时间" json:"started_at"` + ResolvedAt *time.Time `gorm:"comment:恢复时间" json:"resolved_at,omitempty"` + Duration int `gorm:"comment:持续时间(秒)" json:"duration,omitempty"` + LastEvalAt time.Time `gorm:"comment:最后评估时间" json:"last_eval_at,omitempty"` + NotifyCount int `gorm:"default:0;comment:通知次数" json:"notify_count,omitempty"` + LastNotifyAt *time.Time `gorm:"comment:最近通知时间" json:"last_notify_at,omitempty"` + UpgradeLevel int `gorm:"default:0;comment:当前升级级别" json:"upgrade_level,omitempty"` + Acknowledged bool `gorm:"default:false;comment:是否已确认" json:"acknowledged"` + AcknowledgedBy *uint `gorm:"comment:确认人ID" json:"acknowledged_by,omitempty"` + AcknowledgedAt *time.Time `gorm:"comment:确认时间" json:"acknowledged_at,omitempty"` + AckComment string `gorm:"type:varchar(256);comment:确认备注" json:"ack_comment,omitempty"` + CreatedAt time.Time `gorm:"not null;comment:创建时间" json:"created_at"` + UpdatedAt time.Time `gorm:"not null;comment:更新时间" json:"updated_at"` + DeletedAt gorm.DeletedAt `gorm:"index;comment:删除时间" json:"deleted_at,omitempty"` // 关联 - Rule *AlertRule `json:"rule,omitempty"` + Rule *AlertRule `json:"rule,omitempty" gorm:"foreignKey:RuleID"` } -// TableName 表名 func (AlertEvent) TableName() string { return "monitor_alert_events" } +// ============================================ +// AlertCondition 告警条件定义 +// ============================================ + +type AlertCondition struct { + Metric string `json:"metric"` + Operator Operator `json:"operator"` + Threshold float64 `json:"threshold"` + Unit string `json:"unit,omitempty"` + Index string `json:"index,omitempty"` + LogicOp string `json:"logic_op,omitempty"` + AggFunc AggFunction `json:"agg_func,omitempty"` + Window int `json:"window,omitempty"` +} + +func (AlertCondition) TableName() string { + return "monitor_alert_conditions" +} + +type AlertConditionGroup struct { + Conditions []AlertCondition `json:"conditions"` + LogicOp string `json:"logic_op"` +} + +// ============================================ +// AlertNotifyTemplate 告警通知模板 +// ============================================ + +type AlertNotifyTemplate struct { + ID uint `gorm:"primaryKey;autoIncrement;comment:主键ID" json:"id"` + Name string `gorm:"type:varchar(128);not null;comment:模板名称" json:"name"` + Description string `gorm:"type:varchar(256);comment:描述" json:"description,omitempty"` + ChannelType string `gorm:"type:varchar(32);not null;comment:适用渠道类型: email/sms/webhook/dingtalk/wecom/feishu" json:"channel_type"` + TitleTemplate string `gorm:"type:varchar(256);comment:标题模板" json:"title_template,omitempty"` + BodyTemplate string `gorm:"type:text;comment:正文模板" json:"body_template,omitempty"` + Variables string `gorm:"type:text;comment:可用变量说明JSON" json:"variables,omitempty"` + RecoverTitleTemplate string `gorm:"type:varchar(256);comment:恢复标题模板" json:"recover_title_template,omitempty"` + RecoverBodyTemplate string `gorm:"type:text;comment:恢复正文模板" json:"recover_body_template,omitempty"` + IsDefault bool `gorm:"default:false;comment:是否默认模板" json:"is_default"` + Status int `gorm:"default:1;comment:状态: 1启用 0禁用" json:"status"` + CreatedBy uint `gorm:"index;comment:创建人ID" json:"created_by"` + CreatedAt time.Time `gorm:"not null;comment:创建时间" json:"created_at"` + UpdatedAt time.Time `gorm:"not null;comment:更新时间" json:"updated_at"` + DeletedAt gorm.DeletedAt `gorm:"index;comment:删除时间" json:"deleted_at,omitempty"` +} + +func (AlertNotifyTemplate) TableName() string { + return "monitor_alert_notify_templates" +} + +type TemplateVariable struct { + Name string `json:"name"` + Description string `json:"description"` + Example string `json:"example"` +} + +var DefaultTemplateVariables = []TemplateVariable{ + {Name: "{{.RuleName}}", Description: "规则名称", Example: "CPU使用率告警"}, + {Name: "{{.TargetName}}", Description: "目标名称", Example: "WebServer-01"}, + {Name: "{{.TargetIP}}", Description: "目标IP", Example: "192.168.1.10"}, + {Name: "{{.Severity}}", Description: "告警级别", Example: "critical"}, + {Name: "{{.MetricName}}", Description: "指标名称", Example: "cpu_usage"}, + {Name: "{{.Value}}", Description: "当前值", Example: "95.2"}, + {Name: "{{.Threshold}}", Description: "阈值", Example: "90"}, + {Name: "{{.Operator}}", Description: "运算符", Example: ">"}, + {Name: "{{.Time}}", Description: "触发时间", Example: "2024-01-15 10:30:00"}, + {Name: "{{.Duration}}", Description: "持续时间", Example: "5m"}, + {Name: "{{.Description}}", Description: "规则描述", Example: "CPU使用率超过阈值"}, + {Name: "{{.URL}}", Description: "详情链接", Example: "https://ezops.io/alerts/123"}, +} + +// ============================================ +// AlertUpgrade + AlertUpgradeRecord 告警升级 +// ============================================ + +type AlertUpgrade struct { + ID uint `gorm:"primaryKey;autoIncrement;comment:主键ID" json:"id"` + Name string `gorm:"type:varchar(128);not null;comment:策略名称" json:"name"` + Description string `gorm:"type:varchar(256);comment:描述" json:"description,omitempty"` + Rules string `gorm:"type:text;comment:升级规则JSON数组" json:"rules,omitempty"` + MaxLevel int `gorm:"default:3;comment:最大升级级别" json:"max_level"` + IsDefault bool `gorm:"default:false;comment:是否默认策略" json:"is_default"` + Status int `gorm:"default:1;comment:状态: 1启用 0禁用" json:"status"` + CreatedBy uint `gorm:"index;comment:创建人ID" json:"created_by"` + CreatedAt time.Time `gorm:"not null;comment:创建时间" json:"created_at"` + UpdatedAt time.Time `gorm:"not null;comment:更新时间" json:"updated_at"` + DeletedAt gorm.DeletedAt `gorm:"index;comment:删除时间" json:"deleted_at,omitempty"` +} + +func (AlertUpgrade) TableName() string { + return "monitor_alert_upgrades" +} + +type AlertUpgradeRule struct { + Level int `json:"level"` + Duration int `json:"duration"` + Severity string `json:"severity"` + ChannelIDs []string `json:"channel_ids"` + NotifyUsers []uint `json:"notify_users"` + RepeatInterval int `json:"repeat_interval"` +} + +type AlertUpgradeRecord struct { + ID uint `gorm:"primaryKey;autoIncrement;comment:主键ID" json:"id"` + AlertID uint `gorm:"not null;index;comment:告警ID" json:"alert_id"` + RuleID uint `gorm:"not null;comment:规则ID" json:"rule_id"` + FromLevel int `gorm:"comment:原级别" json:"from_level"` + ToLevel int `gorm:"comment:升级后级别" json:"to_level"` + UpgradedAt time.Time `gorm:"not null;comment:升级时间" json:"upgraded_at"` + CreatedAt time.Time `gorm:"not null;comment:创建时间" json:"created_at"` +} + +func (AlertUpgradeRecord) TableName() string { + return "monitor_alert_upgrade_records" +} + +// ============================================ +// AlertSilence 告警静默规则 +// ============================================ + +type AlertSilenceType string + +const ( + AlertSilenceOneTime AlertSilenceType = "onetime" + AlertSilenceDaily AlertSilenceType = "daily" + AlertSilenceWeekly AlertSilenceType = "weekly" +) + +type AlertSilence struct { + ID uint `gorm:"primaryKey;autoIncrement;comment:主键ID" json:"id"` + Name string `gorm:"type:varchar(128);not null;comment:静默规则名称" json:"name"` + Description string `gorm:"type:varchar(256);comment:描述" json:"description,omitempty"` + RuleIDs string `gorm:"type:varchar(256);comment:匹配的告警规则ID列表JSON" json:"rule_ids,omitempty"` + TargetIDs string `gorm:"type:varchar(256);comment:匹配的目标ID列表JSON" json:"target_ids,omitempty"` + Matchers string `gorm:"type:text;comment:标签匹配条件JSON" json:"matchers,omitempty"` + SilenceType AlertSilenceType `gorm:"type:varchar(16);default:'onetime';comment:静默类型" json:"silence_type"` + StartTime time.Time `gorm:"not null;comment:开始时间" json:"start_time"` + EndTime time.Time `gorm:"not null;comment:结束时间" json:"end_time"` + Timezone string `gorm:"type:varchar(32);default:'Asia/Shanghai';comment:时区" json:"timezone"` + Weekdays string `gorm:"type:varchar(64);comment:生效星期(0-6)JSON数组" json:"weekdays,omitempty"` + Status int `gorm:"default:1;comment:状态: 1启用 0禁用" json:"status"` + CreatedBy uint `gorm:"index;comment:创建人ID" json:"created_by"` + CreatedAt time.Time `gorm:"not null;comment:创建时间" json:"created_at"` + UpdatedAt time.Time `gorm:"not null;comment:更新时间" json:"updated_at"` + DeletedAt gorm.DeletedAt `gorm:"index;comment:删除时间" json:"deleted_at,omitempty"` +} + +func (AlertSilence) TableName() string { + return "monitor_alert_silences" +} + +type AlertSilenceMatcher struct { + Name string `json:"name"` + Value string `json:"value"` + IsRegex bool `json:"is_regex"` +} + +type AlertSilenceCheckResult struct { + IsSilenced bool `json:"is_silenced"` + SilenceID uint `json:"silence_id,omitempty"` + SilenceName string `json:"silence_name,omitempty"` + ExpiresAt *time.Time `json:"expires_at,omitempty"` +} + // NotifyChannel 通知渠道模型 type NotifyChannel struct { ID uint `gorm:"primarykey" json:"id"` diff --git a/backend/internal/models/alert_v2.go b/backend/internal/models/alert_v2.go deleted file mode 100644 index e214145..0000000 --- a/backend/internal/models/alert_v2.go +++ /dev/null @@ -1,405 +0,0 @@ -package models - -import ( - "time" -) - -// ============================================ -// AlertRuleV2 增强告警规则 -// ============================================ - -// AlertRuleV2Status 告警规则状态 -type AlertRuleV2Status string - -const ( - AlertRuleV2Enabled AlertRuleV2Status = "enabled" // 启用 - AlertRuleV2Disabled AlertRuleV2Status = "disabled" // 禁用 -) - -// AlertSeverity 告警级别 -type AlertSeverity string - -const ( - AlertSeverityCritical AlertSeverity = "critical" // 严重 - AlertSeverityWarning AlertSeverity = "warning" // 警告 - AlertSeverityNotice AlertSeverity = "notice" // 通知 - AlertSeverityInfo AlertSeverity = "info" // 信息 -) - -// AggFunction 聚合函数 -type AggFunction string - -const ( - AggFunctionAvg AggFunction = "avg" // 平均值 - AggFunctionMin AggFunction = "min" // 最小值 - AggFunctionMax AggFunction = "max" // 最大值 - AggFunctionSum AggFunction = "sum" // 求和 - AggFunctionCount AggFunction = "count" // 计数 - AggFunctionLast AggFunction = "last" // 最新值 - AggFunctionP95 AggFunction = "p95" // 95分位 - AggFunctionP99 AggFunction = "p99" // 99分位 -) - -// Operator 比较运算符 -type Operator string - -const ( - OperatorGT Operator = ">" // 大于 - OperatorGTE Operator = ">=" // 大于等于 - OperatorLT Operator = "<" // 小于 - OperatorLTE Operator = "<=" // 小于等于 - OperatorEQ Operator = "==" // 等于 - OperatorNE Operator = "!=" // 不等于 -) - -// AlertRuleV2 增强告警规则表 -// 支持多条件组合、聚合函数、静默期等高级特性 -type AlertRuleV2 struct { - ID uint `gorm:"primaryKey;autoIncrement;comment:主键ID" json:"id"` - Name string `gorm:"type:varchar(128);not null;comment:规则名称" json:"name"` - Description string `gorm:"type:varchar(256);comment:规则描述" json:"description,omitempty"` - Severity AlertSeverity `gorm:"type:varchar(16);not null;comment:告警级别" json:"severity"` - Status AlertRuleV2Status `gorm:"type:varchar(16);default:'enabled';comment:规则状态" json:"status"` - // 关联目标 - TargetType string `gorm:"type:varchar(32);comment:目标类型" json:"target_type,omitempty"` - TargetID uint `gorm:"index;comment:目标ID(0表示全部)" json:"target_id,omitempty"` - TargetTags string `gorm:"type:varchar(256);comment:目标标签筛选" json:"target_tags,omitempty"` - // 触发条件(JSON存储支持多条件) - Conditions string `gorm:"type:text;comment:触发条件JSON数组" json:"conditions,omitempty"` - // 聚合配置 - AggWindow int `gorm:"default:300;comment:聚合窗口(秒)" json:"agg_window"` - AggFunction AggFunction `gorm:"type:varchar(16);default:'avg';comment:聚合函数" json:"agg_function"` - // 恢复配置 - RecoverCount int `gorm:"default:1;comment:恢复次数(连续N次低于阈值触发恢复)" json:"recover_count"` - RecoverWindow int `gorm:"default:300;comment:恢复检查窗口(秒)" json:"recover_window"` - // 执行配置 - Interval int `gorm:"default:60;comment:评估间隔(秒)" json:"interval"` - CheckTimes int `gorm:"default:1;comment:连续触发次数" json:"check_times"` - NotifyMode string `gorm:"type:varchar(16);default:'every';comment:通知模式: every/once/upgrade" json:"notify_mode"` - // 通知渠道 - ChannelIDs string `gorm:"type:varchar(256);comment:通知渠道ID列表JSON" json:"channel_ids,omitempty"` - TemplateID uint `gorm:"comment:通知模板ID" json:"template_id,omitempty"` - // 升级策略 - UpgradeID uint `gorm:"comment:升级策略ID" json:"upgrade_id,omitempty"` - // 静默策略 - SilenceID uint `gorm:"comment:静默规则ID" json:"silence_id,omitempty"` - // 标签和注释 - Labels string `gorm:"type:varchar(512);comment:标签JSON" json:"labels,omitempty"` - Annotations string `gorm:"type:text;comment:注释JSON(用于通知内容模板)" json:"annotations,omitempty"` - CreatedBy uint `gorm:"index;comment:创建人ID" json:"created_by"` - CreatedAt time.Time `gorm:"not null;comment:创建时间" json:"created_at"` - UpdatedAt time.Time `gorm:"not null;comment:更新时间" json:"updated_at"` - DeletedAt *time.Time `gorm:"index;comment:删除时间" json:"deleted_at,omitempty"` -} - -// TableName 指定表名 -func (AlertRuleV2) TableName() string { - return "monitor_alert_rules_v2" -} - -// AlertCondition 告警条件定义 -type AlertCondition struct { - Metric string `json:"metric"` // 指标名称 - Operator Operator `json:"operator"` // 比较运算符 - Threshold float64 `json:"threshold"` // 阈值 - Unit string `json:"unit"` // 单位 - Index string `json:"index"` // 实例索引 - LogicOp string `json:"logic_op"` // 逻辑关系: AND/OR - AggFunc AggFunction `json:"agg_func"` // 条件级聚合函数 - Window int `json:"window"` // 条件级聚合窗口 -} - -// TableName 指定表名 -func (AlertCondition) TableName() string { - return "monitor_alert_conditions" -} - -// AlertConditionGroup 告警条件组 -type AlertConditionGroup struct { - Conditions []AlertCondition `json:"conditions"` // 条件列表 - LogicOp string `json:"logic_op"` // 组间逻辑: AND/OR -} - -// RecoverConfig 告警恢复配置 -type RecoverConfig struct { - Count int `json:"count"` // 连续恢复次数 - Window int `json:"window"` // 恢复检查窗口(秒) -} - -// NotifyMode 通知模式 -type NotifyMode string - -const ( - NotifyModeEvery NotifyMode = "every" // 每次都通知 - NotifyModeOnce NotifyMode = "once" // 仅通知一次 - NotifyModeUpgrade NotifyMode = "upgrade" // 升级通知 -) - -// ============================================ -// AlertNotifyTemplate 告警通知模板 -// ============================================ - -// AlertNotifyTemplate 告警通知模板表 -// 定义告警通知的内容模板,支持变量替换 -type AlertNotifyTemplate struct { - ID uint `gorm:"primaryKey;autoIncrement;comment:主键ID" json:"id"` - Name string `gorm:"type:varchar(128);not null;comment:模板名称" json:"name"` - Description string `gorm:"type:varchar(256);comment:描述" json:"description,omitempty"` - ChannelType string `gorm:"type:varchar(32);not null;comment:适用渠道类型: email/sms/webhook/dingtalk/wecom/feishu" json:"channel_type"` - // 模板内容 - TitleTemplate string `gorm:"type:varchar(256);comment:标题模板" json:"title_template,omitempty"` - BodyTemplate string `gorm:"type:text;comment:正文模板" json:"body_template,omitempty"` - // 变量定义 - Variables string `gorm:"type:text;comment:可用变量说明JSON" json:"variables,omitempty"` - // 恢复通知模板 - RecoverTitleTemplate string `gorm:"type:varchar(256);comment:恢复标题模板" json:"recover_title_template,omitempty"` - RecoverBodyTemplate string `gorm:"type:text;comment:恢复正文模板" json:"recover_body_template,omitempty"` - IsDefault bool `gorm:"default:false;comment:是否默认模板" json:"is_default"` - Status int `gorm:"default:1;comment:状态: 1启用 0禁用" json:"status"` - CreatedBy uint `gorm:"index;comment:创建人ID" json:"created_by"` - CreatedAt time.Time `gorm:"not null;comment:创建时间" json:"created_at"` - UpdatedAt time.Time `gorm:"not null;comment:更新时间" json:"updated_at"` - DeletedAt *time.Time `gorm:"index;comment:删除时间" json:"deleted_at,omitempty"` -} - -// TableName 指定表名 -func (AlertNotifyTemplate) TableName() string { - return "monitor_alert_notify_templates" -} - -// TemplateVariable 模板变量定义 -type TemplateVariable struct { - Name string `json:"name"` // 变量名 - Description string `json:"description"` // 描述 - Example string `json:"example"` // 示例 -} - -// DefaultTemplateVariables 默认模板变量 -var DefaultTemplateVariables = []TemplateVariable{ - {Name: "{{.RuleName}}", Description: "规则名称", Example: "CPU使用率告警"}, - {Name: "{{.TargetName}}", Description: "目标名称", Example: "WebServer-01"}, - {Name: "{{.TargetIP}}", Description: "目标IP", Example: "192.168.1.10"}, - {Name: "{{.Severity}}", Description: "告警级别", Example: "critical"}, - {Name: "{{.MetricName}}", Description: "指标名称", Example: "cpu_usage"}, - {Name: "{{.Value}}", Description: "当前值", Example: "95.2"}, - {Name: "{{.Threshold}}", Description: "阈值", Example: "90"}, - {Name: "{{.Operator}}", Description: "运算符", Example: ">"}, - {Name: "{{.Time}}", Description: "触发时间", Example: "2024-01-15 10:30:00"}, - {Name: "{{.Duration}}", Description: "持续时间", Example: "5m"}, - {Name: "{{.Description}}", Description: "规则描述", Example: "CPU使用率超过阈值"}, - {Name: "{{.URL}}", Description: "详情链接", Example: "https://ezops.io/alerts/123"}, -} - -// ============================================ -// AlertUpgrade 告警升级策略 -// ============================================ - -// AlertUpgrade 告警升级策略表 -// 定义告警在不同阶段的升级策略 -type AlertUpgrade struct { - ID uint `gorm:"primaryKey;autoIncrement;comment:主键ID" json:"id"` - Name string `gorm:"type:varchar(128);not null;comment:策略名称" json:"name"` - Description string `gorm:"type:varchar(256);comment:描述" json:"description,omitempty"` - // 升级规则(JSON存储支持多级升级) - Rules string `gorm:"type:text;comment:升级规则JSON数组" json:"rules,omitempty"` - // 执行配置 - MaxLevel int `gorm:"default:3;comment:最大升级级别" json:"max_level"` - IsDefault bool `gorm:"default:false;comment:是否默认策略" json:"is_default"` - Status int `gorm:"default:1;comment:状态: 1启用 0禁用" json:"status"` - CreatedBy uint `gorm:"index;comment:创建人ID" json:"created_by"` - CreatedAt time.Time `gorm:"not null;comment:创建时间" json:"created_at"` - UpdatedAt time.Time `gorm:"not null;comment:更新时间" json:"updated_at"` - DeletedAt *time.Time `gorm:"index;comment:删除时间" json:"deleted_at,omitempty"` -} - -// TableName 指定表名 -func (AlertUpgrade) TableName() string { - return "monitor_alert_upgrades" -} - -// AlertUpgradeRule 告警升级规则 -type AlertUpgradeRule struct { - Level int `json:"level"` // 升级级别 - Duration int `json:"duration"` // 触发升级的持续时长(秒) - Severity string `json:"severity"` // 升级后的级别 - ChannelIDs []string `json:"channel_ids"` // 升级后通知渠道 - NotifyUsers []uint `json:"notify_users"` // 升级后通知用户 - RepeatInterval int `json:"repeat_interval"` // 重复通知间隔(秒) -} - -// AlertUpgradeRecord 告警升级记录 -type AlertUpgradeRecord struct { - ID uint `gorm:"primaryKey;autoIncrement;comment:主键ID" json:"id"` - AlertID uint `gorm:"not null;index;comment:告警ID" json:"alert_id"` - RuleID uint `gorm:"not null;comment:规则ID" json:"rule_id"` - FromLevel int `gorm:"comment:原级别" json:"from_level"` - ToLevel int `gorm:"comment:升级后级别" json:"to_level"` - UpgradedAt time.Time `gorm:"not null;comment:升级时间" json:"upgraded_at"` - CreatedAt time.Time `gorm:"not null;comment:创建时间" json:"created_at"` -} - -// TableName 指定表名 -func (AlertUpgradeRecord) TableName() string { - return "monitor_alert_upgrade_records" -} - -// ============================================ -// AlertSilence 告警静默规则 -// ============================================ - -// AlertSilenceType 静默类型 -type AlertSilenceType string - -const ( - AlertSilenceOneTime AlertSilenceType = "onetime" // 一次性静默 - AlertSilenceDaily AlertSilenceType = "daily" // 每日重复 - AlertSilenceWeekly AlertSilenceType = "weekly" // 每周重复 -) - -// AlertSilence 告警静默规则表 -// 定义告警静默策略,支持一次性、周期性静默 -type AlertSilence struct { - ID uint `gorm:"primaryKey;autoIncrement;comment:主键ID" json:"id"` - Name string `gorm:"type:varchar(128);not null;comment:静默规则名称" json:"name"` - Description string `gorm:"type:varchar(256);comment:描述" json:"description,omitempty"` - // 匹配条件 - RuleIDs string `gorm:"type:varchar(256);comment:匹配的告警规则ID列表JSON" json:"rule_ids,omitempty"` - TargetIDs string `gorm:"type:varchar(256);comment:匹配的目标ID列表JSON" json:"target_ids,omitempty"` - Matchers string `gorm:"type:text;comment:标签匹配条件JSON" json:"matchers,omitempty"` - // 时间配置 - SilenceType AlertSilenceType `gorm:"type:varchar(16);default:'onetime';comment:静默类型" json:"silence_type"` - StartTime time.Time `gorm:"not null;comment:开始时间" json:"start_time"` - EndTime time.Time `gorm:"not null;comment:结束时间" json:"end_time"` - Timezone string `gorm:"type:varchar(32);default:'Asia/Shanghai';comment:时区" json:"timezone"` - // 周期性配置 - Weekdays string `gorm:"type:varchar(64);comment:生效星期(0-6)JSON数组" json:"weekdays,omitempty"` - // 状态 - Status int `gorm:"default:1;comment:状态: 1启用 0禁用" json:"status"` - CreatedBy uint `gorm:"index;comment:创建人ID" json:"created_by"` - CreatedAt time.Time `gorm:"not null;comment:创建时间" json:"created_at"` - UpdatedAt time.Time `gorm:"not null;comment:更新时间" json:"updated_at"` - DeletedAt *time.Time `gorm:"index;comment:删除时间" json:"deleted_at,omitempty"` -} - -// TableName 指定表名 -func (AlertSilence) TableName() string { - return "monitor_alert_silences" -} - -// AlertSilenceMatcher 静默匹配条件 -type AlertSilenceMatcher struct { - Name string `json:"name"` // 标签名 - Value string `json:"value"` // 标签值 - IsRegex bool `json:"is_regex"` // 是否正则匹配 -} - -// AlertSilenceCheckResult 静默检查结果 -type AlertSilenceCheckResult struct { - IsSilenced bool `json:"is_silenced"` - SilenceID uint `json:"silence_id,omitempty"` - SilenceName string `json:"silence_name,omitempty"` - ExpiresAt *time.Time `json:"expires_at,omitempty"` -} - -// ============================================ -// AlertEventV2 增强告警事件 -// ============================================ - -// AlertEventV2Status 告警事件状态 -type AlertEventV2Status string - -const ( - AlertEventV2Firing AlertEventV2Status = "firing" // 触发中 - AlertEventV2Resolved AlertEventV2Status = "resolved" // 已恢复 - AlertEventV2Silenced AlertEventV2Status = "silenced" // 已静默 -) - -// AlertEventV2 增强告警事件表 -// 记录告警触发和恢复的全过程 -type AlertEventV2 struct { - ID uint `gorm:"primaryKey;autoIncrement;comment:主键ID" json:"id"` - RuleID uint `gorm:"not null;index:idx_rule_time;comment:规则ID" json:"rule_id"` - TargetID uint `gorm:"not null;index;comment:目标ID" json:"target_id"` - TargetName string `gorm:"type:varchar(128);comment:目标名称" json:"target_name,omitempty"` - TargetIP string `gorm:"type:varchar(64);comment:目标IP" json:"target_ip,omitempty"` - Severity AlertSeverity `gorm:"type:varchar(16);not null;index;comment:告警级别" json:"severity"` - Status AlertEventV2Status `gorm:"type:varchar(16);default:'firing';index;comment:事件状态" json:"status"` - Title string `gorm:"type:varchar(256);not null;comment:告警标题" json:"title"` - Message string `gorm:"type:text;comment:告警详情" json:"message,omitempty"` - // 触发值信息 - MetricName string `gorm:"type:varchar(64);comment:指标名称" json:"metric_name,omitempty"` - Value float64 `gorm:"comment:触发值" json:"value,omitempty"` - Threshold float64 `gorm:"comment:阈值" json:"threshold,omitempty"` - Operator string `gorm:"type:varchar(8);comment:运算符" json:"operator,omitempty"` - Unit string `gorm:"type:varchar(32);comment:单位" json:"unit,omitempty"` - // 标签和注释 - Labels string `gorm:"type:varchar(512);comment:标签JSON" json:"labels,omitempty"` - Annotations string `gorm:"type:text;comment:注释JSON" json:"annotations,omitempty"` - // 时间信息 - StartedAt time.Time `gorm:"not null;index:idx_rule_time;comment:触发时间" json:"started_at"` - ResolvedAt *time.Time `gorm:"comment:恢复时间" json:"resolved_at,omitempty"` - Duration int `gorm:"comment:持续时间(秒)" json:"duration,omitempty"` - LastEvalAt time.Time `gorm:"comment:最后评估时间" json:"last_eval_at,omitempty"` - NotifyCount int `gorm:"default:0;comment:通知次数" json:"notify_count"` - LastNotifyAt *time.Time `gorm:"comment:最近通知时间" json:"last_notify_at,omitempty"` - UpgradeLevel int `gorm:"default:0;comment:当前升级级别" json:"upgrade_level"` - // 确认信息 - Acknowledged bool `gorm:"default:false;comment:是否已确认" json:"acknowledged"` - AcknowledgedBy uint `gorm:"comment:确认人ID" json:"acknowledged_by,omitempty"` - AcknowledgedAt *time.Time `gorm:"comment:确认时间" json:"acknowledged_at,omitempty"` - AckComment string `gorm:"type:varchar(256);comment:确认备注" json:"ack_comment,omitempty"` - CreatedAt time.Time `gorm:"not null;comment:创建时间" json:"created_at"` - UpdatedAt time.Time `gorm:"not null;comment:更新时间" json:"updated_at"` -} - -// TableName 指定表名 -func (AlertEventV2) TableName() string { - return "monitor_alert_events_v2" -} - -// AlertRuleV2CreateRequest 告警规则创建请求 -type AlertRuleV2CreateRequest struct { - Name string `json:"name" binding:"required,max=128"` - Description string `json:"description"` - Severity AlertSeverity `json:"severity" binding:"required"` - TargetType string `json:"target_type"` - TargetID uint `json:"target_id"` - TargetTags string `json:"target_tags"` - Conditions []AlertCondition `json:"conditions" binding:"required,min=1"` - AggWindow int `json:"agg_window"` - AggFunction AggFunction `json:"agg_function"` - RecoverCount int `json:"recover_count"` - Interval int `json:"interval"` - CheckTimes int `json:"check_times"` - NotifyMode string `json:"notify_mode"` - ChannelIDs []string `json:"channel_ids"` - TemplateID uint `json:"template_id"` - UpgradeID uint `json:"upgrade_id"` - SilenceID uint `json:"silence_id"` - Labels map[string]string `json:"labels"` - Annotations map[string]string `json:"annotations"` -} - -// AlertRuleV2UpdateRequest 告警规则更新请求 -type AlertRuleV2UpdateRequest struct { - Name string `json:"name" binding:"max=128"` - Description string `json:"description"` - Severity AlertSeverity `json:"severity"` - Status AlertRuleV2Status `json:"status"` - TargetType string `json:"target_type"` - TargetID uint `json:"target_id"` - TargetTags string `json:"target_tags"` - Conditions []AlertCondition `json:"conditions"` - AggWindow int `json:"agg_window"` - AggFunction AggFunction `json:"agg_function"` - RecoverCount int `json:"recover_count"` - Interval int `json:"interval"` - CheckTimes int `json:"check_times"` - NotifyMode string `json:"notify_mode"` - ChannelIDs []string `json:"channel_ids"` - TemplateID uint `json:"template_id"` - UpgradeID uint `json:"upgrade_id"` - SilenceID uint `json:"silence_id"` - Labels map[string]string `json:"labels"` - Annotations map[string]string `json:"annotations"` -} diff --git a/backend/internal/models/cicd.go b/backend/internal/models/cicd.go index 204db2e..0e3a666 100644 --- a/backend/internal/models/cicd.go +++ b/backend/internal/models/cicd.go @@ -10,6 +10,7 @@ type Pipeline struct { ID uint `gorm:"primarykey" json:"id"` Name string `gorm:"size:128;not null" json:"name"` Code string `gorm:"size:64;uniqueIndex;not null" json:"code"` + JobName string `gorm:"size:128;uniqueIndex;comment:Job名称(webhook URL标识, 如 cex-admin-server)" json:"job_name,omitempty"` Description string `gorm:"size:500" json:"description"` Type string `gorm:"size:32;default:deploy" json:"type"` // build, deploy, test Source string `gorm:"size:255" json:"source"` // Git仓库地址 @@ -18,13 +19,51 @@ type Pipeline struct { Stages string `gorm:"type:text" json:"stages"` // JSON Variables string `gorm:"type:text" json:"variables"` // JSON Enabled bool `gorm:"default:true" json:"enabled"` - LastRunAt *time.Time `json:"last_run_at"` - LastStatus string `gorm:"size:32" json:"last_status"` - RunCount int `gorm:"default:0" json:"run_count"` - SuccessCount int `gorm:"default:0" json:"success_count"` - FailCount int `gorm:"default:0" json:"fail_count"` - CreatedAt time.Time `json:"created_at"` - UpdatedAt time.Time `json:"updated_at"` + + // 部署模式 + DeployMode string `gorm:"size:16;default:branch;comment:部署模式 branch/tag" json:"deploy_mode"` + DeployTarget string `gorm:"size:16;default:ssh;comment:部署目标 ssh/k8s" json:"deploy_target"` + + // SSH 部署目标服务器 (JSON: [1,2,3]) + ServerIDs string `gorm:"type:text;comment:SSH服务器ID列表(JSON)" json:"server_ids,omitempty"` + + // K8s 部署目标 + K8sClusterID *uint `json:"k8s_cluster_id,omitempty"` // FK → kubernetes_clusters + K8sNamespace string `gorm:"size:128;comment:K8s部署命名空间" json:"k8s_namespace,omitempty"` + + // 仓库和镜像仓库关联(旧字段,待废弃) + RepoID *uint `json:"repo_id"` // FK → deploy_pipeline_repos + RegistryID *uint `json:"registry_id"` // FK → deploy_pipeline_registries + + // 凭证关联(直接关联凭证 ID) + GitCredentialID *uint `json:"git_credential_id"` // FK → iam_credentials (Git Token) + RegistryCredentialID *uint `json:"registry_credential_id"` // FK → iam_credentials (Docker Password) + + // 环境分组 + EnvironmentID *uint `json:"environment_id"` // FK → deploy_environments + + // 触发配置 + TriggerMode string `gorm:"type:varchar(32);default:'manual';comment:触发方式: git_push/cron/webhook/manual" json:"trigger_mode"` + WatchBranches string `gorm:"type:varchar(256);comment:监听分支(逗号分隔, 支持通配)" json:"watch_branches,omitempty"` + ExcludeBranch string `gorm:"type:varchar(256);comment:排除分支" json:"exclude_branch,omitempty"` + CronExpr string `gorm:"type:varchar(64);comment:Cron 表达式" json:"cron_expr,omitempty"` + WebhookToken string `gorm:"type:varchar(128);comment:Webhook 签名 Token" json:"webhook_token,omitempty"` + + // 缓存配置 + CachePaths string `gorm:"type:text;comment:缓存路径(逗号分隔)" json:"cache_paths,omitempty"` + + LastRunAt *time.Time `json:"last_run_at"` + LastStatus string `gorm:"size:32" json:"last_status"` + RunCount int `gorm:"default:0" json:"run_count"` + SuccessCount int `gorm:"default:0" json:"success_count"` + FailCount int `gorm:"default:0" json:"fail_count"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` + + // 关联 + Repo *PipelineRepo `json:"repo,omitempty" gorm:"foreignKey:RepoID"` + Registry *PipelineRegistry `json:"registry,omitempty" gorm:"foreignKey:RegistryID"` + Environment *DeployEnvironment `json:"environment,omitempty" gorm:"foreignKey:EnvironmentID"` } // TableName 表名 @@ -44,6 +83,7 @@ type PipelineRun struct { Author string `gorm:"size:64" json:"author"` ImageTag string `gorm:"size:255" json:"image_tag"` // 构建产物镜像标签 ArtifactURL string `gorm:"size:500" json:"artifact_url"` // 构建产物地址 + WorkspacePath string `gorm:"size:500" json:"workspace_path"` // 工作区路径 Duration int `json:"duration"` // 秒 Stages string `gorm:"type:text" json:"stages"` // JSON Logs string `gorm:"type:longtext" json:"logs"` @@ -98,6 +138,7 @@ func (AppRelease) TableName() string { type CreatePipelineRequest struct { Name string `json:"name" binding:"required"` Code string `json:"code" binding:"required"` + JobName string `json:"job_name"` // Webhook Job名称 Description string `json:"description"` Type string `json:"type" binding:"omitempty,oneof=build deploy test"` Source string `json:"source"` @@ -105,11 +146,69 @@ type CreatePipelineRequest struct { Dockerfile string `json:"dockerfile"` Stages string `json:"stages"` Variables string `json:"variables"` + + // 部署模式 + DeployMode string `json:"deploy_mode"` // branch / tag + DeployTarget string `json:"deploy_target"` // ssh / k8s + ServerIDs string `json:"server_ids"` // SSH 服务器ID JSON [1,2,3] + K8sClusterID *uint `json:"k8s_cluster_id"` + K8sNamespace string `json:"k8s_namespace"` + + RepoID *uint `json:"repo_id"` + RegistryID *uint `json:"registry_id"` + // 凭证关联 + GitCredentialID *uint `json:"git_credential_id"` + RegistryCredentialID *uint `json:"registry_credential_id"` + EnvironmentID *uint `json:"environment_id"` + + // 触发配置 + TriggerMode string `json:"trigger_mode"` + WatchBranches string `json:"watch_branches"` + ExcludeBranch string `json:"exclude_branch"` + CronExpr string `json:"cron_expr"` + WebhookToken string `json:"webhook_token"` + + // 缓存路径 + CachePaths string `json:"cache_paths"` +} + +// UpdatePipelineRequest 更新流水线请求 +type UpdatePipelineRequest struct { + Name string `json:"name"` + JobName string `json:"job_name"` + Description string `json:"description"` + Type string `json:"type"` + Source string `json:"source"` + Branch string `json:"branch"` + Dockerfile string `json:"dockerfile"` + Stages string `json:"stages"` + Variables string `json:"variables"` + DeployMode string `json:"deploy_mode"` + DeployTarget string `json:"deploy_target"` + ServerIDs string `json:"server_ids"` + K8sClusterID *uint `json:"k8s_cluster_id"` + K8sNamespace string `json:"k8s_namespace"` + RepoID *uint `json:"repo_id"` + RegistryID *uint `json:"registry_id"` + // 凭证关联 + GitCredentialID *uint `json:"git_credential_id"` + RegistryCredentialID *uint `json:"registry_credential_id"` + EnvironmentID *uint `json:"environment_id"` + // 触发配置 + TriggerMode string `json:"trigger_mode"` + WatchBranches string `json:"watch_branches"` + ExcludeBranch string `json:"exclude_branch"` + CronExpr string `json:"cron_expr"` + WebhookToken string `json:"webhook_token"` + // 缓存 + CachePaths string `json:"cache_paths"` + Enabled *bool `json:"enabled"` } // TriggerPipelineRequest 触发流水线请求 type TriggerPipelineRequest struct { - Branch string `json:"branch"` + Branch string `json:"branch"` + Tag string `json:"tag"` // 发布 Tag Variables map[string]string `json:"variables"` } diff --git a/backend/internal/models/credential.go b/backend/internal/models/credential.go index 393b851..a296563 100644 --- a/backend/internal/models/credential.go +++ b/backend/internal/models/credential.go @@ -4,44 +4,198 @@ import ( "time" ) -// Credential 凭据管理模型(SSH密钥/API Token/密码等统一管理) +// Credential 凭据管理模型 — 统一管理 SSH/Docker/Token/AKSK/数据库/API 等敏感信息 +// 设计参考:opsx-web Secret 模型,按类型动态切换字段 +// 核心加密字段 content 存储类型特有数据(JSON),API 不返回 +// +// 类型与内容 JSON 映射: +// ssh → {"private_key":"...","public_key":"...","ssh_user":"...","ssh_port":22} +// docker → {"server":"...","username":"...","password":"..."} +// tls → {"cert":"...","key":"...","ca":"..."} +// aksk → {"provider":"...","access_key":"...","secret_key":"...","region":"..."} +// database → {"db_type":"...","host":"...","port":3306,"db_name":"...","username":"...","password":"..."} +// api → {"key":"...","endpoint":"..."} +// generic → {"key":"...","value":"..."} type Credential struct { - ID uint `gorm:"primarykey" json:"id"` - Name string `gorm:"size:128;not null" json:"name"` // 凭据名称 - Type string `gorm:"size:32;not null" json:"type"` // ssh_key, api_token, password, access_key - Content string `gorm:"type:text;not null" json:"-"` // AES加密后的内容,API不返回 - Description string `gorm:"size:500" json:"description"` - CreatedAt time.Time `json:"created_at"` - UpdatedAt time.Time `json:"updated_at"` + ID uint `gorm:"primarykey" json:"id"` + Name string `gorm:"size:128;not null" json:"name"` // 凭据名称 + VariableName string `gorm:"size:64;index" json:"variable_name,omitempty"` // 环境变量别名 e.g. MYSQL_PROD + SecretType string `gorm:"size:32;not null;index" json:"secret_type"` // ssh/docker/tls/aksk/database/api/generic + Summary string `gorm:"size:255" json:"summary,omitempty"` // 关键信息摘要(脱敏展示) + Content string `gorm:"type:text;not null" json:"-"` // AES 加密后的 JSON,API 不返回 + Tags string `gorm:"type:text" json:"tags,omitempty"` // JSON 数组: ["生产环境","阿里云"] + Description string `gorm:"size:500" json:"description,omitempty"` + ExpiresAt *time.Time `json:"expires_at,omitempty"` // 过期时间 + IsActive bool `gorm:"default:true" json:"is_active"` // 启用/禁用 + EnvPrefix string `gorm:"size:32" json:"env_prefix,omitempty"` // 引用 ID(可复制) + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` } func (Credential) TableName() string { return "iam_credentials" } -// CredentialCreateRequest 创建凭据请求 -type CredentialCreateRequest struct { - Name string `json:"name" binding:"required"` - Type string `json:"type" binding:"required,oneof=ssh_key api_token password access_key"` - Content string `json:"content" binding:"required"` // 明文,后端加密存储 - Description string `json:"description"` +// ────── 类型定义 ────── + +// SecretType SSH 凭据 content +type SSHSecretContent struct { + PrivateKey string `json:"private_key"` + PublicKey string `json:"public_key"` + SSHUser string `json:"ssh_user"` + SSHPort int `json:"ssh_port"` + Password string `json:"password,omitempty"` } -// CredentialUpdateRequest 更新凭据请求 -type CredentialUpdateRequest struct { - Name string `json:"name" binding:"required"` - Type string `json:"type" binding:"required,oneof=ssh_key api_token password access_key"` - Content string `json:"content"` // 空则不更新内容 - Description string `json:"description"` +// DockerSecretContent Docker 凭据 content +type DockerSecretContent struct { + Server string `json:"server"` + Username string `json:"username"` + Password string `json:"password"` } -// CredentialListResponse 列表返回(内容脱敏) -type CredentialListResponse struct { - ID uint `json:"id"` - Name string `json:"name"` - Type string `json:"type"` - Preview string `json:"preview"` // 内容预览(前8+后4字符) - Description string `json:"description"` - CreatedAt time.Time `json:"created_at"` - UpdatedAt time.Time `json:"updated_at"` +// TLSSecretContent TLS 证书凭据 content +type TLSSecretContent struct { + Cert string `json:"cert"` + Key string `json:"key"` + CA string `json:"ca"` +} + +// AKSKSecretContent AKSK 凭据 content +type AKSKSecretContent struct { + Provider string `json:"provider"` + AccessKey string `json:"access_key"` + SecretKey string `json:"secret_key"` + Region string `json:"region,omitempty"` +} + +// DatabaseSecretContent 数据库凭据 content +type DatabaseSecretContent struct { + DBType string `json:"db_type"` + Host string `json:"host"` + Port int `json:"port"` + DBName string `json:"db_name"` + Username string `json:"username"` + Password string `json:"password"` +} + +// APISecretContent API 密钥凭据 content +type APISecretContent struct { + Key string `json:"api_key"` + Endpoint string `json:"endpoint,omitempty"` +} + +// GenericSecretContent 通用凭据 content +type GenericSecretContent struct { + Key string `json:"generic_key"` + Value string `json:"generic_value"` +} + +// ────── 请求/响应 ────── + +// CreateSecretRequest 创建凭据请求 +type CreateSecretRequest struct { + Name string `json:"name" binding:"required"` + VariableName string `json:"variable_name"` + SecretType string `json:"secret_type" binding:"required,oneof=ssh docker tls aksk database api generic"` + Tags []string `json:"tags"` + Description string `json:"description"` + ExpiresAt *time.Time `json:"expires_at"` + IsActive *bool `json:"is_active"` + + // 类型特有字段(明文,后端组装成 JSON 加密存储) + // SSH + SSHPrivateKey string `json:"ssh_private_key,omitempty"` + SSHPublicKey string `json:"ssh_public_key,omitempty"` + SSHUser string `json:"ssh_user,omitempty"` + SSHPort int `json:"ssh_port,omitempty"` + SSHPassword string `json:"ssh_password,omitempty"` + // Docker + DockerServer string `json:"docker_server,omitempty"` + DockerUsername string `json:"docker_username,omitempty"` + DockerPassword string `json:"docker_password,omitempty"` + // TLS + TLSCert string `json:"tls_cert,omitempty"` + TLSKey string `json:"tls_key,omitempty"` + TLSCA string `json:"tls_ca,omitempty"` + // AKSK + AKSKProvider string `json:"aksk_provider,omitempty"` + AKSKAccessKey string `json:"aksk_access_key,omitempty"` + AKSKSecretKey string `json:"aksk_secret_key,omitempty"` + AKSKRegion string `json:"aksk_region,omitempty"` + // Database + DBType string `json:"db_type,omitempty"` + DBHost string `json:"db_host,omitempty"` + DBPort int `json:"db_port,omitempty"` + DBName string `json:"db_name,omitempty"` + DBUsername string `json:"db_username,omitempty"` + DBPassword string `json:"db_password,omitempty"` + // API + APIKey string `json:"api_key,omitempty"` + APIEndpoint string `json:"api_endpoint,omitempty"` + // Generic + GenericKey string `json:"generic_key,omitempty"` + GenericValue string `json:"generic_value,omitempty"` +} + +// UpdateSecretRequest 更新凭据请求 +type UpdateSecretRequest struct { + Name *string `json:"name"` + VariableName *string `json:"variable_name"` + Tags []string `json:"tags"` + Description *string `json:"description"` + ExpiresAt *time.Time `json:"expires_at"` + IsActive *bool `json:"is_active"` + + // 类型特有字段 — 传了才更新 + SSHPrivateKey *string `json:"ssh_private_key,omitempty"` + SSHPublicKey *string `json:"ssh_public_key,omitempty"` + SSHUser *string `json:"ssh_user,omitempty"` + SSHPort *int `json:"ssh_port,omitempty"` + SSHPassword *string `json:"ssh_password,omitempty"` + DockerServer *string `json:"docker_server,omitempty"` + DockerUsername *string `json:"docker_username,omitempty"` + DockerPassword *string `json:"docker_password,omitempty"` + TLSCert *string `json:"tls_cert,omitempty"` + TLSKey *string `json:"tls_key,omitempty"` + TLSCA *string `json:"tls_ca,omitempty"` + AKSKProvider *string `json:"aksk_provider,omitempty"` + AKSKAccessKey *string `json:"aksk_access_key,omitempty"` + AKSKSecretKey *string `json:"aksk_secret_key,omitempty"` + AKSKRegion *string `json:"aksk_region,omitempty"` + DBType *string `json:"db_type,omitempty"` + DBHost *string `json:"db_host,omitempty"` + DBPort *int `json:"db_port,omitempty"` + DBName *string `json:"db_name,omitempty"` + DBUsername *string `json:"db_username,omitempty"` + DBPassword *string `json:"db_password,omitempty"` + APIKey *string `json:"api_key,omitempty"` + APIEndpoint *string `json:"api_endpoint,omitempty"` + GenericKey *string `json:"generic_key,omitempty"` + GenericValue *string `json:"generic_value,omitempty"` +} + +// SecretListResponse 列表返回(内容脱敏) +type SecretListResponse struct { + ID uint `json:"id"` + Name string `json:"name"` + VariableName string `json:"variable_name,omitempty"` + SecretType string `json:"secret_type"` + Summary string `json:"summary,omitempty"` + Tags []string `json:"tags,omitempty"` + Description string `json:"description,omitempty"` + ExpiresAt *time.Time `json:"expires_at,omitempty"` + IsActive bool `json:"is_active"` + EnvPrefix string `json:"env_prefix,omitempty"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` +} + +// SecretListQuery 列表查询参数 +type SecretListQuery struct { + Page int `form:"page"` + PageSize int `form:"page_size"` + SecretType string `form:"secret_type"` + Tags string `form:"tags"` // 逗号分隔 + Search string `form:"search"` } diff --git a/backend/internal/models/deploy.go b/backend/internal/models/deploy.go new file mode 100644 index 0000000..87d6c0c --- /dev/null +++ b/backend/internal/models/deploy.go @@ -0,0 +1,193 @@ +package models + +import "time" + +// ============================================ +// PipelineRepo Git 仓库认证配置 +// ============================================ + +// RepoAuthType 仓库认证方式 +type RepoAuthType string + +const ( + RepoAuthToken RepoAuthType = "token" // Personal Access Token + RepoAuthSSH RepoAuthType = "ssh" // SSH Key + RepoAuthPassword RepoAuthType = "password" // 用户名+密码 +) + +// PipelineRepo Git 仓库认证配置表 +type PipelineRepo struct { + ID uint `gorm:"primaryKey;autoIncrement;comment:主键ID" json:"id"` + Name string `gorm:"type:varchar(128);not null;comment:配置名称" json:"name"` + Description string `gorm:"type:varchar(256);comment:描述" json:"description,omitempty"` + URL string `gorm:"type:varchar(512);not null;comment:仓库 URL" json:"url"` + AuthType RepoAuthType `gorm:"type:varchar(16);default:'token';comment:认证方式: token/ssh/password" json:"auth_type"` + CredentialID *uint `gorm:"index;comment:凭据ID(关联 iam_credentials)" json:"credential_id,omitempty"` + Enabled bool `gorm:"default:true;comment:是否启用" json:"enabled"` + CreatedBy string `gorm:"type:varchar(64);comment:创建人" json:"created_by,omitempty"` + CreatedAt time.Time `gorm:"not null;comment:创建时间" json:"created_at"` + UpdatedAt time.Time `gorm:"not null;comment:更新时间" json:"updated_at"` +} + +// TableName 表名 +func (PipelineRepo) TableName() string { + return "deploy_pipeline_repos" +} + +// ============================================ +// PipelineRegistry 镜像仓库认证配置 +// ============================================ + +// RegistryAuthType 镜像仓库认证方式 +type RegistryAuthType string + +const ( + RegistryAuthToken RegistryAuthType = "token" // Access Token + RegistryAuthPassword RegistryAuthType = "password" // 用户名+密码 +) + +// PipelineRegistry 镜像仓库认证配置表 +type PipelineRegistry struct { + ID uint `gorm:"primaryKey;autoIncrement;comment:主键ID" json:"id"` + Name string `gorm:"type:varchar(128);not null;comment:配置名称" json:"name"` + Description string `gorm:"type:varchar(256);comment:描述" json:"description,omitempty"` + RegistryURL string `gorm:"type:varchar(512);not null;comment:镜像仓库地址" json:"registry_url"` + Namespace string `gorm:"type:varchar(128);comment:默认命名空间" json:"namespace,omitempty"` + AuthType RegistryAuthType `gorm:"type:varchar(16);default:'password';comment:认证方式: token/password" json:"auth_type"` + CredentialID *uint `gorm:"index;comment:凭据ID(关联 iam_credentials)" json:"credential_id,omitempty"` + Enabled bool `gorm:"default:true;comment:是否启用" json:"enabled"` + CreatedBy string `gorm:"type:varchar(64);comment:创建人" json:"created_by,omitempty"` + CreatedAt time.Time `gorm:"not null;comment:创建时间" json:"created_at"` + UpdatedAt time.Time `gorm:"not null;comment:更新时间" json:"updated_at"` +} + +// TableName 表名 +func (PipelineRegistry) TableName() string { + return "deploy_pipeline_registries" +} + +// ============================================ +// PipelineStage 流水线阶段定义(JSON) +// ============================================ + +// PipelineStage 一个阶段包含多个任务 +type PipelineStage struct { + ID string `json:"id"` + Name string `json:"name"` + Type string `json:"type"` // source/build/deploy/test/custom + Tasks []PipelineTask `json:"tasks"` +} + +// PipelineTask 阶段内的任务 +type PipelineTask struct { + ID string `json:"id"` + Name string `json:"name"` + Type string `json:"type"` // build/deploy/test/custom + Icon string `json:"icon,omitempty"` + Config map[string]string `json:"config,omitempty"` + Script string `json:"script,omitempty"` + ScriptType string `json:"script_type,omitempty"` // shell/python +} + +// ============================================ +// DeployEnvironment 发布环境分组 +// ============================================ + +type EnvironmentType string + +const ( + EnvProduction EnvironmentType = "production" + EnvStaging EnvironmentType = "staging" + EnvTesting EnvironmentType = "testing" + EnvDev EnvironmentType = "development" +) + +// DeployEnvironment 环境分组表(生产/测试/预发布/开发) +type DeployEnvironment struct { + ID uint `gorm:"primaryKey;autoIncrement;comment:主键ID" json:"id"` + Name string `gorm:"type:varchar(64);not null;uniqueIndex;comment:环境名称" json:"name"` + DisplayName string `gorm:"type:varchar(128);not null;comment:显示名称" json:"display_name"` + Type EnvironmentType `gorm:"type:varchar(16);not null;index;comment:环境类型: production/staging/testing/development" json:"type"` + Color string `gorm:"type:varchar(16);default:'#3B82F6';comment:标识颜色" json:"color"` + SortOrder int `gorm:"default:0;comment:排序" json:"sort_order"` + Description string `gorm:"type:varchar(256);comment:描述" json:"description,omitempty"` + Enabled bool `gorm:"default:true;comment:是否启用" json:"enabled"` + CreatedAt time.Time `gorm:"not null;comment:创建时间" json:"created_at"` + UpdatedAt time.Time `gorm:"not null;comment:更新时间" json:"updated_at"` +} + +func (DeployEnvironment) TableName() string { + return "deploy_environments" +} + +// ============================================ +// DeployPipelineMember 流水线成员 +// ============================================ + +type MemberRole string + +const ( + MemberOwner MemberRole = "owner" // 拥有者 + MemberEditor MemberRole = "editor" // 编辑者 + MemberViewer MemberRole = "viewer" // 查看者 +) + +// DeployPipelineMember 流水线成员表 +// 支持两种授权方式:直接用户授权(username 非空)和用户组授权(group_id 非空) +type DeployPipelineMember struct { + ID uint `gorm:"primaryKey;autoIncrement;comment:主键ID" json:"id"` + PipelineID uint `gorm:"index:idx_pipeline_user,unique,priority:1;index:idx_pipeline_group,unique,priority:1;not null;comment:流水线ID" json:"pipeline_id"` + Username *string `gorm:"type:varchar(64);index:idx_pipeline_user,unique,priority:2;comment:用户名(直接授权)" json:"username,omitempty"` + GroupID *uint `gorm:"index:idx_pipeline_group,unique,priority:2;comment:用户组ID(组授权)" json:"group_id,omitempty"` + Role MemberRole `gorm:"type:varchar(16);default:'editor';comment:角色: owner/editor/viewer" json:"role"` + CreatedAt time.Time `gorm:"not null;comment:创建时间" json:"created_at"` + UpdatedAt time.Time `gorm:"not null;comment:更新时间" json:"updated_at"` + + // 关联 + Pipeline *Pipeline `json:"pipeline,omitempty" gorm:"foreignKey:PipelineID"` + Group *DeployUserGroup `json:"group,omitempty" gorm:"foreignKey:GroupID"` +} + +func (DeployPipelineMember) TableName() string { + return "deploy_pipeline_members" +} + +// ============================================ +// DeployUserGroup 发布系统用户组 +// ============================================ + +// DeployUserGroup 用户组(用于流水线权限分组授权) +type DeployUserGroup struct { + ID uint `gorm:"primaryKey;autoIncrement;comment:主键ID" json:"id"` + Name string `gorm:"type:varchar(64);uniqueIndex;not null;comment:组名称" json:"name"` + Description string `gorm:"type:varchar(256);comment:描述" json:"description,omitempty"` + CreatedBy string `gorm:"type:varchar(64);comment:创建人" json:"created_by,omitempty"` + CreatedAt time.Time `gorm:"not null;comment:创建时间" json:"created_at"` + UpdatedAt time.Time `gorm:"not null;comment:更新时间" json:"updated_at"` + + // 关联 + Members []DeployUserGroupMember `json:"members,omitempty" gorm:"foreignKey:GroupID"` +} + +func (DeployUserGroup) TableName() string { + return "deploy_user_groups" +} + +// ============================================ +// DeployUserGroupMember 用户组成员 +// ============================================ + +// DeployUserGroupMember 用户组成员关联表 +type DeployUserGroupMember struct { + ID uint `gorm:"primaryKey;autoIncrement;comment:主键ID" json:"id"` + GroupID uint `gorm:"uniqueIndex:idx_group_user;not null;comment:组ID" json:"group_id"` + Username string `gorm:"type:varchar(64);uniqueIndex:idx_group_user;not null;comment:用户名" json:"username"` + CreatedAt time.Time `gorm:"not null;comment:创建时间" json:"created_at"` + + // 关联 + Group *DeployUserGroup `json:"group,omitempty" gorm:"foreignKey:GroupID"` +} + +func (DeployUserGroupMember) TableName() string { + return "deploy_user_group_members" +} diff --git a/backend/internal/models/user.go b/backend/internal/models/user.go index 420ef89..6979aac 100644 --- a/backend/internal/models/user.go +++ b/backend/internal/models/user.go @@ -69,6 +69,40 @@ func (Permission) TableName() string { return "iam_permissions" } +// ItemRole Jenkins-style Item Role — regex pipeline code matching +type ItemRole struct { + ID uint `gorm:"primarykey" json:"id"` + Name string `gorm:"size:64;not null" json:"name"` + Code string `gorm:"size:64;uniqueIndex;not null" json:"code"` + Pattern string `gorm:"size:255;not null;comment:正则表达式匹配流水线code" json:"pattern"` + Role string `gorm:"size:16;default:'editor';comment:角色owner/editor/viewer" json:"role"` + Description string `gorm:"size:255" json:"description"` + Status int `gorm:"default:1;comment:0禁用1启用" json:"status"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` +} + +// TableName 表名 +func (ItemRole) TableName() string { + return "iam_item_roles" +} + +// UserItemRole user ↔ item_role association +type UserItemRole struct { + ID uint `gorm:"primarykey" json:"id"` + UserID uint `gorm:"uniqueIndex:idx_user_item_role;not null" json:"user_id"` + ItemRoleID uint `gorm:"uniqueIndex:idx_user_item_role;not null" json:"item_role_id"` + CreatedAt time.Time `json:"created_at"` + + User *User `json:"user,omitempty" gorm:"foreignKey:UserID"` + ItemRole *ItemRole `json:"item_role,omitempty" gorm:"foreignKey:ItemRoleID"` +} + +// TableName 表名 +func (UserItemRole) TableName() string { + return "iam_user_item_roles" +} + // LoginRequest 登录请求 type LoginRequest struct { Username string `json:"username" binding:"required"` @@ -111,11 +145,36 @@ type CreateRoleRequest struct { // UpdateRoleRequest 更新角色请求 // Logan.Li type UpdateRoleRequest struct { - Name string `json:"name" binding:"omitempty,min=1,max=64"` - Code string `json:"code" binding:"omitempty,min=1,max=64"` + Name string `json:"name" binding:"omitempty,min=1,max=64"` + Code string `json:"code" binding:"omitempty,min=1,max=64"` Description *string `json:"description"` - Status *int `json:"status"` - PermissionIDs []uint `json:"permission_ids"` + Status *int `json:"status"` + PermissionIDs []uint `json:"permission_ids"` +} + +// CreateItemRoleRequest 创建Item Role请求 +type CreateItemRoleRequest struct { + Name string `json:"name" binding:"required,min=1,max=64"` + Code string `json:"code" binding:"required,min=1,max=64"` + Pattern string `json:"pattern" binding:"required,max=255"` + Role string `json:"role" binding:"oneof=owner editor viewer"` + Description string `json:"description"` +} + +// UpdateItemRoleRequest 更新Item Role请求 +type UpdateItemRoleRequest struct { + Name string `json:"name" binding:"omitempty,min=1,max=64"` + Code string `json:"code" binding:"omitempty,min=1,max=64"` + Pattern string `json:"pattern" binding:"omitempty,max=255"` + Role string `json:"role" binding:"omitempty,oneof=owner editor viewer"` + Description string `json:"description"` + Status *int `json:"status"` +} + +// AssignItemRoleRequest 分配Item Role给用户 +type AssignItemRoleRequest struct { + UserID uint `json:"user_id" binding:"required"` + ItemRoleID uint `json:"item_role_id" binding:"required"` } // ChangePasswordRequest 修改密码请求 diff --git a/backend/pkg/database/database.go b/backend/pkg/database/database.go index ba21ba7..05ca767 100644 --- a/backend/pkg/database/database.go +++ b/backend/pkg/database/database.go @@ -119,6 +119,19 @@ func AutoMigrate(db *gorm.DB) error { &models.PrometheusDataSource{}, // Prometheus 数据源配置 // Logan.Li &models.ZabbixDataSource{}, // Zabbix 数据源配置 // Logan.Li &models.Credential{}, // 凭据管理(SSH密钥/API Token) // Logan.Li + &models.PipelineRepo{}, // Git 仓库认证 // Logan.Li + &models.PipelineRegistry{}, // 镜像仓库认证 // Logan.Li + &models.DeployEnvironment{}, // 发布环境分组 // Logan.Li + &models.DeployPipelineMember{}, // 流水线成员 // Logan.Li + &models.DeployUserGroup{}, // 用户组 // Logan.Li + &models.DeployUserGroupMember{}, // 用户组成员 // Logan.Li + &models.ItemRole{}, // Jenkins-style Item Role (regex pipeline matching) // Logan.Li + &models.UserItemRole{}, // User ↔ ItemRole association // Logan.Li + &models.AlertCondition{}, // 告警条件 // Logan.Li + &models.AlertNotifyTemplate{}, // 告警通知模板 // Logan.Li + &models.AlertUpgrade{}, // 告警升级策略 // Logan.Li + &models.AlertUpgradeRecord{}, // 告警升级记录 // Logan.Li + &models.AlertSilence{}, // 告警静默 // Logan.Li } var lastErr error diff --git a/backend/pkg/redis/go_redis.go b/backend/pkg/redis/go_redis.go index 6834e4e..eb7ea86 100644 --- a/backend/pkg/redis/go_redis.go +++ b/backend/pkg/redis/go_redis.go @@ -93,3 +93,7 @@ func (r *goRedisCache) ZRangeByScore(ctx context.Context, key string, min, max s func (r *goRedisCache) ZRemRangeByScore(ctx context.Context, key string, min, max string) error { return r.client.ZRemRangeByScore(ctx, key, min, max).Err() } + +func (r *goRedisCache) Publish(ctx context.Context, channel string, message string) error { + return r.client.Publish(ctx, channel, message).Err() +} diff --git a/backend/pkg/redis/redis.go b/backend/pkg/redis/redis.go index e947b21..e313354 100644 --- a/backend/pkg/redis/redis.go +++ b/backend/pkg/redis/redis.go @@ -50,6 +50,9 @@ type Cache interface { Ping(ctx context.Context) error Close() error + // Pub/Sub(实时日志推送) + Publish(ctx context.Context, channel string, message string) error + // 有序集合操作(热数据指标存储,仅 go-redis 后端完整支持) ZAdd(ctx context.Context, key string, member SortedSetMember) error ZRangeByScore(ctx context.Context, key string, min, max string) ([]SortedSetMember, error) diff --git a/backend/pkg/redis/redka.go b/backend/pkg/redis/redka.go index 88f8ddc..2ba4d12 100644 --- a/backend/pkg/redis/redka.go +++ b/backend/pkg/redis/redka.go @@ -111,3 +111,9 @@ func (r *redkaCache) ZRangeByScore(ctx context.Context, key string, min, max str func (r *redkaCache) ZRemRangeByScore(ctx context.Context, key string, min, max string) error { return errSortedSetNotSupported } + +var errPubSubNotSupported = fmt.Errorf("Pub/Sub is not supported by the redka backend; use go-redis (driver=redis)") + +func (r *redkaCache) Publish(ctx context.Context, channel string, message string) error { + return errPubSubNotSupported +} diff --git a/backend/server b/backend/server new file mode 100755 index 0000000000000000000000000000000000000000..c7afeac2da9adc10d581aa61b54c5a3fc786221e GIT binary patch literal 30356096 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

@(k#_^W?HFQHcC}T5cd%J@Axx;h1D`u#6IvW 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 z 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