AWS Device Farm を Jenkins CI から叩いてみた
-
Upload
tatsuya-yamamoto -
Category
Technology
-
view
158 -
download
3
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しかできず、テスト実⾏時の⾔語設定などが後から
確認できない
つかいどころについてな
ど
いわゆるブルー・グリーン・デプロイメントには向い
ていない?
テスト実⾏まで待たされる/テストが実⾏完了しないことがある(内部でエラーが出ている?)
いつまでもデプロイできない可能性あり
⽇々の回帰テストあたりが妥当では
お約束⾏っときましょう
弊社、積極採⽤中!!
最新サービスにつっこんで⾃爆するような⼈柱エンジ
ニアも歓迎します(募集はしていません
ザワットのエンジニア⽂化を⼿中に納めるのはあなた
かもしれない!?
おしまい