TestFlightからCrashlyticsへのお引っ越し(Jenkins編)

前回の記事では、TestFlightからCrashlyticsに乗り換えてアプリを配布する場合、どのような設定が必要で、どのような手順でアプリを配布すれば良いのか、ということを主に説明しました。
でも、僕ら、エンジニアですよね?
楽したいですよね?

では、移行するためにはどのようにshell scriptを書けばいいのか見てみましょう!
私が現在、使用しているのは以下のshell scriptです。


# Description:
#   build ipa file and distribute it via crashlytics. Processing Details are as below. 
#
#     1. create Archive directory if it doesn't exist.
#     2. remove Pods directory
#     3. update cocoapods local repos and install pods for current directory
#     4. build ipa file
#     5. distribute ipa file via crashlytics
#     6. copy ipa file, Podfile.lock, and content of release notes  
#
#

export LC_ALL="en_US.UTF-8";


send_success_message_to_slack ()
{
  send_message_to_slack "Jenkins" "$1" ":jenkins:"
}

send_failure_message_to_slack ()
{
  send_message_to_slack "Jenkins Oops" "$1" ":jenkins_oops:"
}

send_message_to_slack ()
{
  local payload={\"channel\”:\”#<CHANNEL_NAME>\”\,\”username\":\"$1\"\,\"text\":\"$2\"\,\"icon_emoji\":\"$3\"}
  curl -X POST --data-urlencode "payload=${payload}" <SLACK_INCOMING_WEBHOOKS_URL>
}

fail ()
{
  send_failure_message_to_slack "$1"
  exit 1
}

#variables which jenkins allow us to use
current_workspace=${WORKSPACE}
build_id=${BUILD_ID}
build_number=${BUILD_NUMBER}

#create Archive directory to Archive .ipa file, Podfile.lock, and so on
if [ ! -d "${current_workspace}/Archive" ] ; then
  mkdir "${current_workspace}/Archive"
fi


cd <PROJECT_NAME>


#remove Pods directory
rm -rf Pods

#update cocoapods local repos and install pods for current project.
pod repo update
pod install
pod update


#increase bundle version using plistBuddy
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion ${build_number}" “<PROJECT_NAME>/Info.plist"

#build .ipa file using ipa gem
ipa build -s <SCHEME_NAME> -c <CONFIGURATION_NAME>


#generate release not for Crashlytics from git commit log
github_pr_url="https://github.com/<TEAM_NAME>/<APP_NAME>/pull/"
pr_number=$(perl -e '`git log --format=%s -n 1`=~/(merge)( +)(pull)( +)(request)( +)(\#)([^ .*])/i; print $8')
commit_hash=$(git rev-parse HEAD)
release_note="pull-request:${github_pr_url}${pr_number}\nhash-value:${commit_hash}"
echo $release_note \> release_note.txt


#upload ipa binary to crashlytics
crashlytics_api_key=“<CRASHLYTICS_API_KEY>”
crashlytics_build_secret=“<CRASHLYTICS_BUILD_SECRET>”
crashlytics_group_alias=“<CRASHLYTICS_GROUP_ALIAS>”
if [ -e “<IPA_FILE_NAME>” ]; then
  "${current_workspace}/<PROJECT_NAME>/Pods/CrashlyticsFramework/Crashlytics.framework/submit" ${crashlytics_api_key} ${crashlytics_build_secret} -ipaPath "<IPA_FILE_NAME>" -notesPath release_note.txt -groupAliases ${crashlytics_group_alias}
  send_success_message_to_slack "I distributed ipa via crashlytics.”
else  
  fail "I could not distribute ipa file, because ipa file does not exist." 
fi


#copy current .ipa file, Podfile.lock and release_note.txt(it is backup of release note.)
mkdir "${current_workspace}/Archive/${build_id}"
if [ ! -d "${current_workspace}/Archive/${build_id}" ] ; then
  fail "I failed to create current build archive directory."
fi

mv <IPA_NAME> "${current_workspace}/Archive/${build_id}/<IPA_NAME>"
cp Podfile.lock "${current_workspace}/Archive/${build_id}/Podfile.lock"
mv release_note.txt "${current_workspace}/Archive/${build_id}/release_note.txt"

if [ ! -e "${current_workspace}/Archive/${build_id}/<IPA_NAME>" -o ! -e "${current_workspace}/Archive/${build_id}/Podfile.lock" -o ! -e "${current_workspace}/Archive/${build_id}/release_note.txt" ] ; then 
  fail "I failed to archive some of ipa file, Podfile.lock and release_note.txt"
fi

といっても、これはこちらの記事に記載したshell scriptをほんの一部変えただけです。 修正内容としても、以下の2点のみです。

  • testflight_note.txtといった、配布サービスに依存した名前になっていた変数やファイル名をrelease_note.txtという、一般的な名称に変更
  • shenzhen経由でtestflightのAPIを叩いていたものをCrashlyticsのAPIを叩くように修正(76行目~81行目)

これらの変更だけでTestFlightからCrashlyticsへの移行は終了です。

上記のようなshell scriptは一度作ってしまえば、配布サービスを移動しても以前と同じように配布の自動化を行うことができます。
また、Crashlyticsを使うとバグトラッキングを無料で行うこともできます。
これを機にCrashlyticsとShellScriptを利用したアプリ配布の自動化を始めてみてはいかがでしょうか?