package monkey import ( "autogo/common" "autogo/controllers" "autogo/dbsql" "autogo/models" "fmt" "net/http" "strings" "time" "github.com/gin-gonic/gin" log "github.com/sirupsen/logrus" "github.com/spf13/cast" "gorm.io/gorm" ) // @Tags Monkey相关 /api/monkey/v2/ // @Summary 新建Monkey任务 // @Description 新建Monkey任务,创建成功后将会发送指令到monkey服务,初始status为WAITTING-等待中 // @accept x-www-form-urlencoded // @Param project formData string true "项目名" // @Param product formData string true "产品名" // @Param package_name formData string true "应用包名" // @Param package_url formData string true "测试包下载链接" // @Param platform formData string true "平台adr/ios" // @Param run_time formData string false "运行时间(s),默认两小时(3600s)" // @Param launch_activity formData string false "安卓启动页名称" // @Param creator formData string false "任务创建者" // @Param referer formData string false "启动来源,web-平台启动,ci-持续集成" // @Param mode formData string false "调用服务的方式,0-cli模式/1-api模式,默认cli" // @Param remark formData string false "备注" // @Success 200 {object} models.Response "返回创建的任务id" // @Router /api/monkey/v2/create_task [post] func CreateTaskV2(c *gin.Context) { rsp := controllers.NewResponse() db, err := dbsql.GetConn(dbsql.DSN) if err != nil { rsp.Error(err.Error()) c.JSON(http.StatusOK, rsp) return } defer dbsql.Close(db) var task models.MonkeyTask // 必填 task.Project = strings.ToLower(c.PostForm("project")) task.Product = strings.ToLower(c.PostForm("product")) task.PackageName = c.PostForm("package_name") task.PackageURL = c.PostForm("package_url") task.Platform = c.PostForm("platform") // 选填项 task.RunTime = cast.ToInt(c.DefaultPostForm("run_time", "3600")) task.LaunchActivity = c.PostForm("launch_activity") task.Creator = c.PostForm("creator") task.Referer = c.DefaultPostForm("referer", "api") task.Status = "WAITTING" task.Remark = c.PostForm("remark") // 安卓需要获取launch_activity if task.Platform == "adr" { if c.PostForm("launch_activity") == "" { fmt.Println("从接口请求producct信息") product, err := common.GetProduct(task.Product, task.Platform) if err != nil { rsp.Error(err.Error()) c.JSON(http.StatusOK, rsp) return } task.LaunchActivity = product.LaunchActivity } // // 表单无传入,接口请求没有数据返回 // if task.LaunchActivity == "" { // rsp.Error("缺少LaunchActivity") // c.JSON(http.StatusOK, rsp) // return // } } if task.PackageURL != "" { app, e := common.GetBranch(task.PackageName, task.PackageURL) if e != nil { fmt.Println(e) } else { if task.Branch == "" { task.Branch = app.Branch } if task.Version == "" { if task.Platform == "ios" { task.Version = app.Version + "_" + cast.ToString(app.BuildNum) } else { task.Version = app.Version + "_" + app.VersionCode } } } } err = task.Check() if err != nil { rsp.Error(err.Error()) c.JSON(http.StatusOK, rsp) return } db.Model(models.MonkeyTask{}).Create(&task) if db.Error != nil { rsp.Error(db.Error.Error()) c.JSON(http.StatusOK, rsp) return } rsp.Success() rsp.Data = task c.JSON(http.StatusOK, rsp) // go RunAndroidMonkeyCmd(task, device.Udid) } // @Tags Monkey相关 /api/monkey/v2/ // @Summary 更新任务跟进状态 // @Description 更新Monkey任务跟进状态 // @accept x-www-form-urlencoded // @Param task_id formData string true "Monkey任务id" // @Param handle_status formData string true "跟进情况:IN_PROGRESS-跟进中/DONE-已跟进" // @Success 200 {object} models.Response "返回创建后的设备信息" // @Router /api/monkey/v2/task/handle/set [post] func UpdateHandleStatus(c *gin.Context) { rsp := controllers.NewResponse() task_id := cast.ToInt(c.PostForm("task_id")) handle_status := c.PostForm("handle_status") if task_id < 1 { c.JSON(http.StatusOK, rsp.Error("参数task_id错误:"+c.PostForm("task_id"))) return } if handle_status == "" { c.JSON(http.StatusOK, rsp.Error("参数handle_status错误:"+c.PostForm("handle_status"))) return } db, err := dbsql.GetConn(dbsql.DSN) if err != nil { c.JSON(http.StatusOK, rsp.Error(err.Error())) return } defer dbsql.Close(db) task, err := getTaskById(task_id, db) if err != nil { c.JSON(http.StatusOK, rsp.Error(err.Error())) return } db.Model(models.MonkeyTask{}).Where("id = ?", task.Id).Update("handle_status", handle_status) // 还没写 c.JSON(http.StatusOK, rsp.Success()) } // @Tags Monkey相关 /api/monkey/v2/ // @Summary 获取Monkey任务的执行命令 // @Description 通过任务id获取任务的执行命令 // @accept x-www-form-urlencoded // @Param task_id query int true "任务id" // @Success 200 {object} models.Response "返回执行命令" // @Router /api/monkey/v2/task/command [get] func GetTaskCommand(c *gin.Context) { rsp := controllers.NewResponse() task_id := cast.ToInt(c.Query("task_id")) if task_id < 1 { c.JSON(http.StatusOK, rsp.Error("参数task_id错误:"+c.PostForm("task_id"))) return } var task models.MonkeyTask db, err := dbsql.GetConn(dbsql.DSN) if err != nil { rsp.Error(err.Error()) c.JSON(http.StatusOK, rsp) return } defer dbsql.Close(db) db.Where("id = ?", task_id).Find(&task) cmd_content := "cd /home/app/monkey && nohup python3 main_adr.py" + " -task_id " + cast.ToString(task.Id) if task.PackageURL != "" { pkg_path := "/root/app/autogo/downloads/" + cast.ToString(time.Now().Unix()) + ".apk" log.Debug("需要下载apk:", task.PackageURL, "-O", pkg_path) cmd_content += " -pkg_path " + pkg_path log.Debug("下载完毕,安装包路径", pkg_path) } cmd_content += " -package " + task.PackageName if task.LaunchActivity != "" { cmd_content += " -launch_activity " + task.LaunchActivity } cmd_content += " -run_time " + cast.ToString(task.RunTime) if task.Devices != "" { cmd_content += " -device_udid " + task.Devices } else { cmd_content += " -device_udid [udid] " } cmd_content += " >> /home/app/logs/task_output/task_" + cast.ToString(task.Id) + ".log 2>&1" rsp.Data = cmd_content c.JSON(http.StatusOK, rsp.Success()) } // 根据id查询monkey任务信息,db传nil时会另外新建数据库链接 func getTaskById(id int, db *gorm.DB) (models.MonkeyTask, error) { var task models.MonkeyTask if db == nil { db, err := dbsql.GetConn(dbsql.DSN) if err != nil { return task, err } defer dbsql.Close(db) } db.Table(task.TableName()).Model(models.MonkeyTask{}).Where("id = ?", id).Last(&task) if task.Id == 0 { return task, db.Error } return task, nil }