【新卒研修】Device Farmerの導入

#はじめに
こんにちは。[CYBIRD Advent Calendar 2021](https://qiita.com/advent-calendar/2021/cybird) 5日目の@kappysanです。4日目は@chikako_ikedaさんの[TargetSDK30対応でハマったこと](https://qiita.com/chikako_ikeda/private/14f3b279e8e27afe3124)でした。
何か新しいものをインストールするときってハマりがちですよね。ひとりで調べて解決できる力をつけていきたいです。

#Device Farmer
Device Farmerを使うとリモート端末でテストを行うことができます。
リモートワークが当たり前になったCYBIRDにとってはとても重要なサービスです。
私は新卒一年目なのですが、新卒技術研修中にMacにDevice Farmerをインストールしたので、その手順とトラブルシューティングについてまとめました。

# 要件
## 様々な依存関係のインストール
オープンソースなので[Githubの英語ドキュメント](https://github.com/DeviceFarmer/stf)を参考に進めます。
インストールする前に、予め要件を満たしておく必要があります。
要件を満たすために必要な依存関係をインストールします。

```
brew install rethinkdb graphicsmagick zeromq protobuf yasm pkg-config cmake
```

これでnodeとadb以外がインストールできました。

## nodeのインストール
次にnodeをインストールします。
[こちら](https://qiita.com/non0311/items/664cf74d9ff4bad9cf46)を参考にnodeをインストールしました。
しかし、この記事の通りにnodeをインストールすると要件を満たせないことに気づき、後でアンインストールすることになりました。
また、ここではvimの操作が必要になります。
私はまだ不慣れなので[こちら](https://qiita.com/okamos/items/c97970ab34ff55ff3167)を見ながら慎重に操作しました。

要件を満たせなかった理由ですが、バージョンが合わないためです。
先ほどの記事をそのまま真似ると最新版のnodeがインストールされますが、要件ではv8.xが推奨されています。
そのため[こちら](https://qiita.com/wagi0716/items/94193a80502f9d81a9e0)を参考にnodeを入れ直しました。
nodeの[バージョン一覧](https://nodejs.org/ja/download/releases/)を見てv8.xの中で最も新しいv8.17.0をインストールしました。

## adbのインストール
次にadbをインストールします。
[こちら](https://qiita.com/miriwo/items/cb0fa4c2def859bc2641)を参考にインストールしました。
Android Studioのインストールからはじまります。
パスを通すところではAndroid SDK locationのファイルパスの場所が記載の通りに探せなかったので、[こちら](https://howpon.com/1208)を参考にしてパスを見つけました。

# インストール
要件が揃ったのでDevice Farmerをインストールします。

```
npm install -g @devicefarmer/stf
```

ここでxcodeのコマンドライン・デベロッパ・ツールをインストールしてください、とポップアップが出てきたのでインストールしました。
私がインストールしたのはv12.4です。
調べるとhomebrewを利用するためにこれが必要なようなので、それでインストールするよう求められたのだと思います。
これで実行する準備は整いました。

# ビルド
開発の場合は実行する代わりにビルドする必要があります。

npmおよびbowerモジュールをフェッチします。

```
npm install
```

次にモジュールをリンクしてコマンドラインから直接コマンドにアクセスできるようにします。

```
npm link
```

ここでエラーが出ました。
しかし、今回は実行ができればよく、これはできなくても問題ないのでスルーしました。

# 実行
いよいよ実行していきます。
ホームディレクトリにrethinkdbというディレクトリを作成しました。
このディレクトリに移動します。

```
cd rethinkdb
```

RethinkDBを起動します。

```
rethinkdb
```

Server ready, ...と準備が整います。
こちらのターミナルは放置し、ここからは別のターミナルで作業します。

新たなターミナルを新規ウインドウで立ち上げます。
ここで先ほど作ったディレクトリに移動します。

```
cd rethinkdb
```

さらにこの中にrethinkdb_dataディレクトリができているはずなのでそこに移動します。

```
cd rethinkdb_data
```

こちらのターミナルではまだ.bash_profileを読み込めていないので、読み込みます。

```
source ~/.bash_profile
```

.bash_profileでnodeとadbの両方をexportしていたのでこれで両方読み込めます。

stfを起動します。

```
stf local
```

[http://localhost:7100](http://localhost:7100)にアクセスします。
nameとEmailが必要です。
デフォルトで以下のように入力すると入れるようになっています。

name: administrator
email: administrator@fakedomain.com

ケーブルでPCにAndroid端末を接続すると自動で認識されます。

これで成功……のはずでしたがcode1エラーが発生し、端末自体は認識するものの、準備中から進まなくなってしまいました。
[issues](https://github.com/openstf/stf/issues/78)を見ると、ハードウェアの問題となっています。
本当にハードウェアの問題か確認するためにエミュレータでも実行してみることにしました。

# エミュレータの利用
エミュレータはadbを導入するときに入れたAndroid Studioを使います。
[こちら](https://blog.codecamp.jp/programming-androidstudio-mac)を参考に起動しようとしましたが、No target device foundとエラーが出ました。
デバイスを選択していなかったことが原因のようで[こちら](https://qiita.com/AoiLaurent/items/319f7dc0996bdc03c849)を参考にデバイスを選択すると起動できました。

もう一度stfを起動します。

```
stf local
```

[http://localhost:7100](http://localhost:7100)にアクセスします。
エミュレータのデバイスが認識され、デバッグ可能な状態になりました。

エミュレータで成功したので、どうやら本当にハードウェアの問題のようです。
ハードウェアに問題がなければ上記の方法でもAndroid端末を認識してデバッグ可能な状態に持っていけると思います。

# 感想
まだ新しめのオープンソースでネットに情報が少ないものをインストールするのは初めてでいい経験になりましたし、先駆者のありがたみを改めて痛感しました。
トラブルシューティングのアドバイスをくださった品質管理部のみなさん、ありがとうございました。

明日の[CYBIRD Advent Calendar 2021](https://qiita.com/advent-calendar/2021/cybird) 6日目は@cy_ssssが担当します。
ありがとうございました。