Passion+Action+Sincerely=Success!

週末にのみ趣味でコーディングするおやじの備忘録

Mac OS X YosemiteでAppiumがうまく動作しない件

会社から帰ってきて、早速Appiumの環境構築を開始した。ところが。。。。appium-doctorで、必要な環境が整ったか確認するも、以下のエラーが発生。

  

$ appium-doctor --ios

Running iOS Checks

Could not detect Mac OS X Version

Appium-Doctor detected problems. Please fix and rerun Appium-Doctor.

 

いろいろ調べても原因がわからない。ふと、以下の投稿を発見した。

なんだかバグっぽい。え!いきなり行き止まり?

https://discuss.appium.io/t/appium-doctor-returns-could-not-detect-mac-os-x-version-using-osx-10-10/1264

 

会社のMacは、まだ10.8だったのを思い出し、会社のMac上に環境構築してみた。appium-doctorで全チェックOKになった。

 

やっぱりOSX Yosemite 10.10固有のバグっぽい。

 

早く解決されることを祈る。

 

 

 

いよいよTestFlightをJenkinsに組み込み、バイナリの自動配布を行う。

 以前の投稿までで、GitにiOSプロジェクトをコミット後、自動的にビルドとテストを実行する、いわゆるContinuous Inetgration環境が構築できた。

 今回は、さらにContinuous Deploymentっぽく、TestFlightによるバイナリの自動配布まで自動化するぜ!

 おおまかに以下の3つのStepを実行する必要があるよ。

  • [Step1] まずは、ここまでで作成できた.ipaファイルを、TestFlightで自分のiphone端末に配布できるようにする。
  • [Step2] Jenkinsに、TestFlight Pluginをインストールし、システム設定を行う。
  • [Step3] JenkinsジョブのPost-build Actionに、組み込んで、作成されたipaファイルを自動的にTestFlightにアップロードし、TestFlightに登録されているDistribution Listに配布する。

(1) IPAファイルを、TestFlightで自分のiPhoneに配布できるようにする。

  • まずは、TestFlightにアカウントを作成して、ipaファイルをアップロードする。作成方法は、ここを参照しよう。
  • アップロードしたら、こんな感じにAppsに表示される。

f:id:diinosimple:20141103190852p:plain

  • まずは、自分を含むテスターに、配布するには、該当のアプリを選択し、Permissionsタブを選択し、配布先のUserの左側のチェックボックをクリックして、右下の[Update & Notify]をクリックする。これで自分を含むテスターにEmailが送信される。

f:id:diinosimple:20141103191503p:plain

f:id:diinosimple:20141103191536p:plain

  • ちゃんと以下のようなメールを受信したぜ!

f:id:diinosimple:20141103192136p:plain

  • メール中の[Install]ボタンをクリックし、手順に従って進むことで、iphoneにアプリがインストールできたぜ。

(2) Jenkinsに、TestFlight Pluginをインストールし、システム設定を行う。

[1] まずは、JenkinsにTestFlight Pluginを導入する。

続きを読む

Jenkinsにジョブを組み込み、iOSアプリのビルドとテストを自動実行するぜ

 Jenkinsを起動できる環境は整備されていることを前提とする。もしまだ整備されていないなら、以前の投稿をみてくれ!

 もうひとつ、以下ではiOSのテストのフレームワークにKiwiを導入している。iOSアプリのプロジェクトにKiwiを組み込む方法は、この投稿を見てくれ!

 

(1) Jenkinsにプラグインをインストールする。

 まずは、Jenkinsのダッシュボードから、iOSアプリのビルドとテストを実行するために必要となる各種プラグインをインストールする。

 Jenkinsのプラグインをインストールするには、ダッシュボード画面の左側に表示されているメニューから[Manage Jenkins]を選択し、[Manage Plugins]を開く。  

[Available]タブを開き、プラグインを選択し[Install without restart]をクリックしてインストールします。上部の検索バーにインストールしたいプラグインの名称を入力すると、目的のプラグインをすぐに探し出せる。

f:id:diinosimple:20141103172419p:plain

設定するのは、以下の4つのプラグイン

