@ -3,8 +3,10 @@ package crontask
import (
"autogo/common"
"autogo/dbsql"
"autogo/device"
"autogo/models"
"autogo/monkey"
"fmt"
"strings"
"time"
@ -18,54 +20,84 @@ func CheckMonkeyTasks() {
}
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 ]
}
var device models . Device
db . Table ( "device" ) . Model ( models . Device { } ) . Where ( "project = ? AND product_name = ? AND platform = ? AND status = ?" , task . Project , product_name , task . Platform , "online" ) . First ( & device )
if device . ID < 1 {
var d models . Device
db . Table ( "device" ) . Model ( models . Device { } ) . Where ( "project = ? AND product_name = ? AND platform = ? AND status = ?" , task . Project , product_name , task . Platform , "online" ) . First ( & d )
if d . ID < 1 {
// 没有空闲设备
continue
}
db . Table ( "device" ) . Model ( models . Device { } ) . Where ( "udid = ?" , device . Udid ) . Update ( "status" , "busy" )
go monkey . RunAndroidMonkeyCmd ( task , device . Udid )
common . PushCorntaskLog ( "执行Monkey任务: " + task . Project + "-" + device . Udid )
// 占用设备
db . Table ( "device" ) . Model ( models . Device { } ) . 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 := task . Product
if strings . Contains ( task . Product , "-" ) {
product_name = strings . Split ( task . Product , "-" ) [ 0 ]
}
var device models . Device
db . Table ( "device" ) . Model ( models . Device { } ) . Where ( "project = ? AND product_name = ? AND platform = ? AND status = ?" , task . Project , product_name , task . Platform , "online" ) . First ( & device )
if device . ID < 1 {
// 获取product.id
var _p models . ProductV2
db_oms . Table ( _p . TableName ( ) ) . Model ( models . DeviceV2 { } ) . Where ( "product_line = ? AND platform = ?" , product_name , "ios" ) . 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
}
db . Table ( "device" ) . Model ( models . Device { } ) . Where ( "udid = ?" , device . Udid ) . Update ( "status" , "busy" )
// go monkey.RunAndroidMonkeyCmd(task, device.Udid)
go monkey . RuniOSMonkeyByDocker ( task , device . Udid )
common . PushCorntaskLog ( "执行Monkey任务: " + task . Project + "-" + device . Udid )
// 占用设备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 {
for _ , v := range list {
if v . Platform == "adr" {
// 如果无对应正在运行的容器,判断为【结束】或【异常停止】
if len ( monkey . GetTaskFromDocker ( v . Id ) ) == 0 {
// 如果预期结束时间(任务开始时间+运行时间) < 当前时间,判断任务为运行正常结束
if v . Update Time+ v . RunTime < int ( time . Now ( ) . Unix ( ) ) {
list [ i ] . Status = "FINISH"
db . Table ( v . TableName ( ) ) . Model ( models . MonkeyTask { } ) . Where ( "id = ?" , v . Id ) . Update ( "status" , list [ i ] . Status )
common . PushMonkeyResult ( v )
if v . Start Time+ v . RunTime < int ( time . Now ( ) . Unix ( ) ) {
// list[i].Status = "FINISH"
// db.Table(v.TableName()).Model(models.MonkeyTask{}).Where("id = ?", v.Id).Update("status", list[i].Status)
// common.PushMonkeyResult(v)
} else {
common . PushCorntaskLog ( "任务状态似乎异常, task_id=" + cast . ToString ( v . Id ) )
}