You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

234 lines
6.9 KiB
Go

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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")
if strings.Contains(task.PackageURL, "ipa") {
task.Platform = "ios"
}
// 选填项
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
}