will and way

ただの自分用メモを人に伝える形式で書くことでわかりやすくまとめてるはずのブログ

CIを前提としたプロジェクトのテンプレートができてた話

これはiOSアドベントカレンダーの10日目の記事です。

私にとって今年は、iOSエンジニアに転向した年でした。 それまではAndroid。 そして、携わっているプロジェクトのSwift化(未完)だったりiPhoneX対応だったりと劇的な半年でした。

ほぼゼロから始めたので、iOS SDKのサンプルアプリをいくつか作って勉強してたのですが、
そのうち、 CIを前提としたプロジェクトのテンプレートのような物が出来上がっていたのでそれを紹介したいと思います。

TL;DR

AnsibleでCIできるまでセットアップするプロジェクトテンプレートができてましたという話です。

大まかな使い方

  1. initialタグをチェックアウト
  2. プロジェクトをつくって、リポジトリと同じパスに配置。( initial-projectタグの状態を作る)
  3. プロビジョニング(Ansible)を実行(実行すると、apply-provisionタグの状態になる)

※ 実際に使う場合はトークンなどの認証情報が設定されている必要があります。

CI

  • fastlane

Deploy

  • Crashlytics Beta

Package Manager

  • CocoaPods

Provisioning

  • Ansible
  • Bundler

テンプレートプロジェクト

下記のテンプレートプロジェクトをもとに詳細を書いていきます

https://github.com/matsuokah/ProjectTemplate-iOSgithub.com

リポジトリをクローンしてからfastlaneを叩くまで2,3コマンドでできるようにする

Ansibleで環境構築を自動化することで、fastlaneのコマンドを叩くまでの時間を短縮することができました。 なるべく前提を減らし、ビルドに必要なアプリケーションがなくても動くように作りました。

流れを書くと

  1. make setup_toolsコマンドでシェルスクリプトをフック
  2. シェルスクリプトXcodeのインストール済みかどうかを判定。なければ、Safariを開いてXcodeのインストールを促す
  3. Ansibleがなければインストール、あればアップデート
  4. AnsibleのPlaybookを実行

Ansibleでやったこと

  • brewで必要なアプリのインストール
  • 各テンプレートのデプロイ
  • bundlerのインストール

テンプレート

主に作ったテンプレートは下記の通り

  • .gitignore
  • Podfile
  • fastlane関連
  • Gemfile

.gitignore

.gitignoreは特にプロジェクト作る度にまずこれを作りますが、うっかり忘れたり、排除対象の列挙が漏れると思わぬファイルを追跡してしまいます。
gitignore.ioで作るのもめんどくさい

今回はある程度使うものを予め盛り込んだテンプレートで対応しました。

脱線しますが、CLIではcurl http://gitignore.io/api/swift >> .gitignoreという書き方も可能です。

Podfile

Crashlytics Betaを使いたいので予め盛り込んだ状態にしています。
XXXXX.xcodeprojヒットしたターゲット名で生成しています。これであとはpod installするだけ。

よく使うライブラリは他にも盛り込んでもいいかも。RxSwiftとか。

fastlane関連

テンプレート化したのは下記の3つ。Fastfile 以外は自前の定義ファイルです。

  • Fastfile
    • ビルドシーケンス
  • AppContext
    • Xcodeのターゲット名やConfigurationなど、アプリを作るための環境変数の解決
  • Env

    • ビルドを実行するためのコンスタントな環境変数の定義
      • Fabricのトークンやシークレットキー、SlackのWebhook URLを定義
  • Gemfile

    • Bundlerのインストール

FastlaneEnvの管理について

プライベートリポジトリを使っていたので、気にせず直書きしていました。(セキュリティの意識は甘々ですが別の漏れても被害はほぼないので。) また、サンプルを作るときには、Bitbucketを使っていました。Privateリポジトリの作成が無料かつ無制限につかえます。 余談ではありますがCIにはBitriseを使いました。Bitriseは10分以内ビルドなら月に200回まで無料で使えます。 iOSかつ、プライベートなリポジトリのCIが無料でできるのはBitriseだけ(俺調べ)

テンプレートの使い方まとめ(再掲)

  1. タグinitialをチェックアウト
  2. プロジェクトをつくる(実行すると、タグ: initial-projectの状態になる)
  3. プロビジョニング(Ansible)を実行(実行すると、タグapply-provisionの状態になる)

まとめ

ということで、Xcodeプロジェクトを作ってからfastlaneを走らせるまでの作業を自動化してみました。

殆どのプロジェクトでは初回のみなのであまり機会がなさそうなソースですが、
手順が自動化でき、自分にとってのプロジェクトの作成マニュアルができました。

今回は盛り込んでいませんが、xcodeprojを使えばシェルの埋め込みも可能だと思います。
まだまだプロジェクトのテンプレートは育ちそうです。

それでは次は17日のSwiftのAdvent Calendarで〜。