GitHub+Code Pipeline+Code Buildで
つらくないリリースサイクルを回す
dely株式会社 梅森 翔
軽く自己紹介
delyのAndroidエンジニアです
今は一人でやってます
(来年入社予定が一人)
(絶賛Androidエンジニア募集中です)
来年のDroidKaigiで登壇します
『Dagger2を活用してAndroid SDKの依存関係をク
リーンにする』
今日の話
kurashiru android版の話です
androidのコードの話はないです
5月からのリリース回数: およそ60回
おおよそ3~4日に1回の頻度
若干リリースしすぎ(たまにレビューで怒られる)
リリース頻度が高いことによるつらさ
単純に面倒でつらい
どのAPKがリリースされてるか分からなくなって
つらい
キーストアの管理問題でつらい
いちいちタグを切るのもつらい
つらい
=> 自動化しましょう
構成図
AWS CodePipeline
Amazon S3
AWS CodeCommit
GitHub
への変更(Push)を検知したら
AWS CodeBuild
Jenkinsプラグイン
Solano CI(詳しくないです)
をキック(deploy周りは使ってないです)
AWS CodePipeline
シンプル
現在はブランチ単位での指定だけ
その他CIサービス程充実していない(フィーチャ
ーブランチのテストとかはCodePipelineだと現状
無理)
ちょっと機能不足感
AWS CodeBuild
任意のDockerイメージを使ってビルドできる
任意のバージョンのAndroid SDKを予めインス
トールしたイメージでビルドできる
アプリの依存ライブラリ(jar, war)が既に含ま
れたイメージでビルドできる
現在はECRでイメージ管理してます
Dockerイメージ自体のビルドもできる(プリセッ
トのビルド環境を選択する)
AWS CodeBuild
結構ハイスペック
build.general1.small 2vCPU, 3GB mem
build.general1.medium 4vCPU, 7GB mem
build.general1.large 8vCPU, 15GB mem
Androidのビルドに向いてる(使えるメモリが多い
のがうれしい)
AWS CodeBuild
使った分だけ課金
build.general1.small 0.005 USD/min
build.general1.medium 0.010 USD/min
build.general1.large 0.020 USD/min
現在はbuild.general1.largeで1回のビルドが大体10
分くらいなので1回0.2ドル、結構お手軽
buildspec.yml
phases:
install:
commands:
- echo do nothing.
pre_build:
commands:
- echo do nothing.
build:
commands:
- aws s3 cp XXX app/${ANDROID_KEYSTORE_NAME}
- |
if [ $CODEBUILD_INITIATOR != "codepipeline/android
chmod +x ./gradlew && 
./gradlew assembleCheck 
-Pdebug.server_url=XXX 
-Pdebug.web_content_url=XXX
bulidspec.yml
リポジトリ直下に入れておく(他CIサービスと同
じ)
設定は環境変数で渡す(CodeBuildのプロジェクト
に設定する)
CodePipelineを使った場合はどのCodePipelineの
プロジェクトからキックされたかの情報が環境変
数経由で渡ってくるのでそれを使う
CodeBuildでやっていること
APKのビルド
キーストアでの署名(s3に置いておいたのをダウ
ンロードしてます)
Slackへの通知(+APKアップロード)
GitHubのReleaseページ生成
ユニットテストは現状はWerckerで回してます
Releaseページの生成
Releaseページの生成
{version_name}-{version_code} でページ生成
前バージョンとのdiffへのリンク
https://{repo}/compare/vX.X.X-XXX...
{commithash}
GitHub APIとかでコミットメッセージとかを抽
出してみたりしたが結局これが確実&一番見や
すかった
署名済みAPK
Proguardのmapping.txt
Releaseページの生成
Releaseページの生成手順(概要)
https://api.github.com/repos/{repo}/git/refs
を叩いてコミットhashにタグを追加
https://api.github.com/repos/{repo}/releases
を叩いてリリースページを作成(タグ、名前、diff
へのリンク)
https://api.github.com/repos/{repo}/releases/tags/
からアップロード用URLを取得
APK, mapping.txtをアップロード
今はシェルスクリプトでやってます
(buildspec.yml直書き)
Releaseページの生成
待ってればAPK上がってくるのはやっぱり便利
(特にSplit APKを使っている場合は)
APKが確実に同じやり方で生成されていることが
確信出来てGood
任意のバージョン間のdiffが1クリックで見られる
のはやっぱり便利(不具合調査とか)
過去バージョンからのマイグレーションのテスト
とか楽(Google Playのアーティファクトライブラ
リから取ってくれば出来るけど)
現在の課題
テストは今のところはWercker任せなのでそのう
ちCodeBuildに移行したい
CodeBuildのキックはお手軽なのでCodePipelineで
やっているだけなのでいずれはもっと高機能なも
のに移行したい
前バージョンのdiffは現在の形が楽だけどちゃんと
文章も作った方がいいかも(でもやるなら楽にや
りたい)
リリース作業自体は手動(APKアップロードまで
はそこまで面倒じゃないのとやり直すこともある
ので自動化する必要が無いかも)

【ヒカ☆ラボ】 dely株式会社 梅森 翔氏 登壇資料 20171121