[1] Git Plugin

  Gitリポジトリからソースコードをクローンするためのプラグイン

[2] Xcode Plugin

  Xcodeプロジェクトのビルドやテストを実行するために必要なプラグインXcodeに付属している「xcodebuild」というXcodeプロジェクトをビルドするためのコマンドラインツールの各コマンドを実行する。

[3] CocoaPods Plugin

  CocoaPodsのコマンドを実行するプラグイン。「pod install」などのコマンドを実行できます。

[4] Cobertura Plugin

 テストのコードカバレッジを解析するためのプラグインです。コードカバレッジをJenkinsのダッシュボードにグラフィカルに表示する。

 

(2) Xcodeプロジェクトの設定変更

 XcodeプロジェクトをJenkinsでビルド/テストするには、Xcodeワークスペースを開き、メニューから[Product]->[Scheme]->[Manage Schemes]を選択する。

 この中の、対象のTarget Projectと同じ名前のSchemeの[Shared]にチェックを入れてくれ!。これにより、Schemeリポジトリに共有できるようになるらしい。

f:id:diinosimple:20141103173218p:plain

 んでもって、プロジェクト設定の[Build settings]にも変更を入れるぜ。

[Generate Test Coverage Files]と、[Instrument Program Flow]を[Yes]に変更しよう。これで、テストのカバレッジファイルが書き出されるそうだ。

f:id:diinosimple:20141103173541p:plain

f:id:diinosimple:20141103173553p:plain

 

いよいよ、Jenkinsのジョブを作成するぞ!

(3) Jenkinsジョブの作成

 Jenkinsジョブを作成するには、ダッシュボード画面の左上の[New Item]を押し、Item nameに、例えばMyLocations-developと入力し、[Freestyle project]を選択、OKボタンをクリックする。

f:id:diinosimple:20141103174126p:plain

 次にジョブ設定画面が表示される。ジョブの対象となるGitレポジトリや、ジョブがどのようなビルドを実行するか、ビルド実行後にどのような処理を行うかなどをジョブの詳細を設定していく。

(4) Source Code Management

  • Gitにチェックボックスを入れて、対象となるiOSアプリのGit RepositoryURLを指定する。
  • Credentialsは-none-で良い。
  • Branches to buildは、デフォルトでは、masterになっているので適宜変更する。
  • そのほかの設定は、特に変更する必要はない。

(5) Build Triggers

 ジョブをどのタイミングで実行するかは[Build Triggers]セクションで設定できる。とりあえず、SCMをpollingという設定を試してみた。これは、リポジトリをpollingで更新がないか定期的にチェックする設定だ。

 15分ごとにpollingを実行するには、以下のような設定をすべし。

f:id:diinosimple:20141103174910p:plain

 

(6) Build

次にビルドの設定だが、ここでは、ジョブを行う時の処理の流れと処理の設定を行う。今回は、以下の順番で処理を実行させる。

[1] CocoaPodsの実行(pod install)

[2] Xcodeプロジェクトのビルド(ipaファイルの生成)

[3] xcodebuildコマンドによるテスト実行

[4] Gcovrによるテストのカバレッジファイルの出力

 

  • [1] CocoaPodsの実行について
続きを読む

WordpressをHerokuにdeployしたがいろいろ制限がありHatenaを使うことにした

 Herokuアプリを再起動すると、Gitでバージョン管理されていないファイルは消えてしまうそうです。そんなの知らなかった。なので、画像はアップロードはできるけれども、アップロードしたファイルは消えてしまうのだ。

 再起動時というのがポイントで、HerokuはDynosという単位でCPUを使っているのですが、こいつ、24時間に1回勝手に再起動してしまう。

  従って、うっかり管理画面からテーマをインストールして設定すると、次の日には、テーマが壊れており、アクセスできないという問題が発生します。同様に、アップロードした画像もおそらく消えてしまう。これでは、ブログとして使えない。

 ただし、画像をAmazon S3にあげるなど、いろいろ方法はあるようですが、私の場合は、諦めて、Hatena blogに引っ越しました。さよならHerokuさん。残念。

 

 

 

iOSアプリのUnitTestテストをKiWiで実現するぜ!

