LoginSignup
12
12

More than 3 years have passed since last update.

Amazon Device FarmをJenkinsCIに導入する

Last updated at Posted at 2015-07-24

プラグインのインストール

  • こちらの手順のとおりやってみる

Mavenのインストール

JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.45.x86_64/jre
  • proxy環境では以下のファイルを配置する(以下は記述例)
~/.m2/settings.xml
    <settings>
      .
      .
      <proxies>
       <proxy>
          <id>example-proxy</id>
          <active>true</active>
          <protocol>http</protocol>
          <host>proxy.example.com</host>
          <port>8080</port>
          <username>proxyuser</username>
          <password>somepassword</password>
          <nonProxyHosts>www.google.com|*.example.com</nonProxyHosts>
        </proxy>
      </proxies>
      .
      .
    </settings>

プラグインのビルド

  • 以下を実行する
    • target/aws-device-farm.hpiが生成される
$ git clone git@github.com:awslabs/aws-device-farm-jenkins-plugin.git
$ cd aws-device-farm-jenkins-plugin
$ make clean compile

Jenkinsにプラグインをインストール

  1. 「Jenkinsの管理」⇒「プラグインの管理」⇒「高度な設定」を選択する
  2. プラグインのアップロードでaws-device-farm.hpiを選択してアップロードする
    • harumi_jenkins.png
    • harumi_jenkins2.png
  3. Jenkinsを再起動する

AWS側の設定

設定

  1. AWSマネージメントコンソールにログイン後して「Identity & Access Management」を選択する
    • harumi_aws.png
  2. 左側の項目の「ユーザー」を選択する
    • harumi_aws2.png
  3. 「新規ユーザーの作成」を選択する
    • harumi_aws3.png
  4. ユーザー名を入力して、"ユーザーごとにアクセスキーを生成"にチェックが入っていることを確認して作成する
    • harumi_aws4.png
  5. ポリシーを以下のように設定する
    • iam.png

Jenkins側の設定

システムの設定

  1. Jenkinsにログインして、「Jenkinsの管理」⇒「システムの設定」を選択する
  2. 画面下部にある"AWS Device Farm"のところにあるAKIDとSKIDを入力して保存する
    • harumi_jenkins4.png
      • AKID/SKIDがご不明な方はこちらをご覧ください

Jenkinsジョブの設定

  1. AmazonDeviceFarmを使いたいジョブを選択して、「設定」を選択する
  2. 「ビルド後の処理の追加」⇒「Run Tests on AWS Device Farm」を選択する
  3. 以下のように設定する(ここでは対象のテストにFuzzテストを選択した)
    • devicefarm.png
    • Project・・・DeviceFarmで作成したプロジェクトを選択する
    • DevicePool・・・作成したDevicePoolがあればそれをなければTop Devicesを選択する
    • Application・・・apkファイルの場所を指定する(例えば、*.apkなどでも可)
    • Choose test to runでBuilt-in Fuzzを選択する
    • Event Count/Event Throttle/Seedは指定しなくても実行できる(詳細はDeviceFarmを参照)

プロキシ下では使えない??

  • 正確に言えば、ジョブの設定で入力すべきProject/DevicePoolが選択肢に何もでてこなかった
    • EC2上で同じことを試みると、作成したProject/DevicePoolは表示されていた
  • プロキシの設定付きで再起動をしてもダメだった
  • 認証プロキシだからダメなのかと思ってsquidを使ったもので試したけどダメだった
  • ※ 回避策がみつかったら追記します → 使えるようにはなったので下に追記します

プロキシ環境下で使う方法

  • これを試しているうちに、「というかAmazonのサービスだからEC2使えよという話だよな・・・」と思いましたが見てみることに
  • Jenkinsの設定で以下のプロキシの設定を試したのですがダメ、つまりはプラグイン側でプロキシに対応するようにしないといけない
    • システムの環境変数定義
    • 起動オプションにプロキシ設定追加
  • 仕方なくjava不慣れな僕がコード見てみることに^^;
  • こんなのやったよというのを書きます
  • $ mvn clean compileする前に以下のコードを追加しておきます。以上です
src/main/java/org/jenkinsci/plugins/awsdevicefarm/AWSDeviceFarm.java
 49     /**
 50      * Private AWSDeviceFarm constructor. Uses the roleArn to generate STS creds if the roleArn isn't null; otherwise
 51      * just uses the AWSCredentials creds.
 52      * @param creds AWSCredentials creds to use for authentication.
 53      * @param roleArn Role ARN to use for authentication.
 54      */
 55     private AWSDeviceFarm(AWSCredentials creds, String roleArn) {
 56         if (roleArn != null) {
 57             STSAssumeRoleSessionCredentialsProvider sts = new STSAssumeRoleSessionCredentialsProvider
 58                     .Builder(roleArn, RandomStringUtils.randomAlphanumeric(8))
 59                     .build();
 60             creds = sts.getCredentials();
 61         }
 62 
 63         ClientConfiguration clientConfiguration = new ClientConfiguration().withUserAgent("AWS Device Farm - Jenkins v1.0");
 64         //以下2行を追加
 65         clientConfiguration.setProxyHost("[プロキシホスト]");
 66         clientConfiguration.setProxyPort([プロキシポート]);
 .
 .
 .
323     private Upload upload(File file, Project project, AWSDeviceFarmUploadType uploadType, Boolean synchronous) throws IOException, AWSDeviceFarmException {
324         CreateUploadRequest appUploadRequest = new CreateUploadRequest()
325                 .withName(file.getName())
326                 .withProjectArn(project.getArn())
327                 .withContentType("application/octet-stream")
328                 .withType(uploadType.toString());
329         Upload upload = api.createUpload(appUploadRequest).getUpload();
330         //CloseableHttpClient httpClient = HttpClients.createDefault(); この行を以下の4行のように変更する
331         CloseableHttpClient httpClient = HttpClients.custom()
332                 .useSystemProperties()
333                 .setProxy(new HttpHost("[プロキシホスト]", [プロキシポート]))
334                 .build();
335 
336         HttpPut httpPut = new HttpPut(upload.getUrl());

実行結果

DeviceFarm

result.png

Jenkins

result2.png

  • ジョブのトップから結果が閲覧できる

補足

  • DeviceFarmのテストで失敗するとJenkinsのビルド結果も失敗として扱われます

~ただの宣伝~

  • 全国のSeleniumer必読
  • Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください
12
12
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
12