Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
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
940
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
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
Sigmaユーザーのための有用リソース一挙公開 & Sigmaで使えるMCP #sigma_ucj /useful-resources-for-sigma-computing-users-and-mcps-with-sigma
shinyaa31
0
190
安心して変更できるWebフロントエンドの作り方
pirosikick
0
240
株式会社シーエーシー エンジニア向け会社紹介資料
cac
0
57k
20260912_スクラムにジェネラリストは必要か
ryugen04
0
350
Reactの設計論
uhyo
14
8.1k
全員がプロダクトへ向き合う組織を持続成長させるために——組織づくりのフライホイールと4象限 / The Flywheel Model and Four Quadrants for Organizational Design
hiro_torii
4
970
リージョンの壁を越える、 ちょっと変わったAWSサービスの話
falken
PRO
1
310
AIで実装は速くなった。なのにプロダクトは速くならない。職能の壁を越えて価値のフローを設計する
nwiizo
8
7.9k
こんなアーキテクチャ図は嫌だ BEYOND THE TIME: 半年後の自分へ贈る15のメッセージ / 15 of Anti-pattern in AWS Architecture Diagrams
naospon
3
310
なぜSRE・セキュリティは評価されないのか?守りの組織を事業成長エンジンに変えた実践
cscengineer
PRO
3
2.5k
2026-09-09 【sigma_ucj#1】Sigma を IaC 管理したい! / IaC for Sigma
civitaspo
0
120
クロスボーダーM&AのValue Upを支えるプロダクト開発。日米チームのハブになったプロダクトエンジニアの実践 / Product Engineering Conference 2026
genda
0
120
Featured
See All Featured
Making the Leap to Tech Lead
cromwellryan
135
10k
Information Architects: The Missing Link in Design Systems
soysaucechin
1
1.1k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.3k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
880
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
410
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
410
Design in an AI World
tapps
1
310
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
780
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.3k
Thoughts on Productivity
jonyablonski
76
5.4k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.9k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
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