前回の投稿までで、MacにJenkins環境を構築できたので、次にiOSアプリの自動テストをJenkinsに組み込みたい。BDD(Behavior Driven Development) FrameworkのKiwiを導入することにしたぜ!Kiwiは、BDD framework for Objective-Cで、詳しい解説は、ここにあるぞ。

(1) まずは、CocoaPodsをインストールする。これはiOSプロジェクトに、Kiwiを組み込むために必須。

まずは、CocoaPodsをインストール。

$ [sudo] gem install cocoapods
$ pod setup

(2) 次に、Unit Test Targetをセットアップ。

Project Navigatorで、Projectを選択した際に、既にUnit Test Targetが存在するなら、このステップは不要。
なければ、Unit Test Targetを追加しておこう。

1. Project Navigatorで、Projectを選択。
2. 以下で、Cocoa Touch Unit Testing BundleをProjectに追加。

File -> New -> Target... -> Other -> Cocoa Touch Unit Testing Bundle

スクリーンショット 2014-11-03 13.16.18

3. 適切な名前をつけて"Finish"をクリック。

スクリーンショット 2014-11-03 13.16.57

こんな感じで、Unit Test Targetがprojectに追加されていればOK。以下の例では、MyLocationsTestsが、Unit Test Targetだ。
スクリーンショット 2014-11-03 13.17.12

(3)Podsのインストール

次にiOS project用のPodfileを作成する。このファイルには、CocoaPodsが管理すべきlibraryを記載する。

1. まず、Xcodeプロジェクトを終了させる。
2. .xcodeprojがあるのと同じディレクトリにPodfileという名前のファイルを作成し、以下のように記載する。
前のステップまでに作成したUnit Test Targetの名前を使う必要がある(この例では、MyLocationsTest)。

# Podfile
# Uncomment this line to define a global platform for your project
platform :ios, '7.0'
source 'https://github.com/CocoaPods/Specs.git'
target 'MyLocationsTests' do

       pod "Kiwi"

end

3. Podsのインストール。
以下を実行すると、CocoaPodsが必要なlibraryをダウンロードし、設定してくれる。

$ pod install

4.今後は、xcode projectをオープンする、.xcworkspaceを使う。

$ open myproject.xcworkspace

(4) Unit Test Targetの設定

Build settingタブを選択し、Other Linker flagsに、-ObjC -framework SenTestingKit を設定しよう。これがないとWikiが動かないぞ!

(5) Schemesの設定

Xcodeは、Schemeと呼ばれる仕組みを使って、どのTargetをどんな設定でビルドするかを決定している。

1. Scheme Managementを開く。

Product -> Scheme -> Manage Schemes...

スクリーンショット 2014-11-03 14.12.47

2. Projectと同じ名前のSchemeがあると思うので、それをShared設定してください。

スクリーンショット 2014-11-03 14.13.12

3. 今度は、Edit Schemeする。

スクリーンショット 2014-11-03 14.27.35

4. 左側のPaneからTestを選択し、Unit Test Target (MyLocationsTests)がリストされており、右端のTestフィールドにチェックが入っていることを確認する。もしなければ、"+"を押して追加しよう。以下のようになっていればOKだ。

スクリーンショット 2014-11-03 14.29.49

(6) テストを書く

やっと、環境が構築できたので、試しに何かのテストを書いてみよう。

1. Test caseをprojectに追加する。すでに.mファイルが、存在する場合は必要ない。

多分、ここまでで、MyLocationsTests.mがMyLocationsTestフォルダに存在するので、それを使えば良い。もし存在しないなら、以下のようにしてファイルを作成する。

File -> New -> File -> Test Case Class

以下のようにすれば、Unit Test TargetのMyLocationsTestsフォルダに、SampleTest.mが作成されるはずだ。

スクリーンショット 2014-11-03 14.58.34 スクリーンショット 2014-11-03 14.59.18

2. Unit Test TargetのMyLocationsTestsフォルダにある、.mファイルに、以下のようなテストを書く。

#import "Kiwi.h"

