2015-04-22 19:25:11
Cocos2d-x + Travis CI + DeployGate

前回の記事にて、cocos2d-xでのアプリ作成とTravis CIを連携させるとこまでいった。
今回は成果物であるAPKをDeployGateにアップロードするところについて書き留めておく。

だいたいのやり方

  • ビルドが成功したらcurlコマンドにてDeployGateにAPKをアップロードする。
  • アップロードにあたってDeployGateのAPI Keyが必要になる。DeployGateにログインして個人設定的なところを見れば載っている。
  • API Keyは.travis.ymlに書くことになるが、そのまま載せちゃうとセキュリティ的に問題なので暗号化する。
    • 暗号化にはtravisコマンドを用いる。

ちょっと細かいやり方

まずはAPKアップロード成功後の.travis.ymlを載せておく。

language: android

# Handle git submodules yourself
git:
  submodules: false

env:
  global:
    secure: 'TeSR8JLJd2Z0erCxcgLinC+me5SfwpgcCNwiTsqXn09erOgos2+mUbVQaSyo7Bw4OF4TmNpejX+jETd/lL4fTiWRDw6NW/cqEelk57fXJ5mmf5ey+tB1EkMFwd8x7Fw2vBe4xtO8KeohI6D1Gtu1qTYU9t9x4bhAd4qL15Y5osE='

install:
  # NDK configuration
  - printenv
  - echo `pwd`
  - wget http://dl.google.com/android/ndk/android-ndk-r10d-linux-x86_64.bin
  - chmod a+x android-ndk-r10d-linux-x86_64.bin
  - ./android-ndk-r10d-linux-x86_64.bin -y | grep -v Extracting # because log will be too long!
  - export NDK_ROOT=`pwd`/android-ndk-r10d
  - echo $NDK_ROOT
  - export PATH=$PATH:$NDK_ROOT
  - echo $PATH

  # Android SDK configuration
  - export ANDROID_SDK_ROOT=/usr/local/android-sdk
  - export PATH=$PATH:$ANDROID_SDK_ROOT/tools:$ANDROID_SDK_ROOT/platform-tools

  # git submodule
  # Use sed to replace the SSH URL with the public URL, then initialize submodules
  - sed -i 's/git@github.com:/https:\/\/github.com\//' .gitmodules
  - git submodule update --init --recursive

  # cocos setup
  - cd ./cocos2d
  - python download-deps.py --remove-download=yes
  - python ./setup.py
  - export COCOS_CONSOLE_ROOT=`pwd`/tools/cocos2d-console/bin
  - export PATH=$PATH:$COCOS_CONSOLE_ROOT
  - export COCOS_TEMPLATES_ROOT=`pwd`/templates
  - export PATH=$PATH:$COCOS_TEMPLATES_ROOT
  - export ANT_ROOT=/usr/share/ant/bin
  - export PATH=$PATH:$ANT_ROOT
  - printenv
  - cd ..

script:
  - cocos compile -p android -j 8

after_success:
  - echo $TRAVIS_BRANCH
  - echo $TRAVIS_PULL_REQUEST
  - '[ "$TRAVIS_BRANCH" == "master" -a "$TRAVIS_PULL_REQUEST" == "false" ] && curl -F "file=@./bin/debug/android/KonaReflection-debug.apk" -F "token=${DEPLOYGATE_TOKEN}" -F "message=Deploy from Travis CI" https://deploygate.com/api/users/pankona/apps'

前回からの変更点(APKアップロードのために追加した部分)

前回から増えたり変更したりしたのは以下。

env:
  global:
    secure: 'TeSR8JLJd2Z0erCxcgLinC+me5SfwpgcCNwiTsqXn09erOgos2+mUbVQaSyo7Bw4OF4TmNpejX+jETd/lL4fTiWRDw6NW/cqEelk57fXJ5mmf5ey+tB1EkMFwd8x7Fw2vBe4xtO8KeohI6D1Gtu1qTYU9t9x4bhAd4qL15Y5osE='
- '[ "$TRAVIS_BRANCH" == "master" -a "$TRAVIS_PULL_REQUEST" == "false" ] && curl -F "file=@./bin/debug/android/KonaReflection-debug.apk" -F "token=${DEPLOYGATE_TOKEN}" -F "message=Deploy from Travis CI" https://deploygate.com/api/users/pankona/apps'

