Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
AmebaアプリでのCI改善
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Kouta Imanaka
October 02, 2017
Technology
930
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
AmebaアプリでのCI改善
CA.apk #4
https://cyberagent.connpass.com/event/65347/
Kouta Imanaka
October 02, 2017
More Decks by Kouta Imanaka
See All by Kouta Imanaka
FlutterKaigi 2022: ホテルのルームキーをデジタルキー化して得られた気づき
keima
1
1k
Native Modulesで実現する パスワード入力支援 (技術少なめLT版)
keima
0
2.2k
CI/CD と DX (Developer Experience)
keima
3
1.6k
Other Decks in Technology
See All in Technology
Agent Skills設計で柔軟性と硬さのバランスが難しい話
nassy20
0
130
小さくはじめるSLI/SLO ~育てながら組織に定着させる実践知~ / Starting Small with SLI/SLOs: Building Adoption Through Continuous Growth
nari_ex
7
1.9k
入門!AWS Blocks
ysuzuki
1
120
Claude Code の Sandbox 機能を Anthropic Sandbox Runtime(srt) で試そう!/lets-play-anthropic-sandbox-runtime
tomoki10
1
600
AIネイティブな開発のサプライチェーンリスク対策 〜激動の開発現場でリスクに立ち向かう〜【ZennFes】
cscengineer
PRO
2
130
200個のGitHubリポジトリを横断調査したかった
icck
0
130
AIの性能が向上しても未解決な組織の重大問題は何か?/An Unsolved Organizational Problem in the Age of AI
moriyuya
4
680
現地で盛り上がった WWDC26 Keynote
zozotech
PRO
1
250
Oracle AI Database@AWS:サービス概要のご紹介
oracle4engineer
PRO
4
2.9k
やさしいA2A入門
minorun365
PRO
12
1.9k
AAIFに入ってみた ~内から見えるコミュニティ動向~
sato4
0
230
Kubernetesにおける学習基盤とLLMOpsの概要
ry
1
310
Featured
See All Featured
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
380
YesSQL, Process and Tooling at Scale
rocio
174
15k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
[SF Ruby Conf 2025] Rails X
palkan
2
1.1k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
220
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
Believing is Seeing
oripsolob
1
140
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
300
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
730
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
330
Heart Work Chapter 1 - Part 1
lfama
PRO
7
36k
Transcript
AmebaアプリでのCI改善 IMANAKA, Kouta 2017/10/02 CA.apk #4
俺氏、所属プロジェクトのCIの 「地位」が低いことに気がつく • 結果が尊重されていない ◦ しばしばタイムアウトする、謎の CI Error • 結果を無視しがちである
◦ 「ステータス帰ってきてないけど実は通ってます」がかなり多い CIが何かしらの手間であると捉えられているなら、 そのプロジェクトにおけるCIの「地位」は低いと考えられる → 「CI改善」をテーマに設定し、改善することにした。
README.mdをいじってCIがコケる図
今日お話しすること • 分析(なぜCIの地位が低いのか) • どのような問題を抱えているか • どのように解決したか • 更なるCI改善へ ※
本発表では「Android版AmebaアプリにおけるCI環境改善」を説明します。 CircleCI Enterpriseを採用しているため、通常と異なることがあるかも知れません。 また、プロジェクト毎にシステムの採用基準が違うので、他部署では Bitrise使ってます、とい う話も聞いています。
改善、まずは分析から
(1)android update sdk --no-ui --all --filter tools (5:48) (2)sdkmanager “platform-tools”
“extras;android;m2repository” “extras;google;m2repository” (4:24) (3)./gradlew dependencies (1.59) (4)./gradlew testProductReleaseUnitTest (3:52) (5)./gradlew testStagingDebugUnitTest (2:25) 1 2 3 4 5
(1)android update sdk --no-ui --all --filter tools (5:48) (2)sdkmanager “platform-tools”
“extras;android;m2repository” “extras;google;m2repository” (4:24) (3)./gradlew dependencies (1.59) (4)./gradlew testProductReleaseUnitTest (3:52) (5)./gradlew testStagingDebugUnitTest (2:25) 1 2 3 4 5
テストより準備のほうに 時間かかっとるやないか
CI改善点 • 全体的に時間かけすぎ、特に準備に時間がかかりすぎている ◦ それゆえにCIが完遂しないことも ◦ → SDKを別ディレクトリに構築してキャッシュに入れる • 並列数1で効率が悪い
◦ → 並列数++ • 古いテストケース(InstrumentTest)があるのに エミュレータ環境でのテストが無効化されている ◦ → UnitTest化, Firebase Test Labの導入
1. なぜ準備に時間がかかりすぎるのか? • CircleCI標準のSDKは古すぎるのでアップデートが必要 ◦ SDKのアップデートをする ◦ Platform Toolsのアップデートもする ◦
Build Toolsも取得する • CIインスタンスでの作業が完遂したときに全てを破棄する ◦ CircleCIデフォルトのSDKのあるディレクトリは キャッシュ指定していない • 次のビルドでまたすべて取得。。。 SDKを別に用意した上でキャッシュ指定すれば速くなるのでは?
SDKディレクトリを別に用意する仕組み • zipファイルをダウンロードして展開する ◦ ANDROID_HOME = ~/android-sdk-linux ◦ ↑はキャッシュするように設定 •
キャッシュを効かせる為、毎回ダウンロードしてほしくない ◦ ただの存在チェックだと SDK更新されたときに上書きされない ◦ zipファイルのURLを保持したファイルを書き出し、 URLに変化があれば再取得する そういう処理をするシェルスクリプトを書きました。
2. 並列数を増やすには • CircleCIのProject SettingsからAdjust Parallelismを設定 • なんでも並列に出来るわけじゃない ◦ testセクションのみ
◦ deploymentセクションで出来たらアツかったんですがね。。。 ◦ 実行順に依存しないコマンドだけを並列にできる (とはいえテスト系はだいたいそんなもんだという認識) • 一部テストは自動で並列処理をしてくれることもあるが Androidのテストは手動で割り当てをする必要がある
circle.yml (抜粋) test: override: - ./scripts/run-test.sh: timeout: 3600 parallel: true
run-test.sh (抜粋) #!/usr/bin/env bash # テスト結果をストアして最終的に返す(テスト終了後もいろいろ作業するため) RESULT=0 case $CIRCLE_NODE_INDEX in
0) mkdir -p $CIRCLE_TEST_REPORTS /junit/productDebug/ ./gradlew clean testProductDebugUnitTest RESULT= $? find . -type f -regex ".*/build/test-results/.*xml" -exec \ cp {} $CIRCLE_TEST_REPORTS /junit/productDebug/ \; ;; 1) mkdir -p $CIRCLE_TEST_REPORTS /junit/stagingDebug/ ./gradlew clean testStagingDebugUnitTest RESULT= $? find . -type f -regex ".*/build/test-results/.*xml" -exec \ cp {} $CIRCLE_TEST_REPORTS /junit/stagingDebug/ \; ;; esac exit ${RESULT}
• 弊社CiecleCI Enterprise環境のemulatorは残念ながら壊れている ◦ 我々のプロジェクトだけが壊れているということも考えられる • 極力UnitTest(with Robolectric)を使うように書き直し ◦ (ついでにテストのKotlin化もしてKotlin力を身につけた)
◦ とはいえ何が何でも UnitTestはしんどいのでそこまで執着しない (もともとコメントアウトされていたのだから) InstrumentTest -> UnitTestにしたことで テストケースが増えたのだとポジティブに考える 3. UnitTest化で爆速テスト回し
Firebase Test LabにEmulatorの代わりをさせる [検証中] • どうしてもInstrumentTestを使う必要が出てくる • Firebase Test Labを使うことでネットワーク越しに実機テストが出来
る ◦ 無料枠だとEmulator10台 (or 回) / 日, 実機 5台 (or 回) / 日 • テスト実行中の画面をキャプチャしてくれたりと便利 ※検証中の為、まだ本流にマージしていないがよく機能している
circle.yml (抜粋) dependencies: post: - sudo /opt/google-cloud-sdk/bin/gcloud config set project
${GCLOUD_PROJECT_ID} - sudo /opt/google-cloud-sdk/bin/gcloud --quiet components update - sudo /opt/google-cloud-sdk/bin/gcloud auth activate-service-account \ --key-file ./scripts/gcloud_credentials.json
run-test.sh (抜粋) 1) mkdir -p $CIRCLE_TEST_REPORTS /junit/connected/ ./gradlew clean assembleProductDebug
assembleProductDebugAndroidTest -PdisablePreDex echo "y" | sudo /opt/google-cloud-sdk/bin/gcloud \ firebase test android run ./scripts/commands.yaml:instrumentation RESULT= $? sudo /opt/google-cloud-sdk/bin/gsutil -m cp -r -U \ `sudo /opt/google-cloud-sdk/bin/gsutil ls gs:// ${GCLOUD_STORAGE_BUCKET_NAME} | tail -1`\ $CIRCLE_TEST_REPORTS /junit/connected/ ;;
commands.yml (see also: link) instrumentation: app: ./ameba-app/build/outputs/apk/ameba-app-product-debug.apk test: ./ameba-app/build/outputs/apk/ameba-app-product-debug-androidTest.apk device:
# Pixel; O Preview; Japanese - { model: sailfish, version: 26, locale: ja }
結果
Before: 21:56 → After: 12:12
まとめ • 全体的に時間かけすぎ、特に準備に時間がかかりすぎている ◦ Before: 20分付近 → After 10-15分台 ◦
CIの本質に時間をかけられるようになった • 並列数1で効率が悪い ◦ 並列実行できるようにして効率よくなった • 古いテストケース(InstrumentTest)があるのに エミュレータ環境でのテストが無効化されている ◦ UnitTestへの移行 ◦ InstrumentTestはFirebase Test Labを導入 もうちょっとだけ続きます
更なるCI改善へ • [done] Lintチェック ◦ 新しすぎるAPIの使用を指摘 ◦ errorの時にCI Errorにする ◦
warningは多すぎて今は無視 • danger/danger を用いた レビュー前のチェック • 夢の自動リリースも • CircleCI 2.0で10分切りを 狙いたい 引き続き改善を進めていきたい
CIをよりよくする案を募るIssue
最後に雑感 • 個人的にこれまでCIに関心が無かった ◦ Android開発者俺だけ、とか普通だった ◦ CI環境構築のメリットが、構築コストを上回る環境でなかった • 今のチームは大所帯。開発基盤の整備で得られるものが多い ◦
ひとつ日常業務を削減できればチームメンバー全員が効率よくなる ◦ 若干開発現場に活気が出てきた気が(※個人の感想によるものです) ◦ → 道半ばだがCI環境の地位はよくなっている • 置かれる環境によって人のロールは変わるのだなと感じた
ここまでのお相手は... 今中 幸太 Android Application Engineer at CyberAgent, Inc. DroidKaigi
Staff (アツいプロポーザルお待ちしております ) • GitHub: keima