Tech Blog

グローバルな家族アプリFammを運営するTimers inc (タイマーズ) の公式Tech Blogです。弊社のエンジニアリングを支える記事を随時公開。エンジニア絶賛採用中!→ https://timers-inc.com/engineering

Gitでpushする前にテストが通る事を確認する

f:id:bboykk:20170317124622p:plain

ようやく暖かくなってきて春が近づいてきた感がありますが花粉症が辛い時期の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 でテストが実行できます。後は適宜必要なオプションを追加します
  • $? で前のコマンドの終了ステータスが取得出来ます。(参考)
  • テストの実行には時間が掛かるのでテストが完了したら osascriptMacの画面に通知を表示する様にしました。(参考)
  • xcodebuild test の終了ステータスを exit で返す様にして、テストが通った場合は push が実行され、失敗した場合は実行しない様にしました。

まとめ

こんな感じで簡単にですがリモートリポジトリに push する前にテストが通る事を確認する処理を書いてみました。
同じ様な問題で困った事がある方は試してみてはいかがでしょうか?
(サーバーサイドの世界では古くから利用されていたみたいですね。)


また、弊社では、子育て家族アプリFammカップル専用アプリPairyを運営しており、現在エンジニアを積極採用中です! 急成長中のサービスの技術の話を少しでも聞いてみたい方、スタートアップで働きたい方など、是非お気軽にご連絡ください! 採用HP : http://timers-inc.com/engineerings

Timersでは各職種を積極採用中!

急成長スタートアップで、最高のものづくりをしよう。

募集の詳細をみる