package crontask import ( "autogo/common" "autogo/dbsql" "autogo/device" "autogo/models" "autogo/monkey" "fmt" "strings" "time" "github.com/spf13/cast" ) func CheckMonkeyTasks() { db, err := dbsql.GetConn(dbsql.DSN) if err != nil { return } defer dbsql.Close(db) db_oms, err := dbsql.GetConn(dbsql.DSN_qaoms()) if err != nil { return } defer dbsql.Close(db_oms) var list []models.MonkeyTask db.Model(models.MonkeyTask{}).Where("status = ? AND is_del = 0", "WAITTING").Find(&list) // 运行等待中的任务 for _, task := range list { // 获取当前时间并-24h oneDayBefore := time.Now().Add(-24 * time.Hour) timestampTime := time.Unix(int64(task.CreateTime), 0) // 如果任务超过24小时则取消 if timestampTime.Before(oneDayBefore) { db.Table(task.TableName()).Model(models.MonkeyTask{}).Where("id = ?", task.Id).Update("status", "CANCEL") fmt.Println("Monkey任务", task.Id, "已超时取消") continue } // 按平台执行逻辑 if task.Platform == "adr" { product_name := task.Product if strings.Contains(task.Product, "-") { product_name = strings.Split(task.Product, "-")[0] } // 获取product.id var _p models.QaProduct db_oms.Table(_p.TableName()).Model(models.QaProduct{}).Where("label = ?", product_name).Last(&_p) if _p.ID < 1 { fmt.Println("找不到产品,", product_name) // 找不到对应的产品 continue } var d models.DeviceV2 db_oms.Table("qa_devices").Model(models.DeviceV2{}).Where("product_id = ? AND platform = ? AND status = ? AND is_enabled = 1", _p.ID, task.Platform, "online").First(&d) if d.ID < 1 { // 没有空闲设备 continue } // 占用设备 db_oms.Table("qa_devices").Model(models.DeviceV2{}).Where("udid = ?", d.Udid).Update("status", "busy") go monkey.RunAndroidMonkeyCmd(task, d.Udid) db.Table(task.TableName()).Model(models.MonkeyTask{}).Where("id = ?", task.Id).Update("start_time", time.Now().Unix()) common.PushCorntaskLog("执行Monkey任务:" + task.Project + "-" + d.Udid) } else if task.Platform == "ios" { product_name := strings.ToLower(task.Product) if strings.Contains(task.Product, "-") { product_name = strings.Split(task.Product, "-")[0] } // 获取product.id var _p models.QaProduct db_oms.Table(_p.TableName()).Model(models.QaProduct{}).Where("label = ?", product_name).Last(&_p) if _p.ID < 1 { fmt.Println("找不到产品,", product_name) // 找不到对应的产品 continue } // 获取产品对应的空闲设备 var _d models.DeviceV2 db_oms.Table(_d.TableName()).Model(models.DeviceV2{}).Where("product_id = ? AND platform = ? AND status = ? AND is_enabled = 1", _p.ID, task.Platform, "online").First(&_d) if _d.ID < 1 { // 没有空闲设备 continue } // 占用设备V2 device.UpdateStatus(_d.Udid, "ready", "设备占用-Monkey任务"+cast.ToString(task.Id)+"") // db.Table("device").Model(models.Device{}).Where("udid = ?", d.Udid).Update("status", "busy") go monkey.RuniOSMonkeyByDocker(task, _d.Udid) db.Table(task.TableName()).Model(models.MonkeyTask{}).Where("id = ?", task.Id).Update("start_time", time.Now().Unix()) common.PushCorntaskLog("执行Monkey任务:" + task.Project + "-" + _d.Udid) } } // 判断运行中的任务的实际状态 db.Model(models.MonkeyTask{}).Where("status = ? AND is_del = 0", "RUNNING").Find(&list) for i, v := range list { if v.Platform == "adr" { // 如果无对应正在运行的容器,判断为【结束】或【异常停止】 if len(monkey.GetTaskFromDocker(v.Id)) == 0 { // 如果预期结束时间(任务开始时间+运行时间) < 当前时间,判断任务为运行正常结束 if v.StartTime+v.RunTime+300 < int(time.Now().Unix()) { list[i].Status = "FINISH" db.Table(v.TableName()).Model(models.MonkeyTask{}).Where("id = ?", v.Id).Update("status", "FINISH") db.Table(v.TableName()).Model(models.MonkeyTask{}).Where("id = ?", v.Id).Update("end_time", time.Now().Unix()) common.PushCorntaskLog("[autogo] 任务标记为FINISH, " + cast.ToString(v.Id)) common.PushMonkeyResult(v) } else { common.PushCorntaskLog("任务状态似乎异常,task_id=" + cast.ToString(v.Id)) } } else { // 预期结束时间(任务开始时间+运行时间) < 当前时间,判断任务为运行正常结束 if v.StartTime+v.RunTime+300 < int(time.Now().Unix()) { list[i].Status = "FINISH" db.Table(v.TableName()).Model(models.MonkeyTask{}).Where("id = ?", v.Id).Update("status", list[i].Status) db.Table(v.TableName()).Model(models.MonkeyTask{}).Where("id = ?", v.Id).Update("end_time", time.Now().Unix()) // 释放设备 db_oms.Table("qa_devices").Model(models.DeviceV2{}).Where("udid = ?", v.Devices).Update("status", "online") common.PushCorntaskLog("[autogo] 任务标记为FINISH, 但容器未退出, task_id=" + cast.ToString(v.Id)) } } } } }