Git+Jenkins+MonacaCLI+DeployGateを使ったテストアプリ自動ビルド、自動配布


概要

コミュニケーションのラグなどから膨れ上がる作業時間を改善したかったのと手動はなんかイケてなかったのでGitの更新をJenkinsで拾ってMonacaでビルドしてDeployGateへアップロードまでを自動化
あとWindows機でやってるとiTunesでipaファイル同期とかめんどくさかったしね

自動化したことによって、こんな感じに改善できたのでその構成をつらつらと。Cacoo便利!

インストールしたもの

  • MonacaCLI
  • DeployGateコマンドラインツール(以下、dgツール)
  • NVM(nodejs,npm)
    • MonacaCLIのインストールに必要
  • Ruby >= 2.0.0
    • DeployGateコマンドラインツールのインストールに必要
    • 公式には2.0.0と書いてあったけどdgツールのインストールがこけたので2.1.1入れました
  • Git,Jenkins
    • この2つはyumあたりで入れればいいだけなので詳細は割愛します

インストール作業

ここは最終的にjenkinsのジョブ上でmonaca叩ける環境になってればなんでもいいです

NVM(nodejs,npm).install
chsh jenkins          #/bin/false → /bin/bash
su - jenkins
git clone https://github.com/creationix/nvm.git ~/.nvm && cd ~/.nvm && git checkout `git describe --abbrev=0 --tags`
. ~/.nvm/nvm.sh
nvm install stable
nvm install 0.10      #npmを入れるためだけにインストール
nvm uninstall 0.10
nvm use default
MonacaCLI.install
npm install -g monaca

以下はAPI使うといらないやつ

ruby.install
yum -y install gcc zlib-devel openssl-devel sqlite sqlite-devel mysql-devel readline-devel libffi-devel
cd /usr/local/src
wget http://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.1.tar.gz
tar zxvf ruby-2.2.1.tar.gz
cd ruby-2.2.1
./configure
make
make install
ln -s /usr/local/bin/ruby /usr/bin/ruby
dgツール.install
curl -sSL https://deploygate.com/cli/install/08bf8613 | bash

Jenkinsのジョブ設定

buildジョブ
  • ビルドトリガ:SCMポーリング
  • ビルド:シェルの実行
  • ビルド後の処理:他のプロジェクトのビルド(deployジョブ)
シェル内容.jenkins
source ~/build.sh
build.sh
#!/bin/bash
source ~/.nvm/nvm.sh
cd $WORKSPACE
expect -c "
spawn monaca login
expect \"Email address:\"
send -- \"[email protected]\n\"
expect \"Password:\"
send -- \"pswd\n\"
expect eof
exit
"
monaca remote build --build-type=debug --platform=android|grep "\.apk$"|sed -e "s/.*stored at //g"|xargs -I{} mv {} ~/app_build/app.apk
monaca remote build --build-type=adhoc --platform=ios|grep "\.ipa$"|sed -e "s/.*stored at //g"|xargs -I{} mv {} ~/app_build/app.ipa
monaca logout

deployジョブ
  • ビルド:シェルの実行
シェル内容.jenkins
source ~/deploy.sh
deploy.sh(dgコマンドver)
#!/bin/bash
PATH=$PATH:/usr/local/bin
expect -c "
spawn dg login --terminal
expect \"Email:\"
send -- \"[email protected]\n\"
expect \"Password:\"
send -- \"pswd\n\"
expect eof
exit
"
[ -e ~/app_build/app.apk ] && dg deploy ~/app_build/app.apk --message='TestAppAutoDeploy' --distribution-key=[配布ページURL末尾のハッシュ]
[ -e ~/app_build/app.ipa ] && dg deploy ~/app_build/app.ipa --message='TestAppAutoDeploy' --distribution-key=[配布ページURL末尾のハッシュ]
dg logout
deploy.sh(APIver)
#!/bin/bash
cd ~
[ -e ~/app_build/app.apk ] && curl -F "file=@app_build/app.apk" -F "token=[token]" -F "message=AutoDeploy" -F "distribution_key=[配布ページURL末尾のハッシュ]" -F "release_note=AutoDeploy" https://deploygate.com/api/users/[ユーザID]/apps
[ -e ~/app_build/app.ipa ] && curl -F "file=@app_build/app.ipa" -F "token=[token]" -F "message=AutoDeploy" -F "distribution_key=[配布ページURL末尾のハッシュ]" -F "release_note=AutoDeploy" https://deploygate.com/api/users/[ユーザID]/apps

DeployGateのWeb画面から「開発ツール>DeployGate API」と遷移した先にtokenが入ったサンプルが置いてあったのでそこから拾ってくると楽です

当初はdgツールでやる予定だったけどアップロードまで出来たものの配布状態に出来ず…
なんかいい方法ないかなーってドキュメント見てたらAPIでアップロードと配布処理まで同時にできたので移行
rubyとdgツールをインストールする必要なかった…

2016/03/22 更新
ごめんなさい配布する方法有りました
@henteko さんありがとうございます!

2016/03/24 更新
deploy.sh(dgコマンドver)の内容をアップロードだけでなく配布まで行う記述に変えました

地味にハマったところ

MonacaCLI(1.2.10)で公式ドキュメントもコマンド内のヘルプでも現在使えないオプションがサンプルとして記載されていた

debugビルドとかは普通に通ってたのでtestが怪しいと思ってadhocに変えたらビルド通った!
MonacaWeb上でビルド結果一覧から確認してもInvalidって出てたしね…

monaca remote build --platform=ios --build-type=test 

↓正しくはこう

monaca remote build --platform=ios --build-type=adhoc 

MonacaCLIでのリモートビルド時に「undefined」

寸前までビルドできてたのにundefinedが出始めた
原因は一度ビルドした後にMonacaWeb上に出来上がったプロジェクトを削除したせい

仕組み的には、
初回ビルド時にプロジェクトをアップロードしMonacaWeb上に作成されたプロジェクトのIDをローカルに保存

以降のビルドでは保存されたIDを元にMonacaWeb上でプロジェクトを探す

該当のIDのプロジェクトが見つからないよ!ってだけだったっぽい


dgツールでログイン出来なかった

curlやwgetは通るのにdg login --terminalだけこける謎現象
原因はその時つかっていたネットワークが接続後に認証入るタイプだったせい?(wifiスポットとかのアレ)
特殊なネットワーク環境で試す時は注意が必要っぽい


dgツールのインストール失敗

sudoでgemのpathが通ってなかっただけなのでvisudoで書き換えて事なきを得た

まとめ

0スタートで始めたわりには3,4日で運用に載せられた上、かなりの改善が見えて大満足の結果でした
DeployGateコマンドラインツールはまだバージョン低いので今後のアプデに期待
配布処理含んだのはツールにはないって書いたけどあったらごめんね ありました。

あと今(2016/03/18時点)のMonacaCLIの公式ドキュメントは信じちゃだめだよ
自動化大好きおじさんとの約束だよ