|
|
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 {
|
|
|
if last_time, ok := common.DingTime[v.Id]; ok {
|
|
|
common.PushCorntaskLog("任务状态似乎异常,task_id=" + cast.ToString(v.Id))
|
|
|
} else {
|
|
|
// 十分钟间隔报一次
|
|
|
if time.Now().Unix()-60*10 > last_time.Unix() {
|
|
|
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))
|
|
|
}
|
|
|
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|