Android 通过适用于 Go 的 AWS 开发工具包在 Device Farm 中上传的应用从未更改状态为已初始化
Android app uploaded in Device Farm via AWS SDK for Go never changed status from INITIALIZED
我正在尝试使用适用于 Go 的 AWS 开发工具包在 AWS Device Farm 中自动化应用程序 运行s。但是任何使用 Go 版本的 SDK 上传的应用程序都不会从 "INITIALIZED" 改变状态。如果我通过 AWS 控制台网络上传它们 UI,那么一切都会好起来的。
上传代码示例:
func uploadApp(client *devicefarm.DeviceFarm, appType, projectArn string) string {
params := &devicefarm.CreateUploadInput{
Name: aws.String(*appName),
ProjectArn: aws.String(projectArn),
Type: aws.String(appType),
}
resp, err := client.CreateUpload(params)
if err != nil {
log.Fatal("Failed to upload an app because of: ", err.Error())
}
log.Println("Upload ARN:", *resp.Upload.Arn)
return *resp.Upload.Arn
}
作为回应,我得到了类似的东西:
{
Upload: {
Arn: "arn:aws:devicefarm:us-west-2:091463382595:upload:c632e325-266b-4bda-a74d-0acec1e2a5ae/9fbbf140-e377-4de9-b7df-dd18a21b2bca",
Created: 2016-01-15 14:27:31 +0000 UTC,
Name: "app-debug-unaligned.apk",
Status: "INITIALIZED",
Type: "ANDROID_APP",
Url: "bla-bla-bla"
}
}
从 "INITIALIZED" 起,时间状态永远不会改变。正如我提到的,运行 从 UI 安排的应用程序工作正常。
如何找出原因?
=======================================
解决方案:
1) 在 CreateUpload
之后需要在响应
中使用 pre-signed S3 link 上传文件
2) 上传应该通过接收到的 URL 的 HTTP PUT 请求执行,文件内容在 body
3) 在&devicefarm.CreateUploadInput
中应指定ContentType
参数。对于 PUT 请求,应使用 Content-Type
header 的相同值
4) 如果 PUT 请求将从 Go 代码发送,那么 Content-Length
header 应该手动设置
当您调用 CreateUpload API 时,Device Farm 将 return 包含 "Url" 字段的 "Upload" 响应。
{
Upload: {
Arn: "arn:aws:devicefarm:us-west-2:....",
Created: 2016-01-15 14:27:31 +0000 UTC,
Name: "app-name.apk",
Status: "INITIALIZED",
Type: "ANDROID_APP",
Url: "bla-bla-bla"
}
}
returned url、"bla-bla-bla" 是一个 pre-signed S3 url 供您上传应用程序。使用 pre-signed url 上传对象的文档:http://docs.aws.amazon.com/AmazonS3/latest/dev/PresignedUrlUploadObject.html
上传您的应用程序后,将处理该应用程序。您的上传状态将更改为 "PROCESSING" 和 "SUCCEEDED"(如果出现问题,则更改为 "FAILED")。一旦它处于 "SUCCEEDED" 状态,您就可以使用它来安排 运行.
我正在尝试使用适用于 Go 的 AWS 开发工具包在 AWS Device Farm 中自动化应用程序 运行s。但是任何使用 Go 版本的 SDK 上传的应用程序都不会从 "INITIALIZED" 改变状态。如果我通过 AWS 控制台网络上传它们 UI,那么一切都会好起来的。
上传代码示例:
func uploadApp(client *devicefarm.DeviceFarm, appType, projectArn string) string {
params := &devicefarm.CreateUploadInput{
Name: aws.String(*appName),
ProjectArn: aws.String(projectArn),
Type: aws.String(appType),
}
resp, err := client.CreateUpload(params)
if err != nil {
log.Fatal("Failed to upload an app because of: ", err.Error())
}
log.Println("Upload ARN:", *resp.Upload.Arn)
return *resp.Upload.Arn
}
作为回应,我得到了类似的东西:
{
Upload: {
Arn: "arn:aws:devicefarm:us-west-2:091463382595:upload:c632e325-266b-4bda-a74d-0acec1e2a5ae/9fbbf140-e377-4de9-b7df-dd18a21b2bca",
Created: 2016-01-15 14:27:31 +0000 UTC,
Name: "app-debug-unaligned.apk",
Status: "INITIALIZED",
Type: "ANDROID_APP",
Url: "bla-bla-bla"
}
}
从 "INITIALIZED" 起,时间状态永远不会改变。正如我提到的,运行 从 UI 安排的应用程序工作正常。
如何找出原因?
=======================================
解决方案:
1) 在 CreateUpload
之后需要在响应
中使用 pre-signed S3 link 上传文件
2) 上传应该通过接收到的 URL 的 HTTP PUT 请求执行,文件内容在 body
3) 在&devicefarm.CreateUploadInput
中应指定ContentType
参数。对于 PUT 请求,应使用 Content-Type
header 的相同值
4) 如果 PUT 请求将从 Go 代码发送,那么 Content-Length
header 应该手动设置
当您调用 CreateUpload API 时,Device Farm 将 return 包含 "Url" 字段的 "Upload" 响应。
{
Upload: {
Arn: "arn:aws:devicefarm:us-west-2:....",
Created: 2016-01-15 14:27:31 +0000 UTC,
Name: "app-name.apk",
Status: "INITIALIZED",
Type: "ANDROID_APP",
Url: "bla-bla-bla"
}
}
returned url、"bla-bla-bla" 是一个 pre-signed S3 url 供您上传应用程序。使用 pre-signed url 上传对象的文档:http://docs.aws.amazon.com/AmazonS3/latest/dev/PresignedUrlUploadObject.html
上传您的应用程序后,将处理该应用程序。您的上传状态将更改为 "PROCESSING" 和 "SUCCEEDED"(如果出现问题,则更改为 "FAILED")。一旦它处于 "SUCCEEDED" 状态,您就可以使用它来安排 运行.