後者の部分で、${DEPLOYGATE_TOKEN}という環境変数を参照しているが、これを設定しているのが前者の部分。

DEPLOYGATE_TOKENの暗号化

以下のコマンドでDeployGateのAPI Keyを暗号化する。

$ gem install travis # travisコマンドを使えるようにする。
$ travis encrypt DEPLOYGATE_TOKEN={My DeployGate API Key} # DeployGateで確認したAPI Keyを暗号化するコマンド(中括弧はいらない)。

このコマンドで得られた文字列をそのまま.travis.ymlに貼っつければOKである。

いつアップロードするか

以下の条件を満たした場合のみ、APKのアップロードを行うようにした。
これは、Pull Requestがmasterにマージされたとき、を意味している(つもり)。
"$TRAVIS_BRANCH" == "master" -a "$TRAVIS_PULL_REQUEST" == "false" ]

これをやっとかないと、ブランチにコミットをPUSHしたタイミングだったりPull Requestを作ったタイミングだったり、でアップロードが走る。
個人的にはやり過ぎ感があったので、APKはmasterからだけ作ればいいやという制限を施した。

これがそこそこ楽だと思います

AndroidアプリにAPKをいちいち頑張って転送しなくても、開発中アプリをインストールすることができるようになった。
ちなみに、アップロードされたAPKはDeployGateアプリ経由で取得することになる。

今回はここまで。

2015-04-19 11:26:14
cocos2d-x + Travis CI

引き続きcocos2d-xを使ってブロック崩しを作っている。
かれこれ2ヶ月あまりが経過した。ほぼ通勤時間でのみ作っている。

いまのところの作業の流れとしては、

  • まずLinux向けにビルドして動作確認
  • 問題なさそうであれば、Android向けのビルドを実施
  • なんとかして実機にAPKを移し、インストールする

という手順なのであるが、実機へのデプロイがなかなか面倒である。
基本的に電車内なので、ケーブルをスマホとPCに繋いで〜、というひと手間がなかなか面倒である。
すると端末間のファイル共有だったり、原始的にメール越しにAPK共有、等があるが、、、やはり面倒である。

デプロイもっと楽にする手段としてDeployGateさんを使わせてもらうという手がある。
これを用いると、変更をコミットするとそれだけで最新版APKがメールで送られてくるっていうようになるようである。

なので今回はこれを導入してみることにした。流れは以下のような感じになる予定である。

  • PC上にてcocos2d-xでアプリ作成。ソースをGithubにPush。
  • Travis CIでビルド。
  • ビルド成果物をTravis CIがDeployGateに送信。
  • DeployGateがわしのスマホにメールを送信(APK添付)。

以下、長文。

cocos2d-x + Travis CI

CI環境としてTravis CIをチョイスした。無料で使えるからである(Publicなリポジトリ限定かな)。
初のTravis CI利用ということもあり、なかなかに躓いたというか知らんことが多かったので、備忘録を残す。

そもそもTravis CIに何をしてもらえるか

ちょいちょい試してみたところ、以下のような感じである。

  • GithubへのPushをトリガーにして自動的にビルド実施。
    • ビルドに限らず、任意のScriptを実行可能。自動テストなんかも行うようにするとなお吉。
    • ビルド前処理、後処理、など、割と細かくステージ分けがされている。
  • ビルド失敗、成功の旨をメールにて通知。
  • masterだけでなく、他のブランチへのPushに対しても同様の処理をしてくれる。

ざっくりだがこんな感じだろうと。無料で使えるにしては十分かな。

さっそく設定する

設定手順はこんな感じ。

  1. Travis CIのWebサイトにて、監視してほしいリポジトリの設定をする。
  2. リポジトリのトップに .travis.yml を置く。
  3. あとはソースをプッシュするだけ。

(1)と(3)は別に問題ないと思われる。問題は(2)である。
以下、.travis.ymlの内容について書く。

ビルドパスした .travis.yml はこれ

いかにもやっつけ感満載でありつつ、とりあえずビルドパスするところまでいけた。
記念に貼り付けておく。もしかして誰かの役に立つことも願いつつ。

language: android

# Handle git submodules yourself
git:
  submodules: false

