ブログ一覧に戻る

Test and Release Automation for CocoaPods Library using Travis-CI

西山 勇毅
CocoaPods Travis-CI iOS CI/CD 自動化

Travis CI with AWARE

はじめに

この記事では、CocoaPodsライブラリのテスト&リリースプロセスが非常に面倒なので、Travisを使って自動化する手順をまとめる。

モチベーション

新しいAWAREライブラリは、一つ一つのセンサが独立しており、必要に応じて必要なセンサだけをCocoaPods経由で追加できる。使う側は便利になった一方で、開発する側は20個以上のセンサライブラリを管理する必要があり、コンパイル・テスト・リリースまで面倒。一つ10分の作業でも20個だとそれだけで200分かかり、精神衛生的に非常に悪い。研究時間を確保するために、単純作業の時間は減らしたいので、できるだけ自動化しようと思う。

アプローチ

具体的には以下の3ステップを自動化する。

  • GitHubにPushすると自動的にテストを実行
  • タグ付きPushの場合、テストが通ればCocoaPodsに自動リリース
  • テスト&リリース後にSlackに通知

CocoaPodsライブラリのテンプレートをpod lib createコマンドを使って生成した場合、Travisの設定ファイルを標準で書き出しているので、今回はそれを活用する。

Travisとは

GitHub上のソフトウェアのビルドやテストを行う、継続的インテグレーション (CI) サービスの一つ。オープンソースは無料でテスト可能。YML形式の設定ファイルに処理を記述する。リポジトリへのPushで自動実行される。

Travis-CI

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 ライブラリのテストとリリースの自動化についてまとめました。本手順で単一コマンドでのテスト・リリース自動化が実現される。

この記事をシェア