0から始めるiOS自動化

渡邊海斗氏(以下、渡邊):みなさんこんばんは。クラシルのiOSエンジニアをしています渡邊と申します。クラシルというか、delyでは2017年6月からiOSエンジニアをやっているので、ほぼ1年ぐらいという感じです。

今回の話はiOSアプリの開発ということで。ちなみにiOSエンジニアとかiOSの開発したことある方はどれぐらいいますか?

(会場挙手)

ありがとうございます。思ったより多いですね。もう少しいないかなと思っていました。開発していない方もいらっしゃると思うので、気軽に聞いていただければと思います。

さっそくですが、iOSアプリの開発はけっこうすることがあります。リリースやテストはもちろんそうなんですが、機能を追加したり、なにか問題があったらそれを修正したりとか、そういったことをやっています。

クラシルは比較的少数でやっています。少人数での開発で全部やるのはけっこう大変なんですよね。でも、1人あたりの時間を増やすわけにもいかないので、基本的には人を増やしたいです。

でも、人を増やすのって大変ですよね。だいたいの方がそうだと思うんですけど、採用するのもすごい大変だし、採用しても会社に合うかわからないし、パフォーマンスをすぐ出せるかわからないし、辞めちゃうかもしれないし。

なので、基本的に全部やろうということは無理で、自分のやることを減らすしかありません。でも、人が少ないのでほかの人に任せるわけにもいきません。なので、基本的に自動化します。

これが1年前、入社時のiOSの開発で自動化しているときは、0です(笑)。これはあかんぞと。さすがにリリースなどを全部手動でやるのはやばいと思って、0の状態から自動化を始めていきました。

定期的に繰り返すことを自動化する

まずは定期的に繰り返していることが自動化と相性がいいのでそこからはじめました。絶対「リリース」はするよねと。なのでiOSのリリースを自動化することに取り組みました。「リリースする」といってもけっこういろいろなことがあります。とくにiOSは審査があったりします。

ですが、iOSのリリースで使うツールには最強のものがあって。iOSの開発をしている人には有名だと思いますが、fastlaneというツールがあります。

アプリのビルドをしたり、App Store Connectにアップロードしたりとか、β版配信したりとということをほんの数行コードを書いてコマンドを実行するだけで、この上のようなことをやってくれたりします。

fastlaneを追加した結果、だいたいこれぐらい生産性が上がりました。

……と思いきや、fastlane単体だと、それを自分のPCで動かしたりすると、その間にビルドをしていると、ほかのプロダクトの開発ができない。開発だとGitHubをよく使うと思うんですが、「それをGitHubにマージしたら、なにかする」みたいなこともできません。

なので、これだけfastlaneの力を十分に活かせなので、実質これぐらいしかまだfastlaneの力が出せていません。その力を出すにはCIサービスを使う必要があります。

CIサービスがもたらしたもの

CIというのは継続的インテグレーション(Continuous Integration)の略です。簡単に言うと、定期的にビルドやテストを実行して、問題があったら早い段階で通知してくれるもの。これは手元のPCを使うわけではないので、並行して開発ができたりします。一番大事なのが、fastlaneの実行ができるというところです。

CIのサービスで、クラシルの開発ではBitriseというサービスを使っていて、すごい使いやすくて、スケジュール機能があって、料金体系も今の開発の型にすごい合っているのでこれを選んでいます。

できるようになったのはこんな感じです。なので、開発がすごく進むようになりました。あと、Slackを使われている方が多いと思うんですけど、Slackから呼び出せます。なので、fastlaneとBitriseを組み合わせると、こんな感じで生産性が上がります。

でも、課題点はけっこうあります。さきほど言ったSlackのコマンドなんですが、Bitriseを呼び出すコマンド、例えばmasterブランチでリリースというワークフローを動かすというコマンドなんですが、けっこう覚えられなくて。一文字でも間違えると「ワークフローの実行に失敗しました」みたいな感じで出てしまいます。あと、すごく味気ないんですよね、コマンドって。

なので、Chatbotにしようと思いました。ChatbotをSlackで動かすには、Slackのアプリを作る必要があります。それをAWSのLambdaを経由してBitriseで呼び出すということをやっています。

こんな感じのbotを作って、実際に導入してみました。なにが一番良かったかというと、Chatbotにすると、一緒に仕事している感がけっこうあります。

(会場笑)

まず、コマンドじゃなくてメンションになるので、お願いしてる感じですね。思わず敬語を使ってしまいます。

一番上のやつだと、「次回バージョンの準備」みたいなキーワードが入っていればいいんですが、「お願いします」ってつけちゃったり、「おつかれさま」と言ってもらえるとなんかうれしかったり。これはほかのチームメンバーなんですが、スタンプをつけて「ありがとう」という気持ちを伝えたくなっちゃう。

