AWS Device Farm を Jenkins CI から叩いてみた

Post on 12-Aug-2015

158 views 3 download

Transcript of AWS Device Farm を Jenkins CI から叩いてみた

AWSDeviceFarmをJenkinsCIから叩いてみ

TatsuyaYAMAMOTO(ymt2)

Developer@ZawattInc.

お前誰よ?

ザワット株式会社エンジニア(創業者)

担当領域

サーバサイドアプリケーション

インフラまわり(リアルもクラウドも

Androidアプリケーション

受賞歴

2011年9⽉、世界中のハッカー800組がサンフランシスコに集結し、⼀晩でアプリケーションを開発し勝敗を競うエンジニアの祭典『TechCrunchDisruptSFHackathon』にてスポンサー賞を受賞。弊社鈴⽊とともに、⽇本⼈エンジニアとしては初

の登壇となった

ref1

"WealsohaveapluginforJenkins"

AmazonWebServicesブログ より:ref1

“WealsohaveapluginforJenkins,with

connectionstootherCI(ContinuousIntegration)systemsintheworks.

https://aws.amazon.com/jp/blogs/aws/aws-device-farm-test-mobile-apps-on-real-devices/

めっちゃ便利やん!!

via.http://www.ign.com/wikis/e3/E3_2003

ref2

現実

AmazonWebServicesブログ(翻訳版) より:ref2

“また、Jenkinsのプラグインを提供し、その他のCI(ContinuousIntegration)システムと連携することを計画してい

ます。

http://aws.typepad.com/aws_japan/2015/07/aws-device-farm-test-mobile-apps-on-real-devices.html

まだないっぽい

via.http://www.ign.com/wikis/e3/E3_2004

待ってられないのでAPIを叩くことにした

AWSDeviceFarmAPIでできること(Actions)

CreateシリーズCreateDevicePool/CreateProject/CreateUpload

プロジェクト(テスト定義の集合)を作ったり、

APKやテストコードをアップロードする際に利⽤

AWSDeviceFarmAPIでできること(Actions)

GETシリーズGetDevice/GetDevicePool/

GetDevicePoolCompatibility/GetJob/GetProject/GetRun/GetSuite/GetTest/GetUpload

種々の定義や実⾏ステータスを取得する際に利⽤

AWSDeviceFarmAPIでできること(Actions)

ListシリーズListArtifacts/ListDevicePools/ListDevices/ListJobs/

ListProjects/ListRuns/ListSamples/ListSuites/ListTests/ListUniqueProblems/ListUploads

定義やジョブのリストを取得する際に利⽤

たいていGETシリーズを叩く準備に必要となる

AWSDeviceFarmAPIでできること(Actions)

ScheduleRunこれを叩くとテストを⾛らせることができる

その名の通り、テスト実⾏を予約するだけなので即時

実⾏されるとは限らない

こいつをJenkinsCIから叩けばよさそう

やりたいこと

コミットがあったらapkをビルド

apkをAWSDeviceFarmにアップロード

テスト定義を作成

テスト実⾏

テスト結果を受け取ってSlackに通知

課題たち

テストが即時実⾏されないのでwaitしたい

テスト結果を参照しやすくしたい

JenkinsCI上でタスクをfailさせる

テスト結果はAPI経由で取れるのでexit1すればいい

Slackからテスト結果への参照をつける

AWSマネジメントコンソールのURLはAPIから取得不能だが⽣成可能

実装してみる

AWSDeviceFarmAPIを利⽤した処理のフロー

Jenkins CI Client API S3

launch

CreateUpload w/ ProjectArn

UploadArn, UploadUrl

POST apk to UploadUrl

Wait for apk to be fully uploaded

ScheduleRun w/ Proje

ctArn, UploadArn, DevicePoolArn

Wait for test to be co

mpletely ran

return url

事前準備

AWSマネジメントコンソールにて設定しておくもの

プロジェクト(ProjectArn)

テストする対象のアプリ名などで作成

この中にテスト履歴が残る

DevicePool(DevicePoolArn)

テスト対象のデバイス⼀覧の定義

任意のデバイス群を作成できる

事前準備

AWSマネジメントコンソールにて設定しておくもの

テストコード

今回はAWSDeviceFarmビルトインの「Built-in:Fuzz(適当に操作するだけのいわゆるモンキーテスト)」を利⽤

テスト対象のアプリ

事前準備

CLIから使ってみるamazonlinuxインスタンスにて

$ yum update aws-cli$ aws devicefarm helpusage: aws [options] <command> <subcommand> [parameters]aws: error: argument command: Invalid choice, valid choices are:

事前準備

awscliから使ってみる実装が…ない!!!!@2015/7/16現在

事前準備

boto3から使う$ pip install boto3$ python>>> import boto3>>> import botocore>>> session = botocore.session.Session(profile='profile')>>> boto_session = boto3.Session(botocore_session=session, region_name='us-west-2')>>> client = boto_session.client('devicefarm')>>> client.list_projects(){'ResponseMetadata': {'HTTPStatusCode': 200, ...

事前準備

boto3から使う動いた!!

boto3はAPIの定義をJSONで落としてくる実装になっているので対応が早かった模様

⾃動⽣成なクライアントのためwaitしたりなどは⾃前で実装する必要があった

動いているところ

動いているところ

を、お⾒せしたいところでしたが、思いの他時間がかか

るのでのちほどお声がけくださいませ

(ちゃんと動いてます!!

AWSDeviceFarmAPIw/boto3のハマりどころ

テストパラメータの渡し⽅がどこにも記載されていない

端末の⾔語設定や緯度経度も設定できるはずだが渡し

⽅の記載なし

数値パラメータであってもStringで渡す必要あり

「Built-in:Fuzz」固有の設定値は渡すことができる

'event_count':'1000'#テスト中に操作する回数

'event_throttle':'100'#操作ごとの間隔(ms)

'randomizer_seed':'seed'#操作箇所を指定する際のランダムシード(指定すると操作箇所を固定で

きる)

AWSDeviceFarmAPIw/boto3のハマりどころ

APKのアップロードが煩雑APIでS3のURLを⽣成・取得し、そちらにPUTする必要がある

PUT後もAWSDeviceFarm上のステータスがSUCCEEDになるまでwaitしないとScheduleRunでコケる

JenkinsCIから呼び出すことによるメリット

ソースコードのコミットに連動してすぐテストできる

テスト実⾏までの⼿数が最⼩限となる

「同じテストをもう⼀度」というのがAWSマネジメントコンソールからかんたんにできない

ログに残すことでテストパラメータをあとから確認で

きる

AWSマネジメントコンソールからではlogcatしかできず、テスト実⾏時の⾔語設定などが後から

確認できない

つかいどころについてな

いわゆるブルー・グリーン・デプロイメントには向い

ていない?

テスト実⾏まで待たされる/テストが実⾏完了しないことがある(内部でエラーが出ている?)

いつまでもデプロイできない可能性あり

⽇々の回帰テストあたりが妥当では

お約束⾏っときましょう

弊社、積極採⽤中!!

最新サービスにつっこんで⾃爆するような⼈柱エンジ

ニアも歓迎します(募集はしていません

ザワットのエンジニア⽂化を⼿中に納めるのはあなた

かもしれない!?

おしまい