go20/devops/agent/tasks/interface.go
2026-03-29 11:41:32 +08:00

61 lines
1.6 KiB
Go

package tasks
import (
"context"
"devops/agent/script"
"time"
)
var (
// Task 运行器注册表
taskRunnerRegistry = make(map[string]TaskRunner)
)
func RegisterTaskRunner(name string, runner TaskRunner) {
taskRunnerRegistry[name] = runner
}
func GetTaskRunner(name string) TaskRunner {
return taskRunnerRegistry[name]
}
// Task 是一个接口,定义了任务的基本行为
// 任务名称: task_debug, 任务描述: 调试任务, 任务类型: debug, 任务参数: {}
type TaskRunner interface {
// 任务需要的运行能力
Run(context.Context, *RunTaskRequest) (*script.ExecutionResult, error)
}
func NewRunTaskRequest(workDir string, name string) *RunTaskRequest {
return &RunTaskRequest{
WorkDir: workDir,
Name: name,
InputParams: make(map[string]string),
}
}
type RunTaskRequest struct {
// 任务名称, 比如 "build", "deploy" 每一个名称 在Agent测有一个唯一的Task与之对应
Name string `json:"name"`
// 运行参数, 比如构建任务的代码分支、部署任务的目标环境等 作为环境变量传递给任务脚本执行
InputParams map[string]string `json:"input_params"`
// 工作目录, 任务执行过程中产生的文件都放在这个目录下, 由Agent负责清理
WorkDir string `json:"work_dir"`
// 任务超时时间, 0表示不超时
TimeoutSecond int64 `json:"timeout_second"`
}
func (r *RunTaskRequest) SetInputParams(key, value string) *RunTaskRequest {
r.InputParams[key] = value
return r
}
func (t *RunTaskRequest) GetTimeout() time.Duration {
if t.TimeoutSecond > 0 {
return time.Duration(t.TimeoutSecond) * time.Second
}
return time.Duration(60) * time.Minute
}