ようやく暖かくなってきて春が近づいてきた感がありますが花粉症が辛い時期のiOSチームのかっくん(@fromkk)です。
そういえば先日のtry! SwiftはTimersのiOSチーム全員で参加してきました。
面白いトークばかりでしたが頑張って英語で聞こうとしたばかりにあまり理解が十分に出来なかった箇所もあるので動画が公開されたら振り返りたいなと思っています^^;
昨晩サーバーチームの人達と話をしていて、稀に Syntax error
が発生したコミットをプッシュしてしまい開発サーバーでエラーが出てしまう事があるという話を聞きました。
iOSでもビルドエラーだったりPushした後にCIでテストが通らなくてSlackでテストが失敗した旨を通知されると悲しくなりますよね。。
リモートリポジトリにPushする前にエラーチェック出来ないかなと思って少しトライしてみました!
Git hookを利用
Gitには各種コマンドが実行される際にスクリプトを呼び出す事が出来る hook
という仕組みがあります。
Gitを利用している人はプロジェクト直下の .git
フォルダの中を覗いてみると
HEAD config description hooks index info logs objects packed-refs refs
というフォルダ階層になっているかと思います。
この中の hooks
フォルダを見てみると
. ├── applypatch-msg.sample ├── commit-msg.sample ├── post-update.sample ├── pre-applypatch.sample ├── pre-commit.sample ├── pre-push.sample ├── pre-rebase.sample ├── prepare-commit-msg.sample └── update.sample
とサンプルファイルがあるかと思います。
今回は pre-push
をフックして xcodebuild
でテストを実行して通ればそのまま push
、失敗したら実行しないという処理を書いてみたいと思います。
事前準備
基本的に Terminal で作業を進めます。
# .git/hooksフォルダに移動します cd .git/hooks # pre-push ファイルを作成します touch pre-push # 実行権限を与えます chmod +x pre-push
これで準備は完了です。
shellscriptの作成
先程作成した pre-push
ファイルを修正します。
#!/bin/sh is_workspace=false #CocoaPods等を使用している場合はtrue project_name="YourProject.xcodeproj" #CocoaPods等を使用している場合は YourProject.xcworkspace project_path="`pwd`/${project_name}" scheme="YourProject" #適宜設定して下さい sdk="iphonesimulator" destination="platform=iOS Simulator,name=iPhone 7" if $is_workspace; then xcodebuild -workspace $project_path -scheme $scheme -sdk $sdk -destination "$destination" test else xcodebuild -project $project_path -scheme $scheme -sdk $sdk -destination "$destination" test fi status=$? if [ $status -eq 0 ]; then /usr/bin/osascript -e 'display notification "Test success!" with title "xcodebuild"' else /usr/bin/osascript -e 'display notification "Test failed...orz" with title "xcodebuild"' fi exit $status
簡単にコマンドを説明しておくと
xcodebuild test
でテストが実行できます。後は適宜必要なオプションを追加します$?
で前のコマンドの終了ステータスが取得出来ます。(参考)- テストの実行には時間が掛かるのでテストが完了したら
osascript
でMacの画面に通知を表示する様にしました。(参考) xcodebuild test
の終了ステータスをexit
で返す様にして、テストが通った場合はpush
が実行され、失敗した場合は実行しない様にしました。
まとめ
こんな感じで簡単にですがリモートリポジトリに push
する前にテストが通る事を確認する処理を書いてみました。
同じ様な問題で困った事がある方は試してみてはいかがでしょうか?
(サーバーサイドの世界では古くから利用されていたみたいですね。)
また、弊社では、子育て家族アプリFamm、カップル専用アプリPairyを運営しており、現在エンジニアを積極採用中です! 急成長中のサービスの技術の話を少しでも聞いてみたい方、スタートアップで働きたい方など、是非お気軽にご連絡ください! 採用HP : http://timers-inc.com/engineerings