feat: add multi env setting support

This commit is contained in:
engigu
2026-02-13 19:26:20 +08:00
parent 8a52be9241
commit 3ab1ddc03a
13 changed files with 322 additions and 302 deletions
+10 -12
View File
@@ -78,8 +78,7 @@ func (m *CronManager) AddTask(task CronTask) error {
timeout := task.GetTimeout()
workDir := task.GetWorkDir()
envs := task.GetEnvs()
language := task.GetLanguage()
langVersion := task.GetLangVersion()
languages := task.GetLanguages()
useMise := task.UseMise()
entryID, err := m.cron.AddFunc(task.GetSchedule(), func() {
@@ -91,16 +90,15 @@ 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),
Language: language,
LangVersion: langVersion,
UseMise: useMise,
TaskID: taskID,
Name: name,
Command: cmd,
Type: TaskTypeCron,
Timeout: timeout,
WorkDir: workDir,
Envs: ParseEnvVars(envs),
Languages: languages,
UseMise: useMise,
}
// 如果有关联的 Scheduler,加入队列执行
+27 -16
View File
@@ -23,8 +23,7 @@ type Task interface {
GetTimeout() int
GetWorkDir() string
GetEnvs() string
GetLanguage() string
GetLangVersion() string
GetLanguages() []map[string]string
GetUseMise() bool
}
@@ -37,13 +36,12 @@ type CronTask interface {
// Request 任务执行请求
type Request struct {
Command string
WorkDir string
Envs []string
Timeout int // 任务超时时间(分钟)
Language string
LangVersion string
UseMise bool
Command string
WorkDir string
Envs []string
Timeout int // 任务超时时间(分钟)
Languages []map[string]string
UseMise bool
}
// Result 任务执行结果
@@ -104,7 +102,7 @@ func ExecuteWithHooks(ctx context.Context, req Request, stdout, stderr io.Writer
finalCommand := req.Command
if req.UseMise {
finalCommand = BuildLanguageCommand(req.Command, req.Language, req.LangVersion)
finalCommand = BuildLanguageCommand(req.Command, req.Languages)
}
shell, args := utils.GetShellCommand(finalCommand)
cmd := exec.CommandContext(execCtx, shell, args...)
@@ -283,15 +281,28 @@ func ExecuteWithHooks(ctx context.Context, req Request, stdout, stderr io.Writer
}
// BuildLanguageCommand 构建语言环境执行命令 (使用 mise)
func BuildLanguageCommand(command, language, version string) string {
if language == "" {
func BuildLanguageCommand(command string, languages []map[string]string) string {
if len(languages) == 0 {
return command
}
v := version
if v == "" {
v = "latest"
var builder strings.Builder
builder.WriteString("mise exec")
for _, lang := range languages {
name := lang["name"]
version := lang["version"]
if name == "" {
continue
}
if version == "" {
version = "latest"
}
builder.WriteString(" " + name + "@" + version)
}
return "mise exec " + language + "@" + v + " -- " + command
builder.WriteString(" -- " + command)
return builder.String()
}
// ParseEnvVars 解析环境变量字符串 "KEY1=VALUE1,KEY2=VALUE2"
+18 -20
View File
@@ -61,18 +61,17 @@ const (
// ExecutionRequest 执行请求(标准接口)
type ExecutionRequest struct {
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{} // 额外元数据
TaskID string // 任务 ID
LogID uint // 日志 ID
Name string // 任务名称
Type TaskType // 任务类型
Command string // 命令
WorkDir string // 工作目录
Envs []string // 环境变量
Timeout int // 超时时间(分钟)
Languages []map[string]string // 语言环境配置
UseMise bool // 是否使用 mise
Metadata map[string]interface{} // 额外元数据
}
// ExecutionResult 执行结果(标准接口)
@@ -197,13 +196,12 @@ 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,
Language: req.Language,
LangVersion: req.LangVersion,
UseMise: req.UseMise,
Command: req.Command,
WorkDir: req.WorkDir,
Envs: req.Envs,
Timeout: req.Timeout,
Languages: req.Languages,
UseMise: req.UseMise,
}, stdout, stderr, hooks)
},
taskQueue: make(chan *ExecutionRequest, config.QueueSize),
@@ -317,7 +315,7 @@ func (s *Scheduler) executeTask(req *ExecutionRequest) (*ExecutionResult, error)
finalCommand := req.Command
if req.UseMise {
finalCommand = BuildLanguageCommand(req.Command, req.Language, req.LangVersion)
finalCommand = BuildLanguageCommand(req.Command, req.Languages)
}
s.logger.Infof("[Scheduler] 实际执行命令: %s", finalCommand)