# Android / Expo — CI/CD 技術驗證
> 本文件僅說明 CI/CD 技術流程與設計思路,所有名稱與設定皆為示意用途。
>
---
## 📌 專案基本資訊
- **專案名稱**:App (Android / Expo)
- **實作目標**:驗證 GitHub Actions 作為首選 CI/CD 平台之可行性與穩定性
- **驗證結果**:✅ **實作成功**
- Dev 環境流程已完整跑通
- 成功自動上架至 Google Play (Internal Track)
---
## 1️⃣ 執行摘要 (Executive Summary)
本報告說明 **App** 於 **GitHub Actions (GHA)** 平台上,自動化建置與上架流程之實作成果。
本次實作以 GitHub Actions 為主題,成功建立一套具備以下特性的 CI/CD Pipeline:
- ☁️ **雲原生 (Cloud-Native)**
- 🧩 **無伺服器 (Serverless)**
- 🔐 **高安全性 (Security by Design)**
經實際驗證,此流程已能 **全自動完成**:
> 程式碼簽出 → 環境建置 → 憑證注入 → AAB 打包 → 上傳 Google Play Console
確認此技術方案 **成熟且可行**,具備正式導入價值。
---
## 2️⃣ 自動化流程架構 (Workflow Architecture)
本次實作採用 **Pipeline as Code** 設計,所有 CI/CD 邏輯皆定義於專案 Repository 中,並針對 **Expo 專案特性** 進行客製化設計。
### 🔄 核心流程步驟
1. **觸發啟動 (Trigger)**
- 監聽特定分支 `feature/github-action-upload` 的 `push` 事件
- 未來可擴充為 **Git Tag** 觸發正式發布
2. **環境初始化 (Initialization)**
- 啟動 Ubuntu Runner
- 安裝並設定:
- Node.js(Yarn)
- Java(JDK 17)
3. **相依性安裝 (Dependencies)**
- 執行 `yarn install`
- 確保套件版本與 `yarn.lock` 完全一致
4. **機敏檔案動態還原 (Secure Restoration)**
- 由 GitHub Secrets 還原:
- `google-services.json`
- Android Keystore
- 僅存在於 CI 暫存環境,供 Expo Prebuild 與 Gradle 使用
5. **原生專案生成 (Expo Prebuild)**
- 執行 `expo prebuild --clean`
- 動態產生全新 Android 原生專案
- 確保建置環境 **100% 純淨**
6. **動態手術注入 (Dynamic Patching)**
> ⭐ 關鍵技術亮點
- Prebuild 會重置所有原生設定
- 透過自動化腳本:
- 在建置前一刻
- 將 **Signing Configs** 精準注入 `build.gradle`
- 成功解決 **Expo Managed Workflow 無法保存簽章設定** 的限制
7. **編譯與打包 (Build)**
- 執行 Gradle Task:`bundleRelease`
- 產出 **Signed AAB (Android App Bundle)**
8. **自動上架 (Upload)**
- 串接 **Google Play Developer API**
- 上傳至 **Internal Track(內部測試)**
- 發佈狀態設定為 **Draft**
9. **環境清理 (Cleanup)**
- 強制刪除所有暫存:
- Keystore
- Firebase 設定檔
- 憑證相關檔案
---
## 3️⃣ 關鍵技術優勢
### A. 🔐 資安零信任架構 (Zero-Trust Security)
- **憑證不落地**
- Keystore、API Key、Firebase Config
- 皆不存於 Git Repo,也不存於任何實體伺服器
- **記憶體內還原**
- CI 執行期間以 Base64 Decode 動態還原
- 任務結束即銷毀,極大化降低外洩風險
---
### B. 🛠️ 降低維護成本 (Maintenance)
- **去依賴化**
- 無需維護 Jenkins Server
- 無需 Ruby / Fastlane 環境
- 完全使用 GitHub 原生 Actions + Gradle
- **版本控制化**
- `.yml`(Workflow)與 `.js`(自動化腳本)
- 全數納入 Git 版控
- 流程變更可直接透過 **Code Review** 審核
---
### C. 🧩 Expo 高度整合
- 克服 Expo Prebuild「每次皆為全新專案」的特性
- 透過自研 Patch 機制,實現:
- ✅ 保有 Expo 升級彈性
- ✅ 同時擁有完整原生簽章控制權
- 為 Expo Android CI/CD 提供可複製的最佳實踐
---
## 4️⃣ 實測數據與觀察
- **驗證狀態**:Dev 環境流程已完全跑通
- **產出物**:
- 成功產出 Signed AAB
- Google Play Console 已接收到新版本
- **效能觀察**
- GitHub Actions 採 **Clean Build**
- 每次需重新下載:
- Android SDK
- Gradle Dependencies
- npm / Yarn 套件
- 單次建置時間偏長(可預期)
- **穩定性調整**
- 記憶體消耗較高
- 已針對 Linux Runner:
- 調整 JVM Heap Size
- 避免 OOM,確保流程穩定
---
## 5️⃣ 未來優化建議 (Next Steps)
### 🚀 第二階段優化方向
1. **導入快取機制 (Caching Strategy)**
- Gradle Cache
- Yarn / npm Cache
👉 預期可減少 **40%~60%** 建置時間
2. **擴充正式環境 (Production Readiness)**
- 補齊 Production Keystore 與 Secrets
- 透過 Git Tag(如 `v1.0.0`):
- 自動觸發正式版打包與發布
3. **流程標準化**
- 此 GHA Workflow 架構高度模組化
- 可直接複製應用於:
- React Native
- Expo 系列專案
---
## 🏁 結論
本次驗證結果顯示:
> **GitHub Actions 完全有能力承擔 Android App 複雜的建置與上架需求**
相較於傳統地端 CI 方案,此架構在以下面向具備明顯優勢:
- 🔐 安全性
- 🧩 可維護性
- 🔄 與現代前端生態的整合度
**建議可作為團隊未來 Android / Expo CI/CD 的標準技術選項。**