fix: pre and post command execute #95

This commit is contained in:
duorameng
2026-05-11 19:49:55 +08:00
parent 02fe448c0f
commit 97ab8d8927
2 changed files with 58 additions and 33 deletions
+36 -18
View File
@@ -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,
}
// 立即执行任务(加入队列)
+22 -15
View File
@@ -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)