---
# System prepended metadata

title: Android Github Action 實作筆記
tags: [CICD, Android]

---

# 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 的標準技術選項。**
