- AWS CLI
-
Observação: este exemplo usa a ferramenta de linha de comando curl para enviar o aplicativo para o Device Farm.
Primeiro, crie um projeto, caso ainda não tenha feito isso.
$ aws devicefarm create-project --name MyProjectName
Isso mostrará uma saída como a seguinte:
{
"project": {
"name": "MyProjectName",
"arn": "arn:aws:devicefarm:us-west-2:123456789101:project:5e01a8c7-c861-4c0a-b1d5-12345EXAMPLE",
"created": 1535675814.414
}
}
Em seguida, faça o seguinte para criar seu upload e enviá-lo para o Device Farm. Neste exemplo, criaremos um upload de aplicativo Android usando um arquivo APK local. Para obter mais informações sobre o tipo de upload, incluindo detalhes sobre os tipos de upload de aplicativos iOS, consulte nossa documentação de API para criar um Upload.
$ export APP_PATH="/local/path/to/my_sample_app.apk"
$ export APP_TYPE="ANDROID_APP"
Primeiro, criamos o upload no Device Farm:
$ aws devicefarm create-upload \
--project-arn "arn:aws:devicefarm:us-west-2:123456789101:project:5e01a8c7-c861-4c0a-b1d5-12345EXAMPLE" \
--name "$(basename "$APP_PATH")" \
--type "$APP_TYPE"
Isso mostrará uma saída como a seguinte:
{
"upload": {
"arn": "arn:aws:devicefarm:us-west-2:385076942068:upload:490a6350-0ba3-43e5-83f5-d2896b069a34/a120e848-c57b-4e8d-a720-d750a0c4d936",
"name": "my_sample_app.apk",
"created": 1760747318.266,
"type": "ANDROID_APP",
"status": "INITIALIZED",
"url": "https://prod-us-west-2-uploads.s3.dualstack.us-west-2.amazonaws.com/arn%3Aaws%3Adevicefarm%3Aus-west-2...",
"category": "PRIVATE"
}
}
Em seguida, faça uma chamada PUT usando curl para enviar o aplicativo para o bucket S3 do Device Farm:
$ curl -T "$APP_PATH" "https://prod-us-west-2-uploads.s3.dualstack.us-west-2.amazonaws.com/arn%3Aaws%3Adevicefarm%3Aus-west-2..."
Por fim, aguarde até que o aplicativo esteja no status “bem-sucedido”:
$ aws devicefarm get-upload --arn "arn:aws:devicefarm:us-west-2:385076942068:upload:490a6350-0ba3-43e5-83f5-d2896b069a34/a120e848-c57b-4e8d-a720-d750a0c4d936"
Isso mostrará uma saída como a seguinte:
{
"upload": {
"arn": "arn:aws:devicefarm:us-west-2:385076942068:upload:490a6350-0ba3-43e5-83f5-d2896b069a34/a120e848-c57b-4e8d-a720-d750a0c4d936",
"name": "my_sample_app.apk",
"created": 1760747318.266,
"type": "ANDROID_APP",
"status": "SUCCEEDED",
"url": "https://prod-us-west-2-uploads.s3.dualstack.us-west-2.amazonaws.com/arn%3Aaws%3Adevicefarm%3Aus-west-2...",
"metadata": "{\"activity_name\":\"com.amazonaws.devicefarm.android.referenceapp.Activities.MainActivity\",\"package_name\":\"com.amazonaws.devicefarm.android.referenceapp\",...}",
"category": "PRIVATE"
}
}
- Python
-
Observação: este exemplo usa o requests pacote de terceiros para enviar o aplicativo para o Device Farm, bem como o AWS SDK para Pythonboto3.
Primeiro, crie um projeto, caso ainda não tenha feito isso.
import boto3
client = boto3.client("devicefarm", region_name="us-west-2")
resp = client.create_project(name="MyProjectName")
print(resp)
# Response will be something like:
# {
# "project": {
# "name": "MyProjectName",
# "arn": "arn:aws:devicefarm:us-west-2:123456789101:project:5e01a8c7-c861-4c0a-b1d5-12345EXAMPLE",
# "created": 1535675814.414
# }
# }
Em seguida, faça o seguinte para criar seu upload e enviá-lo para o Device Farm. Neste exemplo, criaremos um upload de aplicativo Android usando um arquivo APK local. Para obter mais informações sobre o tipo de upload, incluindo detalhes sobre os tipos de upload de aplicativos iOS, consulte nossa documentação de API para criar um Upload.
import os
import time
import datetime
import requests
from pathlib import Path
import boto3
def upload_device_farm_file():
project_arn = "arn:aws:devicefarm:us-west-2:123456789101:project:5e01a8c7-c861-4c0a-b1d5-12345EXAMPLE"
app_path = Path("/local/path/to/my_sample_app.apk")
file_type = "ANDROID_APP"
if not app_path.is_file():
raise RuntimeError(f"{app_path} is not a valid app file path")
client = boto3.client("devicefarm", region_name="us-west-2")
# 1) Create the upload in Device Farm
create = client.create_upload(
projectArn=project_arn,
name=app_path.name,
type=file_type,
contentType="application/octet-stream",
)
upload = create["upload"]
upload_arn = upload["arn"]
upload_url = upload["url"]
# This will show output such as the following:
# { "upload": { "arn": "...", "name": "my_sample_app.apk", "type": "ANDROID_APP", "status": "INITIALIZED", "url": "https://..." } }
# 2) Do an HTTP PUT command to push the file to the pre-signed S3 URL
with app_path.open("rb") as fh:
print(f"Uploading {app_path.name} to Device Farm...")
put_resp = requests.put(upload_url, data=fh, headers={"Content-Type": "application/octet-stream"})
put_resp.raise_for_status()
# 3) Wait for the app to be in "SUCCEEDED" status (or fail/timeout)
timeout_seconds = 30
start = time.time()
while True:
get_resp = client.get_upload(arn=upload_arn)
status = get_resp["upload"]["status"]
msg = get_resp["upload"].get("message") or get_resp["upload"].get("metadata") or ""
elapsed = datetime.timedelta(seconds=int(time.time() - start))
print(f"[{elapsed}] status={status}{' - ' + msg if msg else ''}")
if status == "SUCCEEDED":
print(f"Upload complete: {upload_arn}")
return upload_arn
if status == "FAILED":
raise RuntimeError(f"Device Farm failed to process upload: {msg}")
if (time.time() - start) > timeout_seconds:
raise RuntimeError(f"Timed out after {timeout_seconds}s waiting for upload to process (last status={status}).")
time.sleep(1)
upload_device_farm_file()
- Java
-
Observação: este exemplo usa o AWS SDK for Java v2 HttpClient e para enviar o aplicativo para o Device Farm e é compatível com as versões 11 e posteriores do JDK.
Primeiro, crie um projeto, caso ainda não tenha feito isso.
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.devicefarm.DeviceFarmClient;
import software.amazon.awssdk.services.devicefarm.model.CreateProjectRequest;
import software.amazon.awssdk.services.devicefarm.model.CreateProjectResponse;
try (DeviceFarmClient client = DeviceFarmClient.builder()
.region(Region.US_WEST_2)
.build()) {
CreateProjectResponse resp = client.createProject(
CreateProjectRequest.builder().name("MyProjectName").build());
System.out.println(resp.project());
// Response will be something like:
// Project{name=MyProjectName, arn=arn:aws:devicefarm:us-west-2:123456789101:project:5e01a8c7-..., created=...}
}
Em seguida, faça o seguinte para criar seu upload e enviá-lo para o Device Farm. Neste exemplo, criaremos um upload de aplicativo Android usando um arquivo APK local. Para obter mais informações sobre o tipo de upload, incluindo detalhes sobre os tipos de upload de aplicativos iOS, consulte nossa documentação de API para criar um Upload.
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.Duration;
import java.time.Instant;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.devicefarm.DeviceFarmClient;
import software.amazon.awssdk.services.devicefarm.model.CreateUploadRequest;
import software.amazon.awssdk.services.devicefarm.model.CreateUploadResponse;
import software.amazon.awssdk.services.devicefarm.model.GetUploadRequest;
import software.amazon.awssdk.services.devicefarm.model.GetUploadResponse;
import software.amazon.awssdk.services.devicefarm.model.Upload;
import software.amazon.awssdk.services.devicefarm.model.UploadType;
public class DeviceFarmUploader {
public static String upload(String projectArn, Path appPath) throws Exception {
if (projectArn == null || projectArn.isEmpty()) {
throw new IllegalArgumentException("Missing projectArn");
}
if (!Files.isRegularFile(appPath)) {
throw new IllegalArgumentException("Invalid app path: " + appPath);
}
String fileName = appPath.getFileName().toString().trim();
UploadType type = UploadType.ANDROID_APP;
// Build a reusable HttpClient
HttpClient http = HttpClient.newBuilder()
.version(HttpClient.Version.HTTP_1_1)
.connectTimeout(Duration.ofSeconds(10))
.build();
try (DeviceFarmClient client = DeviceFarmClient.builder()
.region(Region.US_WEST_2)
.build()) {
// 1) Create the upload in Device Farm
CreateUploadResponse create = client.createUpload(CreateUploadRequest.builder()
.projectArn(projectArn)
.name(fileName)
.type(type)
.contentType("application/octet-stream")
.build());
Upload upload = create.upload();
String uploadArn = upload.arn();
String url = upload.url();
// This will show output such as the following:
// { "upload": { "arn": "...", "name": "my_sample_app.apk", "type": "ANDROID_APP", "status": "INITIALIZED", "url": "https://..." } }
// 2) PUT file to pre-signed URL using HttpClient
HttpRequest put = HttpRequest.newBuilder(URI.create(url))
.timeout(Duration.ofMinutes(15))
.header("Content-Type", "application/octet-stream")
.PUT(HttpRequest.BodyPublishers.ofFile(appPath))
.build();
HttpResponse<Void> resp = http.send(put, HttpResponse.BodyHandlers.discarding());
int code = resp.statusCode();
if (code / 100 != 2) {
throw new IOException("Failed PUT to S3 pre-signed URL, HTTP " + code);
}
// 3) Wait for the app to be in "SUCCEEDED" status (or fail/timeout)
Instant deadline = Instant.now().plusSeconds(30); // 30-second timeout
while (true) {
GetUploadResponse got = client.getUpload(GetUploadRequest.builder()
.arn(uploadArn)
.build());
String status = got.upload().statusAsString();
String msg = got.upload().metadata();
System.out.println("status=" + status + (msg != null ? " - " + msg : ""));
if ("SUCCEEDED".equals(status)) return uploadArn;
if ("FAILED".equals(status)) throw new RuntimeException("Upload failed: " + msg);
if (Instant.now().isAfter(deadline)) {
throw new RuntimeException("Timeout waiting for processing, last status=" + status);
}
Thread.sleep(2000);
}
}
}
public static void main(String[] args) throws Exception {
String projectArn = "arn:aws:devicefarm:us-west-2:123456789101:project:5e01a8c7-c861-4c0a-b1d5-12345EXAMPLE";
Path appPath = Paths.get("/local/path/to/my_sample_app.apk");
String result = upload(projectArn, appPath);
System.out.println("Upload ARN: " + result);
}
}
- JavaScript
-
Observação: este exemplo usa o AWS SDK for JavaScript (v3) e o Node 18+ fetch para enviar o aplicativo para o Device Farm.
Primeiro, crie um projeto, caso ainda não tenha feito isso.
import { DeviceFarmClient, CreateProjectCommand } from "@aws-sdk/client-device-farm";
const df = new DeviceFarmClient({ region: "us-west-2" });
const resp = await df.send(new CreateProjectCommand({ name: "MyProjectName" }));
console.log(resp);
// Response will be something like:
// { project: { name: 'MyProjectName', arn: 'arn:aws:devicefarm:us-west-2:123456789101:project:5e01a8c7-...', created: 1535675814.414 } }
Em seguida, faça o seguinte para criar seu upload e enviá-lo para o Device Farm. Neste exemplo, criaremos um upload de aplicativo Android usando um arquivo APK local. Para obter mais informações sobre o tipo de upload, incluindo detalhes sobre os tipos de upload de aplicativos iOS, consulte nossa documentação de API para criar um Upload.
import { DeviceFarmClient, CreateUploadCommand, GetUploadCommand } from "@aws-sdk/client-device-farm";
import { createReadStream } from "fs";
import { basename } from "path";
const projectArn = "arn:aws:devicefarm:us-west-2:123456789101:project:5e01a8c7-c861-4c0a-b1d5-12345EXAMPLE";
const appPath = "/local/path/to/my_sample_app.apk";
const name = basename(appPath).trim();
const type = "ANDROID_APP";
const client = new DeviceFarmClient({ region: "us-west-2" });
// 1) Create the upload in Device Farm
const create = await client.send(new CreateUploadCommand({
projectArn,
name,
type,
contentType: "application/octet-stream",
}));
const uploadArn = create.upload.arn;
const url = create.upload.url;
// This will show output such as the following:
// { upload: { arn: '...', name: 'my_sample_app.apk', type: 'ANDROID_APP', status: 'INITIALIZED', url: 'https://...' } }
// 2) PUT to pre-signed URL
const putResp = await fetch(url, {
method: "PUT",
headers: { "Content-Type": "application/octet-stream" },
body: createReadStream(appPath),
});
if (!putResp.ok) {
throw new Error(`Failed PUT to pre-signed URL: ${putResp.status} ${await putResp.text().catch(()=>"")}`);
}
// 3) Wait for the app to be in "SUCCEEDED" status (or fail/timeout)
const deadline = Date.now() + (30 * 1000); // 30-second timeout
while (true) {
const response = await client.send(new GetUploadCommand({ arn: uploadArn }));
const { status, message, metadata } = response.upload;
console.log(`status=${status}${message ? " - " + message : metadata ? " - " + metadata : ""}`);
if (status === "SUCCEEDED") {
console.log("Upload complete:", uploadArn);
break;
}
if (status === "FAILED") {
throw new Error(`Upload failed: ${message || metadata || "unknown"}`);
}
if (Date.now() > deadline) throw new Error(`Timeout waiting for processing (last status=${status})`);
await new Promise(r => setTimeout(r, 2000));
}
- C#
-
Observação: este exemplo usa o AWS SDK para.NET HttpClient e para enviar o aplicativo para o Device Farm.
Primeiro, crie um projeto, caso ainda não tenha feito isso.
using System;
using Amazon;
using Amazon.DeviceFarm;
using Amazon.DeviceFarm.Model;
using var client = new AmazonDeviceFarmClient(RegionEndpoint.USWest2);
var resp = await client.CreateProjectAsync(new CreateProjectRequest { Name = "MyProjectName" });
Console.WriteLine(resp.Project);
// Response will be something like:
// { Name = MyProjectName, Arn = arn:aws:devicefarm:us-west-2:123456789101:project:5e01a8c7-..., Created = ... }
Em seguida, faça o seguinte para criar seu upload e enviá-lo para o Device Farm. Neste exemplo, criaremos um upload de aplicativo Android usando um arquivo APK local. Para obter mais informações sobre o tipo de upload, incluindo detalhes sobre os tipos de upload de aplicativos iOS, consulte nossa documentação de API para criar um Upload.
using System;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;
using System.Net.Http.Headers;
using Amazon;
using Amazon.DeviceFarm;
using Amazon.DeviceFarm.Model;
class DeviceFarmUploader
{
public static async Task<string> UploadAsync(string projectArn, string appPath)
{
if (string.IsNullOrWhiteSpace(projectArn)) throw new ArgumentException("Missing projectArn");
if (!File.Exists(appPath)) throw new ArgumentException($"Invalid app path: {appPath}");
var type = UploadType.ANDROID_APP;
using var client = new AmazonDeviceFarmClient(RegionEndpoint.USWest2);
// 1) Create the upload in Device Farm
var create = await client.CreateUploadAsync(new CreateUploadRequest
{
ProjectArn = projectArn,
Name = Path.GetFileName(appPath),
Type = type,
ContentType = "application/octet-stream"
});
var uploadArn = create.Upload.Arn;
var url = create.Upload.Url;
// This will show output such as the following:
// { Upload: { Arn = ..., Name = my_sample_app.apk, Type = ANDROID_APP, Status = INITIALIZED, Url = https://... } }
// 2) PUT file to pre-signed URL
using (var http = new HttpClient())
using (var fs = File.OpenRead(appPath))
using (var content = new StreamContent(fs))
{
content.Headers.Add("Content-Type", "application/octet-stream");
var resp = await http.PutAsync(url, content);
if (!resp.IsSuccessStatusCode)
throw new Exception($"Failed PUT to pre-signed URL: {(int)resp.StatusCode} {await resp.Content.ReadAsStringAsync()}");
}
// 3) Wait for the app to be in "SUCCEEDED" status (or fail/timeout)
var deadline = DateTime.UtcNow.AddSeconds(30); // 30-second timeout
while (true)
{
var got = await client.GetUploadAsync(new GetUploadRequest { Arn = uploadArn });
var status = got.Upload.Status.Value;
var msg = got.Upload.Message ?? got.Upload.Metadata;
Console.WriteLine($"status={status}{(string.IsNullOrEmpty(msg) ? "" : " - " + msg)}");
if (status == UploadStatus.SUCCEEDED.Value) return uploadArn;
if (status == UploadStatus.FAILED.Value) throw new Exception($"Upload failed: {msg}");
if (DateTime.UtcNow > deadline) throw new TimeoutException($"Timeout waiting for processing (last status={status})");
await Task.Delay(2000);
}
}
static async Task Main()
{
var projectArn = "arn:aws:devicefarm:us-west-2:123456789101:project:5e01a8c7-c861-4c0a-b1d5-12345EXAMPLE";
var appPath = "/local/path/to/my_sample_app.apk";
var result = await UploadAsync(projectArn!, appPath!);
Console.WriteLine("Upload ARN: " + result);
}
}
- Ruby
-
Observação: este exemplo usa o AWS SDK for Net::HTTP Ruby e para enviar o aplicativo para o Device Farm.
Primeiro, crie um projeto, caso ainda não tenha feito isso.
require "aws-sdk-devicefarm"
client = Aws::DeviceFarm::Client.new(region: "us-west-2")
resp = client.create_project(name: "MyProjectName")
puts resp.project.inspect
# Response will be something like:
# #<struct Aws::DeviceFarm::Types::Project name="MyProjectName", arn="arn:aws:devicefarm:us-west-2:123456789101:project:5e01a8c7-...", created=1535675814.414>
Em seguida, faça o seguinte para criar seu upload e enviá-lo para o Device Farm. Neste exemplo, criaremos um upload de aplicativo Android usando um arquivo APK local. Para obter mais informações sobre o tipo de upload, incluindo detalhes sobre os tipos de upload de aplicativos iOS, consulte nossa documentação de API para criar um Upload.
require "aws-sdk-devicefarm"
require "net/http"
require "uri"
project_arn = "arn:aws:devicefarm:us-west-2:123456789101:project:5e01a8c7-c861-4c0a-b1d5-12345EXAMPLE"
app_path = "/local/path/to/my_sample_app.apk"
raise "Invalid APP_PATH: #{app_path}" unless File.file?(app_path)
type = "ANDROID_APP"
client = Aws::DeviceFarm::Client.new(region: "us-west-2")
# 1) Create the upload in Device Farm
create = client.create_upload(
project_arn: project_arn,
name: File.basename(app_path),
type: type,
content_type: "application/octet-stream"
)
upload_arn = create.upload.arn
url = create.upload.url
# This will show output such as the following:
# #<Upload arn="...", name="my_sample_app.apk", type="ANDROID_APP", status="INITIALIZED", url="https://...">
# 2) PUT the file to the pre-signed URL
uri = URI.parse(url)
Net::HTTP.start(uri.host, uri.port, use_ssl: (uri.scheme == "https")) do |http|
req = Net::HTTP::Put.new(uri)
req["Content-Type"] = "application/octet-stream"
req.body_stream = File.open(app_path, "rb")
req.content_length = File.size(app_path)
resp = http.request(req)
raise "Failed PUT: #{resp.code} #{resp.body}" unless resp.code.to_i / 100 == 2
end
# 3) Wait for the app to be in "SUCCEEDED" status (or fail/timeout)
deadline = Time.now + 30 # 30-second timeout
loop do
got = client.get_upload(arn: upload_arn)
status = got.upload.status
msg = got.upload.message || got.upload.metadata
puts "status=#{status}#{msg ? " - #{msg}" : ""}"
case status
when "SUCCEEDED" then puts "Upload complete: #{upload_arn}"; break
when "FAILED" then raise "Upload failed: #{msg}"
end
raise "Timeout waiting for processing (last status=#{status})" if Time.now > deadline
sleep 2
end