0

AWS LambdaでCircleCIを毎日ビルドする

定期的にCircleCIでのテストを実行するAWS Lambda Functionを書いた。

shokai/circleci-daily-build: kick CircleCI rebuild everyday

とくにソースコードの変更が無くても定期的にCIを実行しておきたい場合がある。
依存ライブラリを毎日全て最新版にアップデートしてテストするとか、スクレイピング対象のHTMLが変更されていたらすぐに気づきたい場合とか。


天気予報をスクレイピングで取ってくるライブラリを定期的に実行している様子。毎朝テストされて結果がSlackに通知される。




CircleCIにビルドを頼む


CircleCIにはAPIがあるので外部からビルドを要請できる。
https://circleci.com/account/api でAPIキーを取得して使う。

curlとかでやってもいいんだけど、circleciというnpmを使うと2,3行書くだけで指定したプロジェクトのテストを実行できる。


AWS LambdaからCircleCIにビルドを頼む


新横浜Twitter botをAWS Lambdaとcoで作ったに書いたneoyokohama-botをテンプレとして使った。
我ながらわりとよく出来ていてsrc/以下だけ入れ替えたら完成した。


これをgit cloneして
https://github.com/shokai/circleci-daily-build

設定ファイルを作って中身を書く
% cp sample.env .env
% cp sample.project-list.json project-list.json


ビルドする
% npm install
% npm run build
% npm test # ログイン情報が正しいかとか
% npm start # ローカルで動かしてみる


zipを作って
% npm run zip

lambdaにアップロードして、イギリス時間で1時(日本で10時)にテスト実行するようにしておいた。

0

CircleCIでのAndroidビルドのメモリ使用量制限、SDKのアップデート

前:CircleCIでAndroidのプロジェクトをビルドする

色々やってプロジェクトが複雑化してきたら、2回ビルドできなくなった。けど解決した。

circle.ymlはこうなっている

machine:
java:
version: oraclejdk8
environment:
JAVA_OPTS: "-Xms518m -Xmx2048m"
dependencies:
pre:
- echo y | android update sdk --no-ui --all --filter "extra-android-m2repository,extra-android-support,extra-google-google_play_services,extra-google-m2repository"
test:
pre:
- cd mobile/src/main/java/org/shokai/voicetweet/ && cp TwitterConfig.java.sample TwitterConfig.java
override:
- ./gradlew assembleDebug

メモリが足りない


メモリを4GB以上使うとテストがこける。

Warning: You build has exceeded the memory limit of 4G on 1 container.


CircleCiでAndroid開発を爆速にする | Covelline Developer Blog
を参考に、machineのJAVA_OPTSでメモリ使用量を設定した。
AndroidのVMを起動してのテストせず、ビルドだけなので2GBに制限した。見ているとgradleからたまにjavaのプロセスがforkしているように見えたのでとりあえず4GBの半分使うようにしておいた。

CircleCIでの実行時は環境変数CIRCLECIが設定されるのでbuild.gradleも設定した。

android {
(略)
dexOptions {
if(System.getenv()["CIRCLECI"] as boolean) {
javaMaxHeapSize "2048M"
preDexLibraries false
}
}
}
あとCircleCIではdex(Dalvic VMの実行ファイルだが、次回コンパイルを高速にするらしい?)を生成しないようにした。


Android SDKのアップデート


play-service-wearableを6.5.87から8.3.0にアップデートしたら、CircleCIに8.3.0が無くてこういうエラーが出る

Could not find com.google.android.gms:play-services-wearable:8.3.0.
Searched in the following locations:
https://jcenter.bintray.com/com/google/android/gms/play-services-wearable/8.3.0/play-services-wearable-8.3.0.pom
https://jcenter.bintray.com/com/google/android/gms/play-services-wearable/8.3.0/play-services-wearable-8.3.0.jar
file:/usr/local/android-sdk-linux/extras/android/m2repository/com/google/android/gms/play-services-wearable/8.3.0/play-services-wearable-8.3.0.pom
file:/usr/local/android-sdk-linux/extras/android/m2repository/com/google/android/gms/play-services-wearable/8.3.0/play-services-wearable-8.3.0.jar
file:/usr/local/android-sdk-linux/extras/google/m2repository/com/google/android/gms/play-services-wearable/8.3.0/play-services-wearable-8.3.0.pom
file:/usr/local/android-sdk-linux/extras/google/m2repository/com/google/android/gms/play-services-wearable/8.3.0/play-services-wearable-8.3.0.jar


CircleCIのドキュメントによるとdependenciesのpreでandroidコマンドを実行してupdateできるとの事だったので、circle.ymlに設定した。

dependencies:
pre:
- echo y | android update sdk --no-ui --all --filter "extra-android-m2repository,extra-android-support,extra-google-google_play_services,extra-google-m2repository"
–filterオプションに渡せるパッケージ名は
% android list sdk --all --extended

で確認できる。

0

Circle CIのビルド結果をHubotで通知

久しぶりにCircle CIを試したら、起動が妙に速くなっていた(前からこんなに速かったっけ?)のでいくつかのプロジェクトで使ってみる事にした。

Slackのインテグレーションがlimitに達していたので、Hubotで通知させるのを書いた。

circleci-webhook.coffee


設定

こんな感じでwebhook設定するとJSONが来るので、HubotがSlackに通知してくれる。

circle.yml
machine:
node:
version: 0.12
deployment:
staging:
branch: master
heroku:
appname: (herokuのアプリ名)
notify:
webhooks:
- url: https://自分のhubot.com/circleci-webhook?room=(chat部屋名)

動作

Hubot自体のビルド通知も、自分自身にやらせてる。
CircleCIでテスト→Herokuにデプロイ→Hubot起動→CircleCIからビルド結果がWebhookで届く→HubotがSlackに通知 という順に動いている。

0

CircleCIでAndroidのプロジェクトをビルドする

Androidのtestまだよくわからないのでとりあえずビルドだけする。
Travis CIでは色々細かく設定しなければならないみたいなので、適当にSDKバージョンとか見つけてくれるCircle CIを使う事にした。

JavaとXMLの世界なので、コンパイルが通るかをプルリク・マージの時に自動的にCircleCIがやってくれて結果がGitHub表示されているだけでも安心感がある(という事をテストがあるとプルリクしやすいにも書いた)


手順


手元でビルド

自分のプロジェクトが手元で
./gradlew assembleDebug
でデバッグビルドできるのを確認しておく


Github → Circle CIの連携設定

GitHubの各リポジトリ内の設定から、Webhooks&ServicesでCircle CIを追加する。
githubにpushする毎に自動的にCircle CIにhookが飛ぶ。

Add projects – CircleCIでもプロジェクトを追加する。


circle.yml

リポジトリルートにcircle.ymlを置く。中身はこれだけでいい
test:
override:
- ./gradlew assembleDebug


テストする

githubにpushしたら https://circleci.com/gh/(ユーザ名)/(リポジトリ名) でテストが走ってるのが見える


Status Badge

https://circleci.com/gh/(ユーザ名)/(リポジトリ名).png に画像が生成されるので、README.mdに埋め込んでおく


circle.ymlの書き方

Configuring CircleCI – CircleCIに設定方法が書いてある

VoiceTweetではTwitterのconsumer keyをリポジトリにコミットしたくなかったので、testのpreでサンプルファイルから事前にコピーしてからコンパイルするようにした。
test:
pre:
- cd mobile/src/main/java/org/shokai/voicetweet/ && cp TwitterConfig.java.sample TwitterConfig.java
override:
- ./gradlew assembleDebug