Test and Release Automation for CocoaPods Library using Travis-CI

November 27, 2018 Yuuki Nishiyama 0 Comments

はじめに

この記事では、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ありがとう!!何か新しい機能を追加した場合には、内容を追加しようと思います。

Leave a Reply:

Your email address will not be published. Required fields are marked *