Bitriseを使ったライブラリの自動定期更新で楽に開発


Bitriseさんに賞をもらった時に、こっち書いた方がよかったかもなーと思った内容です。

ライブラリの自動定期更新にあたって

結論めちゃくちゃ楽になってOSの更新やSwiftの更新がある程度の規模でも10分で終わるようになりました。

お急ぎの方は「対象になりそうなプロダクト」からお読みください。

放置しがちなライブラリの更新は忘れられる

アプリを開発していると、ライブラリの更新があっても利用する機能が変わらないため日々の更新対応は優先順位は下がりがちです。
結果プロダクトバックログではどんどん下がり、いつしか忘れ去られる運命をたどります。

そして、静かに近づく時限爆弾の爆発

忘れ去られた結果、本来の対応とは別にframeworkの変更対応の工数が予測より増え、ビジネスチームが期待する新機能の追加や機能拡張をする時間を削られ、ロードマップをずらす時限爆弾が爆発します。

例えば
- XcodeやSwiftの新しいバージョンに切り替える際のリビルド時
- サードパーティもしくはAppleのレギュレーション変更時

こういった作業は元々、実施価値がビジネスサイドには見えにくいので、時限爆弾の爆発からの信用低下は避けたいところでもあります。

結局は、夏休みの宿題

結局コツコツと小さな差分をコンスタントに愚直に適用していくのが、楽なんです。
APIが変わらなければ、1日もかからずできます。

計算ドリル5問を毎日やるのと、150問全部やるのだったら、1日5問をやるのが楽ですよね。

でも、やらないんだなー

私は怠惰なので、結局今日はやらなくなって。夏休み明けに時限爆弾の爆発を迎えるのです。
でも私たちは大人になったのでやらない方法で解決しましょう。

対象になりそうなプロダクト

  • CocoaPodsやCarthageでライブラリ導入している.
  • 無料で仕組み化したい
  • めんどくさがり屋が多い

技術スタック

  • Bitrise
  • Fastlane
  • 自動テスト

とてもシンプルです。ライブラリ自動更新後の自動テストもセットで必要です。

例えば、SNSを利用したログイン/登録の機能が使えるかのテストであれば、大きく機能が修正されない限りはライブラリを呼び出せるかまで(Facebookでログインするを押してクラッシュしないかなど?)でもまずは良いと思います。

別の方法の検討

iOSにはDependabotがありません。Githubに吸収されてプロジェクトが止まってます。
またRenovateがあるのでCarthageの更新以外は利用すると良いと思います。

ざっくりとしたフロー

  1. Fastlaneでoutdatedでライブラリの更新がないかチェックする

  2. outdatedに更新情報が入っていたら更新を行う
    CarthageやCocoaPodsそれぞれ出力が違うのでチェック方法も変わります。

  3. updateを行いgitへpushし、pr

  4. prをトリガーに自動テストを実行

laneのイメージ

Fastfile.rb
lane :update_carthage do
  outdated += sh("carthage outdated")
  unless outdated.empty? then
  // 更新処理.
  // commit処理.
  // githubpushPRを作成.
  end
end
Fastfile.rb
lane :update_pods do
  outdated += sh("pod outdated")
  unless outdated.empty? then
  // 更新処理.
  // commit処理.
  // githubpushPRを作成.
   end
end

運用した効果

iOSやSwiftの更新は今年はCarthageのリビルドの10分だけで終わりました。
毎年1-4週間かかっていた作業はいったい何だったんだろうと感じました。
また自動テストと合わせて行うことで、コンスタントにライブラリの更新を実施可能になりました。
Bitriseで行うメリットはworkflowで普段使うstack(XcodeやOSなどの環境)と自動同期できるのでcarthageも自動化できるのが良いと思います。