(会場笑)

……なので、Chatbotをつけると、生産性が上げるというのはもちろんですが、楽しさが生まれます。でも、やっぱり仕事を楽しくするとそれだけはかどったりとかするので、さらに生産性が上がりました。

生産性が上がると同時に、実は選択肢もすごく広がりました。これはSlackに関しての話ですが、Slackのボタンもできるようになりました。こんな感じで「次のバージョンはどれですか?」みたいなのを出してくれて、このボタンを押したらそれ用のビルドを作ってくれます。

あと、あまり知られていませんが、こういう感じでフォームが出てきて、なにかここを入力して、それでなにかするみたいなこともできたりします。なので、さらに生産性が伸びました。

忘却を克服する

それでもやはりまだ課題はあります。人間は忘却する生き物なので、僕もめちゃくちゃ忘れっぽくて、この時間にリリースしようと思ってリリースボタンを押さないといけないんですけど、急なタスクが入ったりするとすぐ忘れちゃったりとか、実装に集中しすぎて忘れたりということをめちゃくちゃやってしまいます。なので、ボットに通知してもらおうと思いました。

まず、Bitrise選んだ理由の1つでスケジュール機能という点があります。beta版なんですが、曜日と時間を指定して「特定のこれをやってください」ということができます。現時点ではいくつでも作れそうなのでいい感じだなと。

通知を実際にやってみました。その結果、たくさんワークフローができてしまいました。そして、通知ごとにワークフローを作らないといけないのでたくさんできてしまい、全部GUIでポチポチしないといけないのですごく面倒くさくて。

変更履歴もわからないからやっぱりGit管理したいなぁ、fastlaneでなんとかしたいなと思い、今度はfastlaneのプラグインを作ってみました。

fastlaneのプラグインは意外と簡単に作れます。通知のスケジュールを定義して、Bitriseでそのスケジュールを1時間ごとに実行するようにと設定しておいたら、それに該当する時間になったら勝手に実行してくれるというものを作りました。

簡単にfastlaneのプラグインのテンプレートがコマンドで作れたりするので、GitHubに上げたりとか、gemとして公開したりということもサクッとできます。

実際にボットにいろいろ通知してもらいます。まだレビューが終わっていないPull Requestを朝に通知してくれたり、審査に提出する時間を教えてくれたり、テストを定期的に実行したりということをやっています。

これによって、「これをしないといけないな」とか「これを忘れたらやばい」みたいなことをあまり考えなくてよくなったので、安心感が生まれました。

リリース担当者は月あたり2日分生産性UP

他にも、さまざまな自動化をやりました。GitHubリリースを自動生成したり、それを自動生成したものをGoogle Calendarに送ったり。なので、こういうことをやって、いつこういう内容をリリースしたというのがわかるようにしました。

チェンジログを書くようにしているんですけど、それもすぐ忘れてしまうので、Dangerというツールを導入してそういうのも全部通知してくれるようにしたりとか。テストを毎日実行して、結果のファイルや、どれぐらいテストが回っているかを通知してくれたりとか。

そんなことをいろいろやって、1年前は0だったんですが、今はガンガン生産性が上がっています。

なので、すごくざっくりなんですが、リリースの担当者、僕なんかは、月あたり2日分ぐらいは負担がなくなったと感じています。2日あれば小さめの機能はサクッと作れたりします。そうじゃないエンジニアも1日ぐらいは負担軽減されたかな、という感じになっています。

その他の効果としては、決まったことを確実にやってくれるので、ミスがなくなりました。ミスしちゃいけないと思って人間がやる部分があるんですが、それがなくなるので心理的に負担が軽減されています。

また、ちょうど今週、僕、月〜火になぜか熱が出て休んでしまったんですが、そんなときがあっても、ほかの代わりのメンバーが、ボットを呼び出すだけでリリースができたりとか。

あとは、IT業界は人材の入れ替わりが激しいと思いますが、そういうときにドキュメントを残さなくてもスムーズに替われるというメリットもあるかなと思っています。

機会に任せて、やるべきことをやる

まとめになります。iOSのプロダクトは大変です。でも、自動化するとリソース増やせたり楽になったりします。ちゃんと繰り返し忘れずにやるということは人間は得意ではないと僕は思っているので、そうしたことはちゃんと機械に任せて、やるべきことをやりましょう。

そうやって自動化して、「プロダクトの開発は本質的にどんなことをやるべきか」であったり「こういうことをやりたい」ということに時間を使えるのはすごい楽しいなと思ってやっています。

自動化に興味ある方や大好きな方は、このあと懇親会とかでお声がけいただければと思います。以上で終わります。ありがとうございました。

(会場拍手)