install:
  # NDK configuration
  - printenv
  - echo `pwd`
  - wget http://dl.google.com/android/ndk/android-ndk-r10d-linux-x86_64.bin
  - chmod a+x android-ndk-r10d-linux-x86_64.bin
  - ./android-ndk-r10d-linux-x86_64.bin -y | grep -v Extracting # because log will be too long!
  - export NDK_ROOT=`pwd`/android-ndk-r10d
  - echo $NDK_ROOT
  - export PATH=$PATH:$NDK_ROOT
  - echo $PATH

  # Android SDK configuration
  - export ANDROID_SDK_ROOT=/usr/local/android-sdk
  - export PATH=$PATH:$ANDROID_SDK_ROOT/tools:$ANDROID_SDK_ROOT/platform-tools

  # git submodule
  # Use sed to replace the SSH URL with the public URL, then initialize submodules
  - sed -i 's/git@github.com:/https:\/\/github.com\//' .gitmodules
  - git submodule update --init --recursive

  # cocos setup
  - cd ./cocos2d
  - python download-deps.py --remove-download=yes
  - python ./setup.py
  - export COCOS_CONSOLE_ROOT=`pwd`/tools/cocos2d-console/bin
  - export PATH=$PATH:$COCOS_CONSOLE_ROOT
  - export COCOS_TEMPLATES_ROOT=`pwd`/templates
  - export PATH=$PATH:$COCOS_TEMPLATES_ROOT
  - export ANT_ROOT=/usr/share/ant/bin
  - export PATH=$PATH:$ANT_ROOT
  - printenv

script:
  - cd ..
  - cocos compile -p android -j 8

躓き備忘録を以下に記しておく。

Travis CIは何で動いてるんだろ

Ubuntu 14.04(64bit)らしい。
なので各種Linuxのコマンドは使える。

cocosコマンド使えるようにする?

cocos2d-xの開発では、cocosコマンドによるビルドを使うのが便利である。
ただし、ちょっと環境構築が面倒な一面もある。

上記のymlでは、結果的にcocosコマンドを使える状態にしている。
「Travis CIはAndroidのビルドをサポートしている」ようなのだが、なのでもしかしたら、
cocosコマンドを使えるようにしなくても、Ant、ndk-buildあたりでなんとかできるのかもしれない。

と思ったのだが、どうやらNativeビルドには対応していないようである(あらかじめ用意されてはいない)。
なので、おとなしくcocosコマンドを使う方針で設定してみた。

NDKを解凍するときにTravis CIがerror 137で終わる

上記ymlでいうところの、以下の箇所を実行するとerror 137を報告してビルドが失敗に終わることがあった。

- wget http://dl.google.com/android/ndk/android-ndk-r10d-linux-x86_64.bin
- chmod a+x android-ndk-r10d-linux-x86_64.bin
- ./android-ndk-r10d-linux-x86_64.bin -y | grep -v Extracting # because log will be too long!

解凍時にログをリダイレクトしているが、これをしないとログが大量に出過ぎることが原因でTravis CIに怒られ、ビルドが失敗に終わる。
それとは別に、解凍にメモリをくいすぎて、いわゆるメモリショートでプロセスが殺されるのがerror 137の原因らしい。。。

sudo: required をファイルの冒頭に書いていたのであるが、それを消したらerror 137は解消した。
意味不明だが、回避策もよくわからないのでもう追っかけるのはやめた。。。

Android SDKはあえて用意しなくていい

NDKは自前で用意する必要があるが、Android SDKはTravis CI側で用意してくれているので、あえて自前で用意しなくてもいい。

というか、Android SDKをダウンロード → Update SDK の流れを実施すると、今度はストレージ容量を圧迫してしまうため、
後続の処理(git submodule)実行時にストレージ容量不足でビルドが失敗に終わる。
有料にすれば解決するのかな?とりあえずわしの環境ではAndroid SDKを自前で準備することは出来なかった。。

gitスキームを用いているsubmodule取得に失敗する

SSH鍵の関係で、gitスキームを用いているsubmoduleの取得に失敗する。
なのでgitを用いてる部分はhttpsに無理やり書き換えている。以下の部分である。
涙ぐましい。

# Use sed to replace the SSH URL with the public URL, then initialize submodules
- sed -i 's/git@github.com:/https:\/\/github.com\//' .gitmodules

環境変数設定を頑張る

