diff --git a/agent/agent.go b/agent/agent.go index e91ea03..72480a1 100644 --- a/agent/agent.go +++ b/agent/agent.go @@ -506,10 +506,13 @@ func (a *Agent) handleTasks(data json.RawMessage) { func (a *Agent) handleExecute(data json.RawMessage) { var req struct { - TaskID string `json:"task_id"` - LogID string `json:"log_id"` - Envs string `json:"envs"` - Secrets []string `json:"secrets"` + TaskID string `json:"task_id"` + LogID string `json:"log_id"` + Envs string `json:"envs"` + Secrets []string `json:"secrets"` + Command string `json:"command"` + PreCommand string `json:"pre_command"` + PostCommand string `json:"post_command"` } if err := json.Unmarshal(data, &req); err != nil { logger.Errorf("解析立即执行请求失败: %v", err) @@ -527,26 +530,41 @@ func (a *Agent) handleExecute(data json.RawMessage) { } // 准备执行请求 - // 如果消息中携带了环境变量,则优先使用(通常由服务端解析好后推过来) + // 如果消息中携带了环境变量或指令,则优先使用(确保即时生效) envs := task.Envs if req.Envs != "" { envs = req.Envs } + command := task.Command + if req.Command != "" { + command = req.Command + } + + preCommand := task.PreCommand + if req.PreCommand != "" { + preCommand = req.PreCommand + } + + postCommand := task.PostCommand + if req.PostCommand != "" { + postCommand = req.PostCommand + } + execReq := &executor.ExecutionRequest{ - TaskID: task.ID, - LogID: req.LogID, - Name: task.Name, - Command: task.Command, - PreCommand: task.PreCommand, - PostCommand: task.PostCommand, - WorkDir: task.WorkDir, - Envs: executor.ParseEnvVars(envs), - Secrets: req.Secrets, - Timeout: task.Timeout, - Languages: task.Languages, - UseMise: task.UseMise(), - Type: executor.TaskTypeManual, + TaskID: task.ID, + LogID: req.LogID, + Name: task.Name, + Command: command, + PreCommand: preCommand, + PostCommand: postCommand, + WorkDir: task.WorkDir, + Envs: executor.ParseEnvVars(envs), + Secrets: req.Secrets, + Timeout: task.Timeout, + Languages: task.Languages, + UseMise: task.UseMise(), + Type: executor.TaskTypeManual, } // 立即执行任务(加入队列) diff --git a/internal/services/tasks/executor_service.go b/internal/services/tasks/executor_service.go index 1a91ea2..02c5c54 100644 --- a/internal/services/tasks/executor_service.go +++ b/internal/services/tasks/executor_service.go @@ -450,11 +450,13 @@ func (es *ExecutorService) ExecuteDispatcher(ctx context.Context, req *executor. // 系统任务(无 taskID)直接本地执行 if task == nil { return executor.Execute(ctx, executor.Request{ - Command: req.Command, - WorkDir: req.WorkDir, - Envs: req.Envs, - Timeout: req.Timeout, - UseMise: false, // 系统任务不使用 mise + Command: req.Command, + PreCommand: req.PreCommand, + PostCommand: req.PostCommand, + WorkDir: req.WorkDir, + Envs: req.Envs, + Timeout: req.Timeout, + UseMise: false, // 系统任务不使用 mise }, stdout, stderr) } @@ -476,12 +478,14 @@ func (es *ExecutorService) ExecuteDispatcher(ctx context.Context, req *executor. // 本地任务 hooks := &LocalTaskHooks{es: es, logID: req.LogID} return executor.ExecuteWithHooks(ctx, executor.Request{ - Command: req.Command, - WorkDir: req.WorkDir, - Envs: req.Envs, - Timeout: req.Timeout, - Languages: []map[string]string(task.Languages), - UseMise: req.UseMise, // 使用请求中的 UseMise 标志 (由调度器统一处理过) + Command: req.Command, + PreCommand: req.PreCommand, + PostCommand: req.PostCommand, + WorkDir: req.WorkDir, + Envs: req.Envs, + Timeout: req.Timeout, + Languages: []map[string]string(task.Languages), + UseMise: req.UseMise, // 使用请求中的 UseMise 标志 (由调度器统一处理过) }, stdout, stderr, hooks) } @@ -1005,10 +1009,13 @@ func (es *ExecutorService) ExecuteRemoteForScheduler(task *models.Task, logID st // 3. 发送指令 err := es.agentWSManager.SendToAgent(agentID, constant.WSTypeExecute, map[string]interface{}{ - "task_id": task.ID, - "log_id": logID, - "envs": envs, - "secrets": secrets, + "task_id": task.ID, + "log_id": logID, + "envs": envs, + "secrets": secrets, + "command": task.Command, + "pre_command": task.PreCommand, + "post_command": task.PostCommand, }) if err != nil { return nil, fmt.Errorf("发送执行命令失败: %v", err)