スタディサプリ Product Team Blog

株式会社リクルートが開発するスタディサプリのプロダクトチームのブログです

モバイルチームを支える小さな作業効率化たち

モバイルエンジニアの@chiiia12です。

私がQuipperのモバイルチームにjoinした際に驚いたことの一つが、自動化スクリプト/便利ツール等が多く使われていることでした。 今回はモバイルチームで最近導入されたものをいくつか紹介したいと思います。

DeployGateのビルドバージョン通知

私達のチームではDeployGateを使ってQAチームやデザインチームに開発中のアプリを配布しています。

QAテスト期間中は、不具合を改修した後に改修が含まれたバージョンのアプリをQAチームに確認をお願いしています。その際にDeployGateのバージョンを伝えてテストをしてもらっていますが、開発者にとってはDeployGateのビルドバージョンを確認するのはひと手間かかる作業になっていました。

ss 2019-01-09 at 15 29 50

これをissueがリンクされたpull requestのマージをトリガーに、どのDeployGateのビルドバージョンで確認できるかを自動で該当するissueにコメントされるようになりました。

ss 2019-01-09 at 15 30 10

この改善が行われる前はpull requestがマージされて満足してQAチームに伝えることをよく忘れていましたが、そのような心配もなくなり快適なバグ改修生活を送れるようになりました。

仕組みとしては、マージされたpull requestのBodyからgrepしてどのissueにコメントするか判定しています。Github APIを利用してpull requestの番号やBodyを取得しています。 以下はissueにコメントする部分のコードの一例です。

def self.notify_issues(revision)
  pr_number = pull_request_number(ENV['CIRCLE_SHA1'])
  exit if pr_number.nil? # in case from jenkins
  pr_body = pull_request_body(pr_number)
  aya_issues = URI.extract(pr_body, ["https"]).grep(/^(?=.*aya-issues)(?!.*issuecomment).*$/).uniq
  aya_issues.each do |issue|
    number = issue.split("/").last
    next unless issue_labels(number).include?("Android")
    `curl \\
      -X POST \\
      -H \"Content-Type: application/json\" \\
      -H \"Authorization: token #{ENV['GITHUB_TOKEN']}\" \\
      -d \'{\"body\":\"本issueを改修したAndroidアプリがDeployGateにアップロードされました。\\nNo.#{revision}で確認をお願い致します:bow: by @#{ENV['CIRCLE_USERNAME']}\"}\' \\
      \"https://api.github.com/repos/quipper/aya-issues/issues/#{number}/comments\"`
    end
end

Firebase Remote Configの値更新

私達のチームではFirebase Remote Config(以下Remote Config)を使って最新のアプリバージョンを管理し、最新のアプリバージョンへのアップデートを促す際に参照して使っています。

以前はリリースごとにRemote Configの値を手作業で変える作業が発生していたので、更新を忘れそうになることがしばしばありました。 現在はアプリのストアへのリリースジョブの実行と同時に、Remote Configの値の更新も行うように変更しています。

f w 001

私達のチームでは、Remote Configで管理している値をYAMLファイルでgithubのレポジトリとして管理し、pull requestベースで変更可能になっています。この仕組を実現するためにremoconを利用しています。

最新のアプリバージョンを取得しYAMLを編集し、その内容でpull requestが作成されます。良きタイミングでpull requestをマージするとRemote Configの値も更新されます。(pull requestをマージするのを忘れないようにだけ注意しないとですね。)

ss 2019-01-09 at 15 34 44

不要リソースの削除

Androidプロジェクトにおいて不要なレイアウト・画像ファイルを削除するためにgradle-unused-resources-remover-pluginを使用しています。

導入した当初は、毎回のpull request作成時にタスクを実行し、未使用のリソースがあるかどうかをチェックしていました。 別のツールによってSketchファイルの差分をリソースとしてプロジェクトに適宜取り込まれるようになっている関係上、"これから実装される機能のリソースファイル"も一緒に削除してしまう問題があり、この方法では十分ではありませんでした。 (Sketchの差分をリソースとしてプロジェクトに取り込む仕組みについてはこちらを参照ください)

実現方法について試行錯誤重ねた結果、現在はリリースブランチのみで不要リソースの削除のタスクを実行するように変更しています。厳密には実装予定の機能のリソースファイルを削除してしまう可能性はまだ残っていますが、リリースされるものに不要なリソースが入り込むのを避けることができるので問題ないと考えています。

終わりに

まだ改善の余地があるものもありますが、モバイルチームで導入された効率化事例を紹介しました。 面倒な作業を自動化して楽になることももちろん嬉しいことですが、どう効率化していくかと手段を考えていく過程も楽しいと思っています。

Quipperでは誰かに許可を取る必要はなく、隙間の時間等を使って自由にこういった改善作業をすることができます。「一旦やってみよう、ダメだったら考えよう」の雰囲気があり、まだまだ発展途上のツールでもチーム内に取り入れてもらえるのでモチベーションもあがります。 Quipperでは他にも作業効率化・便利なツール/bot等がありますが、今回はモバイルチーム特有のものについて紹介しました。

皆さんのチームではどんな作業効率化をしていますか?ぜひオススメがあれば教えてください。

Quipperでは作業効率化のやっていき手を募集しています。 https://www.quipper.com/career/Japan/