SPEC_BEGIN(MathSpec)
describe(@"Math", ^{
    it(@"is correctly answered", ^{
        NSUInteger a = 16;
        NSUInteger b = 26;
        [[theValue(a + b) should] equal:theValue(42)];
    });
});
describe(@"Math", ^{
    it(@"is wonglyy answered", ^{
        NSUInteger a = 20;
        NSUInteger b = 10;
        [[theValue(a - b) should] equal:theValue(9)];
    });
});

3. テストを実行する。
以下で実行するか、デフォルトホットキーの Command-Uで、テストを実行する。

Product -> Test

ビルドが開始され、Simulator上でアプリが起動した後、さらに、テストが自動的に実行される。

この例では、2つめのテストでエラーになる。
すると、デスクトップ上に、以下のような画面が表示される。

スクリーンショット 2014-11-03 15.06.04

この画面をクリックすると、以下のようなテスト結果が表示されるぜ。テストでFailした箇所がわかるので、Debugしよう。

スクリーンショット 2014-11-03 15.08.56

デバッグ後、再度、Command-Uでテストを実行すると、以下のようになり、2つのテストケースがパスしたことがわかる。

スクリーンショット 2014-11-03 15.11.04

スクリーンショット 2014-11-03 15.11.13

 

やったー。これで、iOSのUnitTestをKiwiで組み込み成功したぜ。次は、いよいよJenkinsで、Gitにコードをコミットするたびに、自動的にビルドとテストを実行させるぜ!

iOSアプリ開発にCIツールJenkinsを導入するぜ!

まずは、CIツールJenkinsをMacにインストールする。

(1) Command Line Toolsのインストール

忘れずに、Command Line Toolsをインストールしよう。

$ xcode-select --install

(2)Gcovrのインストール

よくわからんが、GcovrはXcodeが出力するコードカバレッジファイルをXML形式に変換するツールらしい。Jenkinsでテストのカバレッジを表示するために必要となる。

$ easy_install gcovr

(3)OCLintのインストール

OCLintはObjective-Cの静的解析ツールXcodeに標準搭載されている「Clang」よりも強力な解析を行ってくれるそうです。最新版は、「OCLint」からインストールしようね。

$ curl -O http://archives.oclint.org/nightly/oclint-0.9.dev.6a4451b-x86_64-

$ darwin-12.4.0.tar.gz

$ tar xvf oclint-0.9.dev.6a4451b-x86_64-darwin-12.4.0.tar.gz

$ mv oclint-0.9.dev.6a4451b /usr/local/oclint

(4) Homebrewをインストール
もしかしてHomebrewインストールしていない? なら、以下を実行しよう。

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

インストールが終わったら、doctorコマンドを実行してく。doctorコマンドは、Homebrewの動作環境に不備がないか診断してくれるぞ。

$ brew doctor

もちろん問題あれば、メッセージと対処コマンドが表示されるので、それに従って問題解決すべし。

(5) Jenkinsのインストール

Jenkinsはターミナルからhomebrewを使ってインストールするぞ。

$ brew install jenkins

こんな感じのメッセージがでるぞ。

==> Downloading http://mirrors.jenkins-ci.org/war/1.549/jenkins.war

########################################################################

100.0%

==> Caveats

Note: When using launchctl the port will be 8080. !

To reload jenkins after an upgrade:

launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist

launchctl load ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist

==> Summary

/usr/local/Cellar/jenkins/1.549: 3 files, 64M, built in 4.2 minutes

(6) Jenkinsの起動

$ java -jar /usr/local/opt/jenkins/libexec/jenkins.war

確認には http://127.0.0.1:8080/ にアクセスする。

なお、JenkinsがOS起動時に自動的に起動するように設定することもできる。

$ ln -sfv /usr/local/opt/jenkins/*.plist ~/Library/LaunchAgents

$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist

確認には http://127.0.0.1:8080/ にアクセスする。

こんな感じで、立ち上がったら成功だぜ。 

f:id:diinosimple:20141103170536p:plain

次に、iOSプリプロジェクトに、KiwiのBDD (Behavior Driven Development)環境を取り込み、Jenkinsで自動テストをできるようにするぜ!
ちょっと疲れたので、次の投稿でこの辺りをやってみるぞ。