Conversation
…bsolete CI scripts
Walkthrough朕は宣す:EASの並列Canaryビルドワークフローを追加し、アプリ版を10.0.0へ更新、Android/iOSのビルド設定・署名・リソース・Xcodeプロジェクトを大規模に再配線し、複数のiOS CI前処理スクリプトを削除した。 Changes
Sequence Diagram(s)sequenceDiagram
actor EAS as EAS CI
participant Repo as Repository
participant AndroidJob as Android Canary Job
participant iOSJob as iOS Canary Job
note right of EAS #DDEBF7: ワークフロー起動(並列)
EAS->>Repo: checkout + submodules
EAS->>AndroidJob: start Android canary (parallel)
EAS->>iOSJob: start iOS canary (parallel)
alt Android: 環境復元
AndroidJob->>AndroidJob: validate env vars\ndecode DOTENV_LOCAL_BASE64 -> .env.local
AndroidJob->>AndroidJob: decode SENTRY_PROPERTIES_BASE64 -> android/sentry.properties
AndroidJob->>AndroidJob: decode GOOGLE_SERVICES_JSON_BASE64, RELEASE_JKS, gradle.properties 等
end
AndroidJob->>AndroidJob: eas build (android)
AndroidJob->>AndroidJob: install artifacts & submit to Google Play
alt iOS: 環境復元
iOSJob->>iOSJob: validate env vars\ndecode DOTENV_LOCAL_BASE64 -> .env.local
iOSJob->>iOSJob: decode SENTRY_PROPERTIES_BASE64 -> ios/sentry.properties
iOSJob->>iOSJob: decode GOOGLE_SERVICE_INFO_PLIST_BASE64 -> ios/.../GoogleService-Info.plist
end
iOSJob->>iOSJob: eas build (ios)
iOSJob->>iOSJob: submit to TestFlight
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes 注意箇所:
Possibly related PRs
Suggested labels
Poem
Pre-merge checks and finishing touches❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✨ Finishing touches🧪 Generate unit tests (beta)
📜 Recent review detailsConfiguration used: CodeRabbit UI Review profile: CHILL Plan: Pro 📒 Files selected for processing (3)
🧰 Additional context used🧠 Learnings (8)📓 Common learnings📚 Learning: 2025-09-22T09:21:21.741ZApplied to files:
📚 Learning: 2025-08-04T12:17:03.430ZApplied to files:
📚 Learning: 2025-01-05T12:57:11.319ZApplied to files:
📚 Learning: 2025-02-19T11:37:54.286ZApplied to files:
📚 Learning: 2025-02-19T23:03:04.326ZApplied to files:
📚 Learning: 2024-12-15T00:35:52.018ZApplied to files:
📚 Learning: 2025-09-22T09:30:14.592ZApplied to files:
🔇 Additional comments (1)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
android/app/build.gradle (1)
1-4: 必須のGoogle Servicesプラグインが欠落
朕の勅旨:この差分でcom.google.gms.google-servicesを外したままでは、google-services.jsonが処理されず Firebase が初期化できぬ。Expo の Android プッシュ通知は FCM を介するゆえ、実機ではDefault FirebaseApp is not initializedなる例外が発生し PushToken を取得できなくなるぞ。速やかにプラグインを復帰せよ。(developers.google.com)apply plugin: "com.android.application" apply plugin: "org.jetbrains.kotlin.android" apply plugin: "com.facebook.react" +apply plugin: "com.google.gms.google-services"
🧹 Nitpick comments (1)
android/gradle.properties (1)
18-18: 朕が認めるところによれば、この Gradle 最適化は統治下の build 効率を高むるに有効なり。org.gradle.parallel=true により並列 build 加速。edgeToEdgeEnabled, android.enableMinify 等の有効化は、UI immersion 及び APK size 削減に寄与す。然るに、expo.edgeToEdgeEnabled は SDK 55 にて deprecated となる予定のため、将来の migration に備え、相応の mark を施されよ。
Expo SDK 55 migration に向けて、expo.edgeToEdgeEnabled より react.edgeToEdgeEnabled への先制的移行を検討されてはいかが。
Also applies to: 44-65
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (21)
android/app/src/prod/res/res/drawable-hdpi/splashscreen_image.pngis excluded by!**/*.pngandroid/app/src/prod/res/res/drawable-mdpi/splashscreen_image.pngis excluded by!**/*.pngandroid/app/src/prod/res/res/drawable-xhdpi/splashscreen_image.pngis excluded by!**/*.pngandroid/app/src/prod/res/res/drawable-xxhdpi/splashscreen_image.pngis excluded by!**/*.pngandroid/app/src/prod/res/res/drawable-xxxhdpi/splashscreen_image.pngis excluded by!**/*.pngandroid/app/src/prod/res/res/mipmap-hdpi/ic_launcher.pngis excluded by!**/*.pngandroid/app/src/prod/res/res/mipmap-hdpi/ic_launcher_foreground.pngis excluded by!**/*.pngandroid/app/src/prod/res/res/mipmap-hdpi/ic_launcher_round.pngis excluded by!**/*.pngandroid/app/src/prod/res/res/mipmap-mdpi/ic_launcher.pngis excluded by!**/*.pngandroid/app/src/prod/res/res/mipmap-mdpi/ic_launcher_foreground.pngis excluded by!**/*.pngandroid/app/src/prod/res/res/mipmap-mdpi/ic_launcher_round.pngis excluded by!**/*.pngandroid/app/src/prod/res/res/mipmap-xhdpi/ic_launcher.pngis excluded by!**/*.pngandroid/app/src/prod/res/res/mipmap-xhdpi/ic_launcher_foreground.pngis excluded by!**/*.pngandroid/app/src/prod/res/res/mipmap-xhdpi/ic_launcher_round.pngis excluded by!**/*.pngandroid/app/src/prod/res/res/mipmap-xxhdpi/ic_launcher.pngis excluded by!**/*.pngandroid/app/src/prod/res/res/mipmap-xxhdpi/ic_launcher_foreground.pngis excluded by!**/*.pngandroid/app/src/prod/res/res/mipmap-xxhdpi/ic_launcher_round.pngis excluded by!**/*.pngandroid/app/src/prod/res/res/mipmap-xxxhdpi/ic_launcher.pngis excluded by!**/*.pngandroid/app/src/prod/res/res/mipmap-xxxhdpi/ic_launcher_foreground.pngis excluded by!**/*.pngandroid/app/src/prod/res/res/mipmap-xxxhdpi/ic_launcher_round.pngis excluded by!**/*.pngios/Podfile.lockis excluded by!**/*.lock
📒 Files selected for processing (23)
.eas/workflows/create-development-builds.yml(1 hunks).gitignore(2 hunks)android/app/build.gradle(5 hunks)android/app/src/dev/res/drawable/splashscreen_logo.xml(1 hunks)android/app/src/prod/res/drawable/splashscreen_logo.xml(1 hunks)android/app/src/prod/res/res/drawable/rn_edit_text_material.xml(0 hunks)android/app/src/prod/res/res/drawable/splashscreen.xml(0 hunks)android/app/src/prod/res/res/mipmap-anydpi-v26/ic_launcher.xml(0 hunks)android/app/src/prod/res/res/mipmap-anydpi-v26/ic_launcher_round.xml(0 hunks)android/build.gradle(0 hunks)android/gradle.properties(3 hunks)android/wearable/build.gradle.kts(1 hunks)app.json(1 hunks)eas.json(1 hunks)ios/Podfile(0 hunks)ios/Podfile.properties.json(1 hunks)ios/TrainLCD.xcodeproj/project.pbxproj(45 hunks)ios/TrainLCD/Schemes/Dev/SplashScreenAppClip.storyboard(1 hunks)ios/TrainLCD/Schemes/Prod/SplashScreenAppClip.storyboard(1 hunks)ios/ci_scripts/ci_post_clone.sh(0 hunks)ios/ci_scripts/ci_pre_xcodebuild.sh(0 hunks)package.json(2 hunks)scripts/bump-version.js(1 hunks)
💤 Files with no reviewable changes (8)
- ios/Podfile
- android/app/src/prod/res/res/mipmap-anydpi-v26/ic_launcher_round.xml
- android/build.gradle
- ios/ci_scripts/ci_pre_xcodebuild.sh
- android/app/src/prod/res/res/drawable/splashscreen.xml
- ios/ci_scripts/ci_post_clone.sh
- android/app/src/prod/res/res/drawable/rn_edit_text_material.xml
- android/app/src/prod/res/res/mipmap-anydpi-v26/ic_launcher.xml
🧰 Additional context used
🧠 Learnings (10)
📓 Common learnings
Learnt from: TinyKitten
Repo: TrainLCD/MobileApp PR: 0
File: :0-0
Timestamp: 2025-08-11T21:13:39.083Z
Learning: TinyKitten prefers concise code reviews for the TrainLCD/MobileApp repository. Keep review comments brief and to the point.
📚 Learning: 2025-09-22T09:21:21.741Z
Learnt from: TinyKitten
Repo: TrainLCD/MobileApp PR: 4511
File: package.json:43-66
Timestamp: 2025-09-22T09:21:21.741Z
Learning: TinyKittenはExpo SDK 54アップグレードにおいて、babel.config.js、RCTNewArchEnabled設定、Podfile設定を適切に処理している。App ClipのiOS deployment targetの調整のみが必要な状況。
Applied to files:
android/gradle.propertiesscripts/bump-version.jsapp.jsonandroid/app/build.gradleios/TrainLCD.xcodeproj/project.pbxproj
📚 Learning: 2025-01-05T12:57:11.319Z
Learnt from: TinyKitten
Repo: TrainLCD/MobileApp PR: 3979
File: android/wearable/build.gradle.kts:37-38
Timestamp: 2025-01-05T12:57:11.319Z
Learning: Wearableアプリ(android/wearable/build.gradle.kts)のversionCode末尾の`1`はウェアラブルデバイスのビルド番号を表すため、Androidモバイルと異なるversionCodeになるのは正常である。
Applied to files:
android/wearable/build.gradle.ktsandroid/app/build.gradle
📚 Learning: 2025-02-19T11:37:54.286Z
Learnt from: TinyKitten
Repo: TrainLCD/MobileApp PR: 4077
File: ios/ProdAppClip/Assets.xcassets/AppIcon.appiconset/Contents.json:1-35
Timestamp: 2025-02-19T11:37:54.286Z
Learning: In the TrainLCD project, App Clip icons are shared with the main app, and therefore do not require separate icon files in the App Clip's Assets.xcassets.
Applied to files:
ios/TrainLCD/Schemes/Prod/SplashScreenAppClip.storyboardios/TrainLCD/Schemes/Dev/SplashScreenAppClip.storyboardios/TrainLCD.xcodeproj/project.pbxproj
📚 Learning: 2025-02-19T23:03:04.326Z
Learnt from: TinyKitten
Repo: TrainLCD/MobileApp PR: 4081
File: src/constants/ident.ts:1-2
Timestamp: 2025-02-19T23:03:04.326Z
Learning: In iOS development, App Clip bundle identifiers should have a `.clip` suffix to differentiate them from the main app bundle identifier.
Applied to files:
ios/TrainLCD/Schemes/Prod/SplashScreenAppClip.storyboardios/TrainLCD.xcodeproj/project.pbxproj
📚 Learning: 2025-09-22T09:30:14.592Z
Learnt from: TinyKitten
Repo: TrainLCD/MobileApp PR: 4511
File: package.json:43-66
Timestamp: 2025-09-22T09:30:14.592Z
Learning: TrainLCDのApp Clipは15MB制限を超えるため、iOS 17以上(50MB制限)をdeployment targetとして設定する必要がある。IPHONEOS_DEPLOYMENT_TARGET = 17.6の設定は技術的要件に基づく適切な判断。
Applied to files:
ios/TrainLCD/Schemes/Prod/SplashScreenAppClip.storyboardios/TrainLCD.xcodeproj/project.pbxproj
📚 Learning: 2025-02-19T12:03:55.562Z
Learnt from: TinyKitten
Repo: TrainLCD/MobileApp PR: 4077
File: ios/TrainLCD.xcodeproj/project.pbxproj:3046-3046
Timestamp: 2025-02-19T12:03:55.562Z
Learning: TrainLCDのApp Clipはアプリの性質上15MB以下に抑えることが困難なため、50MBまで許容されるiOS 17以上をデプロイメントターゲットとして設定している。
Applied to files:
ios/TrainLCD/Schemes/Prod/SplashScreenAppClip.storyboard
📚 Learning: 2025-08-04T12:17:03.430Z
Learnt from: TinyKitten
Repo: TrainLCD/MobileApp PR: 4429
File: src/components/CustomErrorBoundary.tsx:25-25
Timestamp: 2025-08-04T12:17:03.430Z
Learning: In the TrainLCD mobile app, __DEV__ and isDevApp serve different purposes: __DEV__ is only true during debug/development time, while isDevApp is true for both debug time and release-built canary versions. This distinction is intentional - __DEV__ is used to prevent sending crash reports to Sentry during development, while isDevApp is used to enable stack trace display for both developers and canary testers.
Applied to files:
eas.jsonandroid/app/build.gradle
📚 Learning: 2025-01-26T21:22:11.162Z
Learnt from: TinyKitten
Repo: TrainLCD/MobileApp PR: 4032
File: .env:10-11
Timestamp: 2025-01-26T21:22:11.162Z
Learning: In the TrainLCD/MobileApp repository, the .env file is intentionally tracked in git and serves as a template with empty values, similar to .env.example.
Applied to files:
.gitignore
📚 Learning: 2024-12-15T00:35:52.018Z
Learnt from: TinyKitten
Repo: TrainLCD/MobileApp PR: 3947
File: ios/ci_scripts/ci_pre_xcodebuild.sh:2-3
Timestamp: 2024-12-15T00:35:52.018Z
Learning: `ios/ci_scripts/ci_pre_xcodebuild.sh` スクリプトでは、Prod ディレクトリを作成する必要はありません。
Applied to files:
ios/TrainLCD.xcodeproj/project.pbxproj
🔇 Additional comments (14)
ios/Podfile.properties.json (1)
7-7: EAS Build移行に伴うキャッシュ無効化の確認朕が見るところ、CocoaPodsコンパイラキャッシュが無効化されておるな。このEAS Build移行に際しての変更と思われるが、朕としては以下の点を確認せんことには安心できぬ。
- EAS Buildとの互換性の都合により、このキャッシュ無効化が必須なのか
- ビルド性能への影響が想定されておるのか
- この変更の背景に関する記録(移行ガイド等)が存在するか
朕は、この変更がEAS移行の必然であれば咎めることはない。ただ、その根拠を明確にされたきて、朕に報告してもらいたいのじゃ。
.gitignore (2)
12-12: EAS認証情報ファイルの無視設定が適切に追加された。朕が確認したところ、
credentials.jsonの追加は Expo Application Services への移行に適切な措置である。根本無視設定として機能するであろう。
82-82:.gitignoreの変更は実装上の意図を示していない。検証により、ファイルパスは環境変数で動的に決定されることが判明した。朕の調査によれば、
android/fastlane/Appfileにてjson_key_file(ENV["JSON_KEY_FILE_PATH"])と明記されており、実装は環境変数JSON_KEY_FILE_PATHを通じて外部から指定される。.gitignoreの変更は、単なる除外対象ファイル名の慣例更新に過ぎず、実装内のハードコード化されたパス参照ではない。したがって、
play-store-credentials.jsonからgoogle-play-services-account.jsonへの変更は、コード実装に影響を及ぼすものではなく、朕が指摘した「実装上の意図」の懸念は根拠を欠く。Likely an incorrect or invalid review comment.
android/app/src/prod/res/drawable/splashscreen_logo.xml (1)
1-4: 朕の統治下において、この drawable 定義はよろしい。XML 構文は正しく、app splash screen リソースとして適切に定義されておる。@mipmap/ic_launcher の参照が存在することを確認されよ。
android/app/src/dev/res/drawable/splashscreen_logo.xml (1)
1-4: 朕の許可するところ、dev 版リソースも prod 版と同様に適正である。flavor 分岐の体制を整えられたことは統治の効率化に寄与する。
app.json (2)
5-5: 朕の統治に於いて、版数管理の統一を念慮されよ。version 10.0.0 への更新は良好なり。ただし、android.versionCode に 100000078 を指定される一方、android/wearable/build.gradle.kts では 100000000 に統一されていることを確認されたし。複数の buildSource 間での version code 同期が正確にされることを望む。EAS projectId の形式は正しし。
Also applies to: 14-30
22-26: Dev flavor の bundleIdentifier 設定は適正なり。"me.tinykitten.trainlcd.dev" は開発環境向けの識別子として妥当なり。scheme "CanaryTrainLCD" も Canary build との対応が明確にしてよろしい。
eas.json (1)
1-35: 朕が統治する EAS 設定の全体は整然としておる。cli.version 制約により Node 環境の統制が効きて良し。development build の gradle command ":app:bundleDevRelease" および ios scheme "CanaryTrainLCD" は、app.json との整合性を保つ。submit 先の applicationId・bundleIdentifier も一致し、統治下の秩序を乱さず。appVersionSource: local により各環境での版数ソース統一がなされよ。
android/wearable/build.gradle.kts (1)
41-41: 朕の統治に於いて、wearable app の版数体系を確認されよ。versionCode を 100000000 に統一されたことは体系の統一をもたらせり。然るに、mobile app (app/build.gradle) では 100000078 にて、差異を生じておる。wearable device の build 番号が末尾 1 として表現されるべき惯例(PR 3979)に鑑み、この相違が意図的なるものか、または調整の余地ありや確認されよ。
Also applies to: 46-46
.eas/workflows/create-development-builds.yml (2)
86-91: iOS GoogleService-Info.plist の配置先について、朕の確認を求めん。ios/Schemes/Dev/ directory が存在することを確認されたし。当該 directory が create されずば、decode 後の plist ファイルは配置されず、build に支障をきたさん。mkdir -p の処理が必要なるべし。
以下の修正を検討されよ:
- name: Decode GoogleService-Info.plist run: | if [ -z "${GOOGLE_SERVICE_INFO_PLIST_BASE64:-}" ]; then echo "Environment variable GOOGLE_SERVICE_INFO_PLIST_BASE64 is not set." exit 1 fi + mkdir -p ios/Schemes/Dev printf '%s' "$GOOGLE_SERVICE_INFO_PLIST_BASE64" | base64 --decode > ios/Schemes/Dev/GoogleService-Info.plist
3-99: 朕が認めるところによれば、この EAS ワークフロー設定は統治下の CI/CD 体系に適正なり。環境変数チェック、base64 デコード処理の実装は堅牢にして、セキュリティ上の懸念なし。Android・iOS parallel build、submit 処理の分離により、build 効率を高める。${} 展開と if 判定の組み合わせは、環境変数 unset 時の安全性を確保す。
package.json (2)
16-17: 朕の統治に於いて、version:bump スクリプト追加は良好なり。version:bump により package.json・app.json・iOS・Android の版数ソース統一がなされん。scripts/bump-version.js の実装が app.json・ios/build.gradle.kts・android/app 及び wearable の版数を正確に同期させることを確認されたし。
147-147: 版数 10.0.0 への昇格は統治の新時代を象徴するに相応し。android/gradle.properties (1)
13-13: 朕が統治する JVM heap 設定は吟味されし体系なるべし。-Xmx2048m への変更は、build 環境のメモリ効率を考慮せるものか。CI/CD 環境下にての memory constraint 回避の意図ありや否や、確認されよ。
There was a problem hiding this comment.
Actionable comments posted: 1
♻️ Duplicate comments (1)
.eas/workflows/create-development-builds.yml (1)
35-35: 朕の已に指摘せし誤字、いまだ未だ改められず。Line 35 のステップ名に誤字あり:"Resotre" は "Restore" なるべし。統治下の文書は完璧なるを要する。
- - name: Resotre android/app/release.jks + - name: Restore android/app/release.jks
🧹 Nitpick comments (1)
.eas/workflows/create-development-builds.yml (1)
14-27: 重複せる復号ロジック、統一せることを勧めん。.env.local と Sentry properties のデコード処理が Android/iOS で重複している。これら共通部分を朕の従属的な引数化により統一化せば、保守性と一貫性が高まるなり。現在の EAS ワークフロー仕様が許すならば、検討の価値あり。
Also applies to: 71-84
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
.eas/workflows/create-development-builds.yml(1 hunks)
🧰 Additional context used
🧠 Learnings (1)
📓 Common learnings
Learnt from: TinyKitten
Repo: TrainLCD/MobileApp PR: 0
File: :0-0
Timestamp: 2025-08-11T21:13:39.083Z
Learning: TinyKitten prefers concise code reviews for the TrainLCD/MobileApp repository. Keep review comments brief and to the point.
Learnt from: TinyKitten
Repo: TrainLCD/MobileApp PR: 4448
File: functions/src/funcs/tts.ts:214-232
Timestamp: 2025-08-11T20:23:23.071Z
Learning: PR #4448 in TrainLCD/MobileApp is specifically about AI feedback summarization and labeling functionality, not about TTS (Text-to-Speech) improvements. The TTS code changes appear to be part of a modularization refactoring but are not the focus of this PR.
Learnt from: TinyKitten
Repo: TrainLCD/MobileApp PR: 4511
File: package.json:43-66
Timestamp: 2025-09-22T09:21:21.741Z
Learning: TinyKittenはExpo SDK 54アップグレードにおいて、babel.config.js、RCTNewArchEnabled設定、Podfile設定を適切に処理している。App ClipのiOS deployment targetの調整のみが必要な状況。
🔇 Additional comments (1)
.eas/workflows/create-development-builds.yml (1)
51-51: 朕、ビルド提出の依存関係を確認せり。良好なり。build_android と build_ios の後に、それぞれ submit_android と submit_ios が適切に依存関係を持ちて実行されるの構図、朕の治世に相応しき設計なり。
Also applies to: 92-92
Summary by CodeRabbit
New Features
Improvements
Chores