cocos2d設定の過程でsetup.pyを実行するところがあるが、こいつは.bashrcを書き換える。
.bashrc内にexport文がいくつか追加される。本来、source ~/.bashrc等とやれば環境変数が有効になるのであるが、、、
Travis CIのScript上では効かないので、しかたなく.bashrcに追記されるものと同等の設定を.travis.ymlにて実施した。
以下の部分である。

- export COCOS_CONSOLE_ROOT=`pwd`/tools/cocos2d-console/bin
- export PATH=$PATH:$COCOS_CONSOLE_ROOT
- export COCOS_TEMPLATES_ROOT=`pwd`/templates
- export PATH=$PATH:$COCOS_TEMPLATES_ROOT
- export ANT_ROOT=/usr/share/ant/bin
- export PATH=$PATH:$ANT_ROOT

ここまでいくと、Travis CI上でcocosコマンドが使えるようになる。
cocos compile -p android -j 8でビルド実行。APKが生成される(デバッグ版)はずである。

成果物がでてくるところまできたので、Travis CIの設定はひとまず以上とした。
おかげさまで、リポジトリにTravis CIバッヂを貼ることができた。

https://github.com/pankona/KonaReflection

DeployGateさんへのデプロイは

ビルド成功の後、curlコマンドでAPKをDeployGateさんへ送信すればいい模様。
できたらまた躓きポイントを載せていこうと思う。
追記:DeployGateさんへのアップロードについては次回記事も見てね。

今回はここまで。

2015-03-11 20:29:27
cocos2d-xをやってみている

2015.03.07に娘が生まれました。
これからも頑張ります。近況を記す。

cocos2d-xを始めてみたのである

昨年末からあまりRaspberry Piを触れない環境におかれていたもので、
何か手軽にプログラミングをエンジョイできないかと思って、探して見た結果がcocos2d-x。
Unityじゃなくてcocos2d-xにしたのは、Linux向けの開発環境があるからである。
Unityやってみたかったけど、LinuxでやりたかったらWineを使え、みたいな感じになっているようで、
そんなことこっちから願い下げだ、ということで、cocos2d-x。
C++で書けて、これから触ってみようと思っているLuaとも相性がいい様子で、願ったり叶ったりである。

いま作っているもの

なかなか始めてみると面白い。
とりあえずわかりやすいところから馴染んでいこうということで、
ブロック崩しを題材にして制作に励んでいるところ。リポジトリはこちら。
KonaReflection
プロジェクト名は3日程真剣に考えた挙句これである。

開発環境は、愛機のVaio Pro 13(Arch Linux)と職場Mac Book Proの両刀で実践中。
デプロイターゲットはLinux、Mac(いずれもデバッグ目的)、そしてAndroid。
※ 職場MBPを使っているが、ちゃんと仕事はしている。暇なときにやっている。

どこまで作るかという話もあるが、とりあえず誰かを楽しませることが出来るレベルまで作ろうかと思う。
せっかく作るなら、一応、体としてはやりきりたいではないか。

Longest Streakを13に伸ばす

なんやかやあって途絶えてしまったが、Longest Streakは13まで更新した。
そんなもん伸ばして何になるの、というのもわかるが、ちょっとでも、毎日ソース更新しなきゃ、という気持ちになるのであれば、
意味がなくもないんじゃないかと思いつつ。また仕切りなおして伸ばしていこう。

cocos2d-xを使ったアプリをEclipseで開発できるようにした

Android向け、という話ではそこそこ記事があるが、ことLinux向けで開発環境構築というと記事がなかなかない。
しかし出来るようになった。Eclipse+CDT+諸々設定(←ここがめんどい)。
設定方法は別の記事としてまとめようと思う。cocos2d-x+Eclipse+Linux向けビルド、の体。

vimでも開発できるように調整した

いっときEclipseを用いてcocos2d-xの開発環境を作ることを諦めかけた(めんどすぎた)のだが、
そのとき、Vimだけでやれるように開発環境構築を頑張ってみたのである。
割といい具合になったのでこっちもそのうち記事にしてみようと思う。
Vim+Syntastic+NeoComplete+Clang_Complete、といった組み合わせである。
だけどまあ結局はEclipseを使いそうである。事足りてしまうし、むしろvrapperがあればそこそこ快適である。