chore: adjust task language model serializer
This commit is contained in:
@@ -44,6 +44,24 @@
|
|||||||
### 3. 多版本切换
|
### 3. 多版本切换
|
||||||
对于复杂的项目,您可以通过面板配置不同的任务版本镜像,系统基于 `mise exec` 实现了完善的环境隔离,不同版本的依赖包互不冲突。
|
对于复杂的项目,您可以通过面板配置不同的任务版本镜像,系统基于 `mise exec` 实现了完善的环境隔离,不同版本的依赖包互不冲突。
|
||||||
|
|
||||||
|
## 常用工具安装
|
||||||
|
|
||||||
|
如果您需要在面板环境中使用 Ansible 或其他通过 pipx 管理的工具,可以使用以下命令进行快速安装:
|
||||||
|
|
||||||
|
### 安装 Ansible
|
||||||
|
|
||||||
|
白虎面板推荐通过 `mise` 结合 `pipx` 安装 Ansible,以保持环境隔离且全局可用:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 首先安装 pipx
|
||||||
|
mise use -g pipx@latest
|
||||||
|
|
||||||
|
# 使用 pipx 安装 ansible
|
||||||
|
mise use -g ansible@latest
|
||||||
|
```
|
||||||
|
|
||||||
|
安装完成后,您可以在「脚本管理」或「定时任务」中直接调用 `ansible` 或 `ansible-playbook` 命令。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 隔离机制说明
|
## 隔离机制说明
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ func (tc *TaskController) CreateTask(c *gin.Context) {
|
|||||||
WorkDir string `json:"work_dir"`
|
WorkDir string `json:"work_dir"`
|
||||||
CleanConfig string `json:"clean_config"`
|
CleanConfig string `json:"clean_config"`
|
||||||
Envs string `json:"envs"`
|
Envs string `json:"envs"`
|
||||||
Languages []map[string]string `json:"languages"`
|
Languages models.TaskLanguages `json:"languages"`
|
||||||
AgentID *string `json:"agent_id"`
|
AgentID *string `json:"agent_id"`
|
||||||
TriggerType string `json:"trigger_type"`
|
TriggerType string `json:"trigger_type"`
|
||||||
RetryCount int `json:"retry_count"`
|
RetryCount int `json:"retry_count"`
|
||||||
@@ -231,7 +231,7 @@ func (tc *TaskController) UpdateTask(c *gin.Context) {
|
|||||||
CleanConfig string `json:"clean_config"`
|
CleanConfig string `json:"clean_config"`
|
||||||
Envs string `json:"envs"`
|
Envs string `json:"envs"`
|
||||||
Enabled bool `json:"enabled"`
|
Enabled bool `json:"enabled"`
|
||||||
Languages []map[string]string `json:"languages"`
|
Languages models.TaskLanguages `json:"languages"`
|
||||||
AgentID *string `json:"agent_id"`
|
AgentID *string `json:"agent_id"`
|
||||||
TriggerType string `json:"trigger_type"`
|
TriggerType string `json:"trigger_type"`
|
||||||
RetryCount int `json:"retry_count"`
|
RetryCount int `json:"retry_count"`
|
||||||
|
|||||||
+33
-2
@@ -1,11 +1,42 @@
|
|||||||
package models
|
package models
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"database/sql/driver"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
"github.com/engigu/baihu-panel/internal/constant"
|
"github.com/engigu/baihu-panel/internal/constant"
|
||||||
|
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// TaskLanguages 自定义语言配置列表类型,处理 JSON 序列化
|
||||||
|
type TaskLanguages []map[string]string
|
||||||
|
|
||||||
|
func (t TaskLanguages) Value() (driver.Value, error) {
|
||||||
|
if t == nil {
|
||||||
|
return "[]", nil
|
||||||
|
}
|
||||||
|
b, err := json.Marshal(t)
|
||||||
|
return string(b), err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *TaskLanguages) Scan(v interface{}) error {
|
||||||
|
if v == nil {
|
||||||
|
*t = nil
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
var data []byte
|
||||||
|
switch s := v.(type) {
|
||||||
|
case string:
|
||||||
|
data = []byte(s)
|
||||||
|
case []byte:
|
||||||
|
data = s
|
||||||
|
default:
|
||||||
|
return fmt.Errorf("invalid type for TaskLanguages: %T", v)
|
||||||
|
}
|
||||||
|
return json.Unmarshal(data, t)
|
||||||
|
}
|
||||||
|
|
||||||
// CleanConfig 清理配置结构
|
// CleanConfig 清理配置结构
|
||||||
type CleanConfig struct {
|
type CleanConfig struct {
|
||||||
Type string `json:"type"` // "day" 或 "count"
|
Type string `json:"type"` // "day" 或 "count"
|
||||||
@@ -51,7 +82,7 @@ type Task struct {
|
|||||||
WorkDir string `json:"work_dir" gorm:"size:255;default:''"` // 工作目录,为空则使用 scripts 目录
|
WorkDir string `json:"work_dir" gorm:"size:255;default:''"` // 工作目录,为空则使用 scripts 目录
|
||||||
CleanConfig string `json:"clean_config" gorm:"size:255;default:''"` // 清理配置 JSON
|
CleanConfig string `json:"clean_config" gorm:"size:255;default:''"` // 清理配置 JSON
|
||||||
Envs BigText `json:"envs"` // 环境变量ID列表,逗号分隔
|
Envs BigText `json:"envs"` // 环境变量ID列表,逗号分隔
|
||||||
Languages []map[string]string `json:"languages" gorm:"serializer:json"` // 针对本地任务的语言配置列表
|
Languages TaskLanguages `json:"languages" gorm:"type:text"` // 针对本地任务的语言配置列表
|
||||||
AgentID *string `json:"agent_id" gorm:"size:20;index"` // Agent ID,为空表示本地执行
|
AgentID *string `json:"agent_id" gorm:"size:20;index"` // Agent ID,为空表示本地执行
|
||||||
RetryCount int `json:"retry_count" gorm:"default:0"` // 失败重试次数
|
RetryCount int `json:"retry_count" gorm:"default:0"` // 失败重试次数
|
||||||
RetryInterval int `json:"retry_interval" gorm:"default:0"` // 失败重试间隔(秒)
|
RetryInterval int `json:"retry_interval" gorm:"default:0"` // 失败重试间隔(秒)
|
||||||
@@ -97,7 +128,7 @@ func (t *Task) GetEnvs() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (t *Task) GetLanguages() []map[string]string {
|
func (t *Task) GetLanguages() []map[string]string {
|
||||||
return t.Languages
|
return []map[string]string(t.Languages)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *Task) GetEnvVars() []string {
|
func (t *Task) GetEnvVars() []string {
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ type TaskVO struct {
|
|||||||
WorkDir string `json:"work_dir"`
|
WorkDir string `json:"work_dir"`
|
||||||
CleanConfig string `json:"clean_config"`
|
CleanConfig string `json:"clean_config"`
|
||||||
Envs string `json:"envs"`
|
Envs string `json:"envs"`
|
||||||
Languages []map[string]string `json:"languages"`
|
Languages models.TaskLanguages `json:"languages"`
|
||||||
AgentID *string `json:"agent_id"`
|
AgentID *string `json:"agent_id"`
|
||||||
RepoTaskID string `json:"repo_task_id"`
|
RepoTaskID string `json:"repo_task_id"`
|
||||||
Enabled bool `json:"enabled"`
|
Enabled bool `json:"enabled"`
|
||||||
|
|||||||
@@ -351,7 +351,7 @@ func (s *AgentService) GetTasks(agentID string) []models.AgentTask {
|
|||||||
Timeout: task.Timeout,
|
Timeout: task.Timeout,
|
||||||
WorkDir: task.WorkDir,
|
WorkDir: task.WorkDir,
|
||||||
Envs: envVarsStr,
|
Envs: envVarsStr,
|
||||||
Languages: task.Languages,
|
Languages: []map[string]string(task.Languages),
|
||||||
RandomRange: task.RandomRange,
|
RandomRange: task.RandomRange,
|
||||||
Enabled: task.Enabled,
|
Enabled: task.Enabled,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -378,7 +378,7 @@ func (es *ExecutorService) HandleTaskRetry(task *models.Task, req *executor.Exec
|
|||||||
WorkDir: latestTask.WorkDir,
|
WorkDir: latestTask.WorkDir,
|
||||||
Envs: newEnvs,
|
Envs: newEnvs,
|
||||||
Timeout: latestTask.Timeout,
|
Timeout: latestTask.Timeout,
|
||||||
Languages: latestTask.Languages,
|
Languages: []map[string]string(latestTask.Languages),
|
||||||
UseMise: latestTask.UseMise(),
|
UseMise: latestTask.UseMise(),
|
||||||
Type: executor.TaskTypeManual,
|
Type: executor.TaskTypeManual,
|
||||||
Metadata: executor.ExecutionMetadata{
|
Metadata: executor.ExecutionMetadata{
|
||||||
@@ -459,7 +459,7 @@ func (es *ExecutorService) ExecuteDispatcher(ctx context.Context, req *executor.
|
|||||||
WorkDir: req.WorkDir,
|
WorkDir: req.WorkDir,
|
||||||
Envs: req.Envs,
|
Envs: req.Envs,
|
||||||
Timeout: req.Timeout,
|
Timeout: req.Timeout,
|
||||||
Languages: task.Languages,
|
Languages: []map[string]string(task.Languages),
|
||||||
UseMise: req.UseMise, // 使用请求中的 UseMise 标志 (由调度器统一处理过)
|
UseMise: req.UseMise, // 使用请求中的 UseMise 标志 (由调度器统一处理过)
|
||||||
}, stdout, stderr, hooks)
|
}, stdout, stderr, hooks)
|
||||||
}
|
}
|
||||||
@@ -596,7 +596,7 @@ func (es *ExecutorService) ExecuteTask(taskID string, extraEnvs []string) *execu
|
|||||||
WorkDir: task.WorkDir,
|
WorkDir: task.WorkDir,
|
||||||
Envs: envs,
|
Envs: envs,
|
||||||
Timeout: task.Timeout,
|
Timeout: task.Timeout,
|
||||||
Languages: task.Languages,
|
Languages: []map[string]string(task.Languages),
|
||||||
UseMise: task.UseMise(),
|
UseMise: task.UseMise(),
|
||||||
Type: executor.TaskTypeManual,
|
Type: executor.TaskTypeManual,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ func (ts *TaskService) GetTaskBySourceID(sourceID string) *models.Task {
|
|||||||
return &task
|
return &task
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ts *TaskService) CreateTask(name, command, schedule string, timeout int, workDir, cleanConfig, envs, taskType, config string, agentID *string, languages []map[string]string, triggerType string, tags string, retryCount int, retryInterval int, randomRange int, sourceID string) *models.Task {
|
func (ts *TaskService) CreateTask(name, command, schedule string, timeout int, workDir, cleanConfig, envs, taskType, config string, agentID *string, languages models.TaskLanguages, triggerType string, tags string, retryCount int, retryInterval int, randomRange int, sourceID string) *models.Task {
|
||||||
if taskType == "" {
|
if taskType == "" {
|
||||||
taskType = "task"
|
taskType = "task"
|
||||||
}
|
}
|
||||||
@@ -99,7 +99,7 @@ func (ts *TaskService) GetTaskByID(id string) *models.Task {
|
|||||||
return &task
|
return &task
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ts *TaskService) UpdateTask(id string, name, command, schedule string, timeout int, workDir, cleanConfig, envs string, enabled bool, taskType, config string, agentID *string, languages []map[string]string, triggerType string, tags string, retryCount int, retryInterval int, randomRange int, sourceID string) *models.Task {
|
func (ts *TaskService) UpdateTask(id string, name, command, schedule string, timeout int, workDir, cleanConfig, envs string, enabled bool, taskType, config string, agentID *string, languages models.TaskLanguages, triggerType string, tags string, retryCount int, retryInterval int, randomRange int, sourceID string) *models.Task {
|
||||||
var task models.Task
|
var task models.Task
|
||||||
res := database.DB.Where("id = ?", id).Limit(1).Find(&task)
|
res := database.DB.Where("id = ?", id).Limit(1).Find(&task)
|
||||||
if res.Error != nil || res.RowsAffected == 0 {
|
if res.Error != nil || res.RowsAffected == 0 {
|
||||||
|
|||||||
Reference in New Issue
Block a user