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 }