feat: complete mise env base code
This commit is contained in:
@@ -78,6 +78,9 @@ func (m *CronManager) AddTask(task CronTask) error {
|
||||
timeout := task.GetTimeout()
|
||||
workDir := task.GetWorkDir()
|
||||
envs := task.GetEnvs()
|
||||
language := task.GetLanguage()
|
||||
langVersion := task.GetLangVersion()
|
||||
useMise := task.UseMise()
|
||||
|
||||
entryID, err := m.cron.AddFunc(task.GetSchedule(), func() {
|
||||
defer func() {
|
||||
@@ -88,13 +91,16 @@ func (m *CronManager) AddTask(task CronTask) error {
|
||||
m.logger.Infof("[CronManager] 触发计划任务 #%s (%s)", taskID, name)
|
||||
|
||||
req := &ExecutionRequest{
|
||||
TaskID: taskID,
|
||||
Name: name,
|
||||
Command: cmd,
|
||||
Type: TaskTypeCron,
|
||||
Timeout: timeout,
|
||||
WorkDir: workDir,
|
||||
Envs: ParseEnvVars(envs),
|
||||
TaskID: taskID,
|
||||
Name: name,
|
||||
Command: cmd,
|
||||
Type: TaskTypeCron,
|
||||
Timeout: timeout,
|
||||
WorkDir: workDir,
|
||||
Envs: ParseEnvVars(envs),
|
||||
Language: language,
|
||||
LangVersion: langVersion,
|
||||
UseMise: useMise,
|
||||
}
|
||||
|
||||
// 如果有关联的 Scheduler,加入队列执行
|
||||
@@ -116,7 +122,12 @@ func (m *CronManager) AddTask(task CronTask) error {
|
||||
|
||||
// 初始触发一次下次运行时间通知
|
||||
go func() {
|
||||
req := &ExecutionRequest{TaskID: taskID, Name: name, Type: TaskTypeCron}
|
||||
req := &ExecutionRequest{
|
||||
TaskID: taskID,
|
||||
Name: name,
|
||||
Type: TaskTypeCron,
|
||||
UseMise: task.UseMise(),
|
||||
}
|
||||
m.triggerNextRunEvent(taskID, req)
|
||||
}()
|
||||
|
||||
|
||||
@@ -23,20 +23,27 @@ type Task interface {
|
||||
GetTimeout() int
|
||||
GetWorkDir() string
|
||||
GetEnvs() string
|
||||
GetLanguage() string
|
||||
GetLangVersion() string
|
||||
GetUseMise() bool
|
||||
}
|
||||
|
||||
// CronTask 计划任务接口
|
||||
type CronTask interface {
|
||||
Task
|
||||
GetSchedule() string
|
||||
UseMise() bool
|
||||
}
|
||||
|
||||
// Request 任务执行请求
|
||||
type Request struct {
|
||||
Command string
|
||||
WorkDir string
|
||||
Envs []string
|
||||
Timeout int // 任务超时时间(分钟)
|
||||
Command string
|
||||
WorkDir string
|
||||
Envs []string
|
||||
Timeout int // 任务超时时间(分钟)
|
||||
Language string
|
||||
LangVersion string
|
||||
UseMise bool
|
||||
}
|
||||
|
||||
// Result 任务执行结果
|
||||
@@ -96,6 +103,9 @@ func ExecuteWithHooks(ctx context.Context, req Request, stdout, stderr io.Writer
|
||||
defer cancel()
|
||||
|
||||
finalCommand := req.Command
|
||||
if req.UseMise {
|
||||
finalCommand = BuildLanguageCommand(req.Command, req.Language, req.LangVersion)
|
||||
}
|
||||
shell, args := utils.GetShellCommand(finalCommand)
|
||||
cmd := exec.CommandContext(execCtx, shell, args...)
|
||||
|
||||
@@ -272,6 +282,18 @@ func ExecuteWithHooks(ctx context.Context, req Request, stdout, stderr io.Writer
|
||||
return result, err
|
||||
}
|
||||
|
||||
// BuildLanguageCommand 构建语言环境执行命令 (使用 mise)
|
||||
func BuildLanguageCommand(command, language, version string) string {
|
||||
if language == "" {
|
||||
return command
|
||||
}
|
||||
v := version
|
||||
if v == "" {
|
||||
v = "latest"
|
||||
}
|
||||
return "mise exec " + language + "@" + v + " -- " + command
|
||||
}
|
||||
|
||||
// ParseEnvVars 解析环境变量字符串 "KEY1=VALUE1,KEY2=VALUE2"
|
||||
func ParseEnvVars(envStr string) []string {
|
||||
if envStr == "" {
|
||||
|
||||
@@ -61,15 +61,18 @@ const (
|
||||
|
||||
// ExecutionRequest 执行请求(标准接口)
|
||||
type ExecutionRequest struct {
|
||||
TaskID string // 任务 ID
|
||||
LogID uint // 日志 ID
|
||||
Name string // 任务名称
|
||||
Type TaskType // 任务类型
|
||||
Command string // 命令
|
||||
WorkDir string // 工作目录
|
||||
Envs []string // 环境变量
|
||||
Timeout int // 超时时间(分钟)
|
||||
Metadata map[string]interface{} // 额外元数据
|
||||
TaskID string // 任务 ID
|
||||
LogID uint // 日志 ID
|
||||
Name string // 任务名称
|
||||
Type TaskType // 任务类型
|
||||
Command string // 命令
|
||||
WorkDir string // 工作目录
|
||||
Envs []string // 环境变量
|
||||
Timeout int // 超时时间(分钟)
|
||||
Language string // 语言环境
|
||||
LangVersion string // 语言版本
|
||||
UseMise bool // 是否使用 mise
|
||||
Metadata map[string]interface{} // 额外元数据
|
||||
}
|
||||
|
||||
// ExecutionResult 执行结果(标准接口)
|
||||
@@ -194,10 +197,13 @@ func NewScheduler(config SchedulerConfig, handler SchedulerEventHandler) *Schedu
|
||||
executor: func(ctx context.Context, req *ExecutionRequest, stdout, stderr io.Writer) (*Result, error) {
|
||||
hooks := &schedulerHooksAdapter{handler: handler, req: req}
|
||||
return ExecuteWithHooks(ctx, Request{
|
||||
Command: req.Command,
|
||||
WorkDir: req.WorkDir,
|
||||
Envs: req.Envs,
|
||||
Timeout: req.Timeout,
|
||||
Command: req.Command,
|
||||
WorkDir: req.WorkDir,
|
||||
Envs: req.Envs,
|
||||
Timeout: req.Timeout,
|
||||
Language: req.Language,
|
||||
LangVersion: req.LangVersion,
|
||||
UseMise: req.UseMise,
|
||||
}, stdout, stderr, hooks)
|
||||
},
|
||||
taskQueue: make(chan *ExecutionRequest, config.QueueSize),
|
||||
@@ -309,6 +315,12 @@ func (s *Scheduler) executeTask(req *ExecutionRequest) (*ExecutionResult, error)
|
||||
|
||||
s.logger.Infof("[Scheduler] 执行任务 %s (名称: %s, 类型: %s)", req.TaskID, req.Name, req.Type)
|
||||
|
||||
finalCommand := req.Command
|
||||
if req.UseMise {
|
||||
finalCommand = BuildLanguageCommand(req.Command, req.Language, req.LangVersion)
|
||||
}
|
||||
s.logger.Infof("[Scheduler] 实际执行命令: %s", finalCommand)
|
||||
|
||||
if s.config.Verbose {
|
||||
workDir := req.WorkDir
|
||||
if workDir == "" {
|
||||
|
||||
Reference in New Issue
Block a user