はじめに
この記事では、CocoaPodsライブラリのテスト&リリースプロセスが非常に面倒なので、Travisを使って自動化する手順をまとめる。
モチベーション
新しいAWAREライブラリは、一つ一つのセンサが独立しており、必要に応じて必要なセンサだけをCocoaPods経由で追加できる。使う側は便利になった一方で、開発する側は20個以上のセンサライブラリを管理する必要があり、コンパイル・テスト・リリースまで面倒。一つ10分の作業でも20個だとそれだけで200分かかり、精神衛生的に非常に悪い。研究時間を確保するために、単純作業の時間は減らしたいので、できるだけ自動化しようと思う。
アプローチ
具体的には以下の3ステップを自動化する。
- GitHubにPushすると自動的にテストを実行
- タグ付きPushの場合、テストが通ればCocoaPodsに自動リリース
- テスト&リリース後にSlackに通知
CocoaPodsライブラリのテンプレートをpod lib create
コマンドを使って生成した場合、Travisの設定ファイルを標準で書き出しているので、今回はそれを活用する。
Travisとは
GitHub上のソフトウェアのビルドやテストを行う、継続的インテグレーション (CI) サービスの一つ。オープンソースのソフトウェアは無料でテスト&コンパイルを実行可能。テストやコンパイル、リリースの内容は、YML形式の設定ファイルに記述する。Travisと連携したGitHubリポジトリにPushすると、設定ファイルに応じてクラウド上で任意の処理を実行できる。Travisへ
CocoaPods ライブラリをTravis上でテスト
pod lib create LIBRARY_NAME
で自動生成してくれる Travisの設定ファイル(.travis)は、記述方法が古く、Swift4.0 + Xcode10 + iOS10 では使えなかったので、動作する設定ファイルをメモ。
ライブラリ生成時点では、以下の設定が.travisに書き出されているはず。
osx_image: xcode7.3 language: objective-c # cache: cocoapods # podfile: Example/Podfile # before_install: # - gem install cocoapods # Since Travis is not always on latest version # - pod install --project-directory=Example script: - set -o pipefail && xcodebuild test -enableCodeCoverage YES -workspace Example/[ライブラリ名].xcworkspace -scheme [ライブラリ名]-Example -sdk iphonesimulator9.3 ONLY_ACTIVE_ARCH=NO | xcpretty - pod lib lint
まず、xcode7.3 では、Swift 4.0 がサポートされてないので、最新のxcode10.1
に書き換える。使えるXcodeおよびmacOSのイメージはこのリンクから確認できる。次に、Podfileの場所を指定し、テストを行う仮想マシンを設定する。Provision Profile
が無いとアラートが飛んでくるので、ONLY_ACTIVE_ARCH=NO CODE_SIGNING_REQUIRED=NO
を加える[1][2]。最終的には以下のようになる。
osx_image: xcode10.1 language: objective-c cache: cocoapods podfile: Example/Podfile before_install: - gem install cocoapods - pod repo update - pod install --project-directory=Example script: - set -o pipefail && xcodebuild test -enableCodeCoverage YES -workspace Example/[ライブラリ名].xcworkspace -scheme [ライブラリ名]-Example -sdk iphonesimulator12.1 -destination OS=12.1,name="iPhone X" ONLY_ACTIVE_ARCH=NO CODE_SIGNING_REQUIRED=NO -allowProvisioningUpdates | XCPRETTY after_success: - echo 'success!'
TravisからCocoaPodsにライブラリを自動リリース
今回はリンク先のサイトが詳しいので、そこを参考にした。Travisはいくつか公式でアップロードをサポートしているプラットフォームがあるが、CocoaPodsはサポートしていないので、自作のスクリプトを使ってアップロードする。Travisの公式ページはこちら。
まずは、以下のコマンドを用いて、CocoaPodsのパスワード(トークン?)取得する。
$ cat ~/.netrc
machine trunk.cocoapods.org login [EMAIL] password [PASSWORD]
このパスワードをそのまま使うと危険なので、Travisが提供しているツールを使って、パスワードを暗号化する(詳しくはこちらへ)。.travisが存在するディレクトリで以下のコマンドを叩くと、自動的に.travisファイルに必要な設定を追加してくれる。travis
コマンドがインストールされない場合は、インストールの必要あり。
$ travis encrypt COCOAPODS_TRUNK_TOKEN="[PASSWORD]" --add
次に、CocoaPodsにリリースする為のスクリプト適当な場所に準備する。
$ mkdir scripts $ touch release.sh $ chmod -R 775 release.sh $ vim release.sh
release.sh
ファイルには以下の内容を記述する
#!/usr/bin/env bash source -/.rvm/scripts/rvm rvm use default pod trunk push --verbose
プロジェクトのホームディレクトに戻って、.travis
に以下の内容を追加する。以下の設定では、tag付きのpushがGitHubにあった時のみ、スクリプトを走らせる設定になっている。
deploy: provider: script script: "./scripts/release.sh" on: tags: true
最後に、タグ付きのgit pushを行って、CocoaPodsにリリースされるかを確認する。
$ git commit -m 'Release 1.0.0' $ git tag 1.0.0 $ git push origin master --tags
Travisのビルド&リリース結果をSlackに通知
SlackからTravisプラグインを追加する。そこにガイドがあるので、それに従う。
要領は先ほどのCocoaPodsと同じで、Slackから通知用のトークンを取得し、Travisコマンドを使って.travisに設定を追加する。
travis encrypt "[TEAM_NAME]:[SLACK_TOKEN]" --add notifications.slack
暗号化トークンを使って同時に複数チャンネルに通知する方法は、SlackのTravisページに説明されてないが、Stack Overflowに解決先が載っていた。
おわりに
Travisを使ったCocoaPods ライブラリのテストとリリースの自動化についてまとめました。これでコマンド一発で、テスト&リリースができる!Travisありがとう!!何か新しい機能を追加した場合には、内容を追加しようと思います。