2017年のiosアプリ開発におけるci事情
TRANSCRIPT
自己紹介
平田敏之@DeNA / SWET (Software Engineer in Test)
ミッション
DeNAサービス全般の品質向上
DeNAエンジニアの開発生産性向上
私がやっていること(の一部)
クライアントアプリ周りのテスト戦略、自動テストの開発
CI/CD環境整備
テスト基盤環境の開発(マスティフ、ダルメシアン etc)
iOS / Android Test Night 主宰
(時間的に)本発表で話さないこと興味がある項目があれば別の機会で是非
• CIについての話
• CIの導入タイミング
• CIの導入を妨げるもの
• プロセスをCIに乗せるための手順
• CIで誤解されやすいこと
• CIでやること(の例)
• CIの比較
• 料金による比較
CIとは?
CI(continuous integration):継続的インテグレーション
• ビルドを継続的に行いフィードバックを早期に受け取るための仕組み
• ビルド:アプリのビルド、自動テスト、インスペクション、ドキュメント生成 etc
• 継続的:(基本的には)コードに変更が加わった時点で常に実行
• フィードバック:ビルドの成功、失敗(なにで失敗したか)、ビルドにかかった時間 etc
• CIサービスで情報を見せるか、それ以外で見せるか
• フィードバックを元に改善していくのが大事
• 早期:(出来れば)10分以内にフィードバックを受け取るのが良い
CIの価値(の一部)
• リスクの軽減
• 問題の早期発見につながる
• 自分の環境以外で動かすことで開発環境についての思い込みを減らせる
• 開発者の生産性を向上
• 繰り返しの多い手作業の削減による労力の節約
• その結果、より思考力を必要とする仕事に時間をさける
• プロジェクトの見える化
• ソフトウェアの状態が見えるため何かが起きたときに気づきやすい
• プロダクトへの自信
• 常にCIが動いていれば、プロダクトに対する安心をえられ、それが自信につながる
これらにより高頻度リリースを支えてくれる
iOSアプリ開発で使えるCI
iOSアプリ開発における代表的なCIサービス
• Jenkins(オンプレミス)
• ※最近はJenkins以外も色々あります※
• Bitrise
• CircleCI 1.0
• Travis CI
• NEVERCODE
• buddybuild
https://github.com/tarappo/ci-sample-ios
各CIの特徴
Bitrise CircleCI 1.0 Travis CI NEVERCODE buddybuild Jenkins
FREEプラン o x x OSSならFree o o -
お試し期間 x2 weeks
$249/moのプラン100ビルドまで
14 days
全機能利用可能21 days
プランはどれでもOK-
割引等BitriseのOSSツールに貢献すると割引有
OSSの場合割引有
OSSの場合無料
ビルドフロー workflowcircle.yml
CircleCI 2.0 まであと...travis.yml
workflowは $265/mo以上のプラン
buddybuild_postclone.sh
buddybuild_prebuild.sh
buddybuild_postbuild.sh
色々有Jenkinsfile / .travis.yml /
シェルスクリプト etc
SIGNING周り webサポートツール有り
web スクリプト web webplugin
スクリプト
その他 ビルド上限時間/回 ビルド上限時間/月crash report
SDK 自由
選定をするにあたって
• 利用するCIサービスは1つじゃないとダメというわけではない
• 用途に応じて使い分けるのも1つの手です
• 最近のクラウドCIサービスは(簡単に)出来ることが増えている
• アプリバージョンのインクリメントやiTunesConnectへのアプリのアップロードなどなど
• 「複雑なこと」「細かいこと」をやろうとするとJenkins(オンプレミス)が良い事が多い
• 何でも出来るが…
選定例
• OSS
• Travis CI(無料) / CircleCI(割引有)
• 個人:アプリ
• Bitrise / NEVERCODE / buddybuild (free plan) / Jenkins(オンプレミス)
• 会社:アプリ (導入するプロジェクト次第)
• プロジェクトの規模 / メンバー数 / CIの導入状況 / CIに対する慣れ / やりたいこと etc
• 一度、お試し期間(or free plan)で触ってみるのが良い
• ※お試し期間中はfree planより良いplanになる点に注意※
(時間的に)本発表で話さなかったこと
• CIについての話
• CIの導入タイミング
• CIの導入を妨げるもの
• プロセスをCIに乗せるための手順
• CIで誤解されやすいこと
• CIでやること(の例)
• CIの比較
• 料金による比較
CIの導入タイミング
• (出来れば)プロジェクトの初期から導入
• 後半になってくると導入コストが初期に比べ高くなってしまう
• 初期以外のタイミングでの導入の場合
• ※人は変化に抵抗する傾向がある※
• 小規模に導入し、徐々に機能を追加していくのが良い
• まずは小さく小さく
• 「やること」:アプリのビルド
• 「動くタイミング」:1日1回niglty単位(など)
CIの導入を妨げるものよくある不安・疑問
• 「費用、維持コストが高いのでは?」
• 人にかけているコスト(等)に比べたら安い• アプリのビルドなどにより奪われた時間などを計測すると良い
• 「これまでのやり方が変わるのではないか?」
• 本来はプロセスなどはより良い姿に変えていくべきであるが、変えることに不安があるのは普通
• がらりと変えずに少しずつ導入するのが良い
• 「ビルドエラーがたくさん出てしまうのではないか?」
• 手作業であっても(フィードバックが遅い状態で)同等の結果になる
• 「開発者がやるのと違いがないのではないか?」
• より効率良く、より確実に、専用の環境を使って実行している
• 新たなメンバーが加わったときにも効果を発揮する
プロセスをCIに乗せるための手順
• (1) 特定:自動化を必要とするプロセスを特定
• 何度も動かす意味のあるもの
• (2) ビルド:スクリプトを作成する
• 便利なライブラリがあることが多い
• (3) 共有:バージョン管理システムで誰もが使えるようにする
• 特定の個人またはCI環境でのみ動くという状況にはしない
• (4) 継続化:CI環境で動くようにする
誤解されやすいこと
• 開発者が1人ならCIを利用する必要はない
• 1人でもメリットがあります(仕事を任せられるパートナーになります)
• Jenkinsを使ったらJenkinsおじさんが生まれてしまう
• (場合によっては)他のCIサービスでも生まれます
• iOS / Android / Webと全て同じCIを使ったほうが良い
• (やりたいこと次第ですが)使うCIを縛られるよりもあったものを利用するのが良いです
CIでやること(の例)
• アプリのビルド
• インスペクション
• ドキュメント生成
• アプリの配布(DeployGate / TestFlight etc)
• アプリの自動テスト
• 単体テスト
• UIテスト
• 新バージョンでのテスト
• 旧バージョンでのテスト
• iTunesConnectのデータ更新
• アプリを審査に出す
デバイスファーム
UIテストの高速化
各CIの特徴
Bitrise CircleCI Travis CI NEVERCODE buddybuild Jenkins
ビルド時間(平均)試行回数: 7
82.9 sec 77.43 sec 137.43 sec 102.43 sec 127.00 sec マシンスペック依存
上記のプラン Freeプランお試し期間
$249/moと同じFree(OSS) Freeプラン Freeプラン -
FREEプラン o x x OSSならFree o o -
お試し期間 x 2 weeks 100ビルドまで 14 days 21 days -
Free(or お試し期間含)で出来るプランの場合
(注)実行開始してからの時間
料金による比較
(4) (5) (1) (2) (4) (1) (1) (3) (4) (1) (5)
値段($/月) 0 0 0 39 43 45 45 69 71 90 114
並列数 1 1 1 2 1 1 2 1 1 3 1
ビルド上限時間/回 - 20 10 - - 45 60 - - 75 -
ビルド上限時間/月 - - - 500 - - - - - - -
(1)Bitrise (2)CircleCI (3)Travis CI (4)NEVERCODE (5)buddybuild※注意※各サイトに記載されている料金を元に一覧を作っています(カスタムプランや並列数を増やした時の料金は出していません)
年間払いがある場合は年間払いの金額を記載しています
(2) (3) (4) (5) (2) (3) (4) (5) (2) (3) (4) (5)
値段($/月) 129 129 149 245 249 249 263 429 449 489 571 1,037
並列数 5 2 3 3 7 5 6 5 12 10 11 10
ビルド上限時間/回 - - - -
-- - - - - - -
ビルド上限時間/月 1,800 - - - 5,000 - - - 25,000 - - -
ビルド回数 200回/月