Test and Release Automation for CocoaPods Library using Travis-CI

はじめに¶
この記事では、CocoaPodsライブラリのテスト&リリースプロセスが非常に面倒なので、Travisを使って自動化する手順をまとめる。
モチベーション¶
新しいAWAREライブラリは、一つ一つのセンサが独立しており、必要に応じて必要なセンサだけをCocoaPods経由で追加できる。使う側は便利になった一方で、開発する側は20個以上のセンサライブラリを管理する必要があり、コンパイル・テスト・リリースまで面倒。一つ10分の作業でも20個だとそれだけで200分かかり、精神衛生的に非常に悪い。研究時間を確保するために、単純作業の時間は減らしたいので、できるだけ自動化しようと思う。
アプローチ¶
具体的には以下の3ステップを自動化する。
- GitHubにPushすると自動的にテストを実行
- タグ付きPushの場合、テストが通ればCocoaPodsに自動リリース
- テスト&リリース後にSlackに通知
CocoaPodsライブラリのテンプレートをpod lib createコマンドを使って生成した場合、Travisの設定ファイルを標準で書き出しているので、今回はそれを活用する。
Travisとは¶
GitHub上のソフトウェアのビルドやテストを行う、継続的インテグレーション (CI) サービスの一つ。オープンソースは無料でテスト可能。YML形式の設定ファイルに処理を記述する。リポジトリへのPushで自動実行される。
CocoaPods ライブラリをTravis上でテスト¶
pod lib create LIBRARY_NAMEで生成される初期設定は古いため、Swift4.0対応版の設定が必要。最新のXcodeイメージ(xcode10.1)に更新し、Provision Profileエラー回避のためCODE_SIGNING_REQUIRED=NOパラメータを追加する。
初期設定¶
osx_image: xcode7.3
language: objective-c
script:
- set -o pipefail && xcodebuild test -enableCodeCoverage YES -workspace Example/[ライブラリ名].xcworkspace -scheme [ライブラリ名]-Example -sdk iphonesimulator9.3 ONLY_ACTIVE_ARCH=NO | xcpretty
- pod lib lint
更新版設定¶
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にライブラリを自動リリース¶
CocoaPodsはTravisで公式サポートされていないため、カスタムスクリプトが必要。
1. CocoaPodsトークン取得¶
$ cat ~/.netrc
machine trunk.cocoapods.org
login [EMAIL]
password [PASSWORD]
2. トークン暗号化¶
$ travis encrypt COCOAPODS_TRUNK_TOKEN="[PASSWORD]" --add
3. リリーススクリプト作成 (scripts/release.sh)¶
#!/usr/bin/env bash
source ~/.rvm/scripts/rvm
rvm use default
pod trunk push --verbose
4. .travisに設定追加¶
deploy:
provider: script
script: "./scripts/release.sh"
on:
tags: true
5. タグ付きPush¶
$ git commit -m 'Release 1.0.0'
$ git tag 1.0.0
$ git push origin master --tags
Travisのビルド&リリース結果をSlackに通知¶
Slackから"Travis-CI プラグイン"を追加し、トークンを取得後、暗号化して設定する。
travis encrypt "[TEAM_NAME]:[SLACK_TOKEN]" --add notifications.slack
複数チャンネルへの通知はStack Overflowで確認可能。
おわりに¶
Travisを使ったCocoaPods ライブラリのテストとリリースの自動化についてまとめました。本手順で単一コマンドでのテスト・リリース自動化が実現される。