<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>App on Tarragon</title><link>https://tarrragon.github.io/blog/tags/app/</link><description>Recent content in App on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Thu, 21 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/app/index.xml" rel="self" type="application/rss+xml"/><item><title>App 簽章、商店審核與分批發布流程</title><link>https://tarrragon.github.io/blog/ci/app-deploy/signing-store-rollout-flow/</link><pubDate>Thu, 21 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/ci/app-deploy/signing-store-rollout-flow/</guid><description>&lt;p>App 發布流程的核心責任是把可安裝 artifact 送進受控發行通道。App 與 web 最大差異是使用者裝置會長期保留舊版本；CI/CD 需要把 build number、簽章、審核、分批發布與服務端相容性一起管理。&lt;/p>
&lt;h2 id="流程定位">流程定位&lt;/h2>
&lt;p>App 部署的風險集中在不可變 artifact 與外部 gate。IPA、APK、AAB 或桌面安裝包一旦被使用者安裝，團隊需要靠 hotfix、remote config、kill switch 或服務端相容性止血；store review、簽章憑證與 phased rollout 會決定錯誤版本能否快速收斂。&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>階段&lt;/th>
 &lt;th>責任&lt;/th>
 &lt;th>判讀訊號&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Version&lt;/td>
 &lt;td>管理 version 與 build number&lt;/td>
 &lt;td>每次上傳是否可唯一追溯&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/ci/knowledge-cards/app-signing/" data-link-title="App Signing" data-link-desc="說明行動與桌面應用的簽章憑證如何影響發布能力">App signing&lt;/a>&lt;/td>
 &lt;td>產生可信 artifact&lt;/td>
 &lt;td>certificate / keystore 是否安全&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Test&lt;/td>
 &lt;td>驗證裝置與 OS matrix&lt;/td>
 &lt;td>高風險裝置、權限與離線情境&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Store review&lt;/td>
 &lt;td>通過商店或企業發行 gate&lt;/td>
 &lt;td>審核時間、拒審理由、metadata&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/ci/knowledge-cards/rollout-strategy/" data-link-title="Rollout Strategy" data-link-desc="說明新版本如何以可控節奏推進到全部流量">Rollout strategy&lt;/a>&lt;/td>
 &lt;td>控制使用者取得比例&lt;/td>
 &lt;td>crash-free rate、conversion、回報&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Recovery&lt;/td>
 &lt;td>hotfix、remote config、kill switch&lt;/td>
 &lt;td>是否能處理已安裝版本&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>Version 階段負責讓 artifact 可追溯。App crash report、客服回報與 store console 都依賴 version / build number；版本號對應 commit 與 workflow run 時，事故定位可以直接回到發布紀錄。&lt;/p>
&lt;p>&lt;a href="https://tarrragon.github.io/blog/ci/knowledge-cards/app-signing/" data-link-title="App Signing" data-link-desc="說明行動與桌面應用的簽章憑證如何影響發布能力">App signing&lt;/a> 階段負責維持發布信任鏈。簽章憑證、provisioning profile、keystore 與 notarization credential 都是發布能力；它們要用 secret 管理、權限隔離、輪替與備援流程保護。&lt;/p>
&lt;p>Test 階段負責覆蓋目標裝置條件。App 測試要依實際使用者分佈選擇 OS、裝置、權限狀態、網路條件與升級路徑；只跑 emulator smoke test，通常抓不到真機權限、背景限制或升級資料遷移問題。&lt;/p>
&lt;p>Store review 階段負責處理外部 gate。審核可能因 metadata、隱私揭露、權限使用、付款政策或 crash 被拒；CI/CD 文件要記錄誰能處理審核回覆、哪些變更需要重新提交。&lt;/p>
&lt;p>&lt;a href="https://tarrragon.github.io/blog/ci/knowledge-cards/rollout-strategy/" data-link-title="Rollout Strategy" data-link-desc="說明新版本如何以可控節奏推進到全部流量">Rollout strategy&lt;/a> 階段負責控制新版本擴散速度。分批發布的觀察指標包含 crash rate、登入、購買、同步、推播與核心流程完成率；達到停損條件時應暫停 rollout，先讓已受影響範圍維持可控。&lt;/p>
&lt;p>Recovery 階段負責處理已安裝版本。App 常見止血工具是 remote config、feature flag、kill switch、server-side compatibility、hotfix build 與要求使用者升級；每個工具都要在事故前實作，事故時才有路可走。&lt;/p>
&lt;h2 id="多版本共存契約">多版本共存契約&lt;/h2>
&lt;p>多版本共存是 App 發布的基本前提。後端 API、資料格式、推播 payload 與 remote config 都要支援一段時間的新舊 client，因為使用者更新節奏不受團隊完全控制。&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>契約&lt;/th>
 &lt;th>判讀問題&lt;/th>
 &lt;th>常見風險&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>API response&lt;/td>
 &lt;td>舊 app 看到新增欄位是否能正常處理&lt;/td>
 &lt;td>刪欄位或改語意造成舊版 crash&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Auth / session&lt;/td>
 &lt;td>更新前後 token 是否仍可使用&lt;/td>
 &lt;td>強制登出或登入狀態破壞&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Local storage&lt;/td>
 &lt;td>app upgrade 是否能遷移本機資料&lt;/td>
 &lt;td>新版寫入後舊版讀取契約失效&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Push payload&lt;/td>
 &lt;td>舊版是否能忽略未知 action&lt;/td>
 &lt;td>推播點擊進入不存在頁面&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Remote config&lt;/td>
 &lt;td>config key 是否有預設值與版本條件&lt;/td>
 &lt;td>未支援版本收到新功能開關&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>這些契約要在 CI 或 release checklist 裡被驗證。若只靠後端「盡量相容」，App 發布失敗會在使用者更新後才暴露，回復成本會比 web 或後端高。&lt;/p>
&lt;h2 id="release-checklist">Release checklist&lt;/h2>
&lt;p>Release checklist 的責任是把外部 gate 與內部 gate 接起來。App 發布牽涉商店、憑證、客服、行銷與後端相容，因此 checklist 應該是流程契約，不只是提醒清單。&lt;/p></description><content:encoded><![CDATA[<p>App 發布流程的核心責任是把可安裝 artifact 送進受控發行通道。App 與 web 最大差異是使用者裝置會長期保留舊版本；CI/CD 需要把 build number、簽章、審核、分批發布與服務端相容性一起管理。</p>
<h2 id="流程定位">流程定位</h2>
<p>App 部署的風險集中在不可變 artifact 與外部 gate。IPA、APK、AAB 或桌面安裝包一旦被使用者安裝，團隊需要靠 hotfix、remote config、kill switch 或服務端相容性止血；store review、簽章憑證與 phased rollout 會決定錯誤版本能否快速收斂。</p>
<table>
  <thead>
      <tr>
          <th>階段</th>
          <th>責任</th>
          <th>判讀訊號</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Version</td>
          <td>管理 version 與 build number</td>
          <td>每次上傳是否可唯一追溯</td>
      </tr>
      <tr>
          <td><a href="/blog/ci/knowledge-cards/app-signing/" data-link-title="App Signing" data-link-desc="說明行動與桌面應用的簽章憑證如何影響發布能力">App signing</a></td>
          <td>產生可信 artifact</td>
          <td>certificate / keystore 是否安全</td>
      </tr>
      <tr>
          <td>Test</td>
          <td>驗證裝置與 OS matrix</td>
          <td>高風險裝置、權限與離線情境</td>
      </tr>
      <tr>
          <td>Store review</td>
          <td>通過商店或企業發行 gate</td>
          <td>審核時間、拒審理由、metadata</td>
      </tr>
      <tr>
          <td><a href="/blog/ci/knowledge-cards/rollout-strategy/" data-link-title="Rollout Strategy" data-link-desc="說明新版本如何以可控節奏推進到全部流量">Rollout strategy</a></td>
          <td>控制使用者取得比例</td>
          <td>crash-free rate、conversion、回報</td>
      </tr>
      <tr>
          <td>Recovery</td>
          <td>hotfix、remote config、kill switch</td>
          <td>是否能處理已安裝版本</td>
      </tr>
  </tbody>
</table>
<p>Version 階段負責讓 artifact 可追溯。App crash report、客服回報與 store console 都依賴 version / build number；版本號對應 commit 與 workflow run 時，事故定位可以直接回到發布紀錄。</p>
<p><a href="/blog/ci/knowledge-cards/app-signing/" data-link-title="App Signing" data-link-desc="說明行動與桌面應用的簽章憑證如何影響發布能力">App signing</a> 階段負責維持發布信任鏈。簽章憑證、provisioning profile、keystore 與 notarization credential 都是發布能力；它們要用 secret 管理、權限隔離、輪替與備援流程保護。</p>
<p>Test 階段負責覆蓋目標裝置條件。App 測試要依實際使用者分佈選擇 OS、裝置、權限狀態、網路條件與升級路徑；只跑 emulator smoke test，通常抓不到真機權限、背景限制或升級資料遷移問題。</p>
<p>Store review 階段負責處理外部 gate。審核可能因 metadata、隱私揭露、權限使用、付款政策或 crash 被拒；CI/CD 文件要記錄誰能處理審核回覆、哪些變更需要重新提交。</p>
<p><a href="/blog/ci/knowledge-cards/rollout-strategy/" data-link-title="Rollout Strategy" data-link-desc="說明新版本如何以可控節奏推進到全部流量">Rollout strategy</a> 階段負責控制新版本擴散速度。分批發布的觀察指標包含 crash rate、登入、購買、同步、推播與核心流程完成率；達到停損條件時應暫停 rollout，先讓已受影響範圍維持可控。</p>
<p>Recovery 階段負責處理已安裝版本。App 常見止血工具是 remote config、feature flag、kill switch、server-side compatibility、hotfix build 與要求使用者升級；每個工具都要在事故前實作，事故時才有路可走。</p>
<h2 id="多版本共存契約">多版本共存契約</h2>
<p>多版本共存是 App 發布的基本前提。後端 API、資料格式、推播 payload 與 remote config 都要支援一段時間的新舊 client，因為使用者更新節奏不受團隊完全控制。</p>
<table>
  <thead>
      <tr>
          <th>契約</th>
          <th>判讀問題</th>
          <th>常見風險</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>API response</td>
          <td>舊 app 看到新增欄位是否能正常處理</td>
          <td>刪欄位或改語意造成舊版 crash</td>
      </tr>
      <tr>
          <td>Auth / session</td>
          <td>更新前後 token 是否仍可使用</td>
          <td>強制登出或登入狀態破壞</td>
      </tr>
      <tr>
          <td>Local storage</td>
          <td>app upgrade 是否能遷移本機資料</td>
          <td>新版寫入後舊版讀取契約失效</td>
      </tr>
      <tr>
          <td>Push payload</td>
          <td>舊版是否能忽略未知 action</td>
          <td>推播點擊進入不存在頁面</td>
      </tr>
      <tr>
          <td>Remote config</td>
          <td>config key 是否有預設值與版本條件</td>
          <td>未支援版本收到新功能開關</td>
      </tr>
  </tbody>
</table>
<p>這些契約要在 CI 或 release checklist 裡被驗證。若只靠後端「盡量相容」，App 發布失敗會在使用者更新後才暴露，回復成本會比 web 或後端高。</p>
<h2 id="release-checklist">Release checklist</h2>
<p>Release checklist 的責任是把外部 gate 與內部 gate 接起來。App 發布牽涉商店、憑證、客服、行銷與後端相容，因此 checklist 應該是流程契約，不只是提醒清單。</p>
<ol>
<li>確認 version、build number、commit 與 artifact 對應。</li>
<li>確認 signing secret、profile 或 keystore 仍有效。</li>
<li>跑 unit、UI、device matrix 與 upgrade test。</li>
<li>檢查 API / remote config / push payload 多版本相容。</li>
<li>上傳 internal / beta track，跑 smoke test。</li>
<li>提交 store review，記錄審核狀態。</li>
<li>用 phased rollout 推進，觀察 crash-free rate 與核心指標。</li>
<li>觸發停損條件時暫停 rollout、關閉功能或準備 hotfix。</li>
</ol>
<p>這個順序讓 App 發布從「把包丟上去」變成可觀測流程。每一步都對應一個失敗路由，事故時能知道下一個可執行動作。</p>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>App 部署總覽：回 <a href="../">App 部署 CI/CD</a>。</li>
<li>簽章概念：讀 <a href="/blog/ci/knowledge-cards/app-signing/" data-link-title="App Signing" data-link-desc="說明行動與桌面應用的簽章憑證如何影響發布能力">App Signing</a>。</li>
<li>Gate 原理：讀 <a href="../../ci-gate-workflow-boundary/">CI gate 與 workflow 邊界</a>。</li>
</ul>
]]></content:encoded></item><item><title>App 部署 CI/CD</title><link>https://tarrragon.github.io/blog/ci/app-deploy/</link><pubDate>Wed, 06 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/ci/app-deploy/</guid><description>&lt;p>App 部署 CI/CD 的核心責任是把可安裝的 client &lt;a href="https://tarrragon.github.io/blog/ci/knowledge-cards/artifact/" data-link-title="Artifact" data-link-desc="說明 CI/CD 中可被驗證、保存與發布的交付產物">artifact&lt;/a> 安全送到發行通道。App 發布和 web 部署最大的差異是使用者裝置會保留舊版，app store 審核、&lt;a href="https://tarrragon.github.io/blog/ci/knowledge-cards/app-signing/" data-link-title="App Signing" data-link-desc="說明行動與桌面應用的簽章憑證如何影響發布能力">App Signing&lt;/a>、版本號與分批發布會直接影響交付節奏。&lt;/p>
&lt;h2 id="場域定位">場域定位&lt;/h2>
&lt;p>App 部署的風險集中在 artifact 不可變、簽章憑證、store review 與版本分佈。後端可以快速 rollback，前端靜態站可以重新部署，但已安裝的 App 需要靠更新、&lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/feature-flag/" data-link-title="Feature Flag" data-link-desc="說明如何用可動態開關控制功能曝光與風險">feature flag&lt;/a> 或服務端相容性管理。&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>面向&lt;/th>
 &lt;th>App 部署常見責任&lt;/th>
 &lt;th>判讀訊號&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Build&lt;/td>
 &lt;td>IPA、APK、AAB、desktop package&lt;/td>
 &lt;td>build number / version 是否遞增&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Signing&lt;/td>
 &lt;td>certificate、profile、keystore&lt;/td>
 &lt;td>secret 是否安全、是否可輪替&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Test&lt;/td>
 &lt;td>unit、UI、device matrix&lt;/td>
 &lt;td>是否覆蓋目標 OS 與裝置&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Release&lt;/td>
 &lt;td>store review、phased rollout&lt;/td>
 &lt;td>審核狀態與 rollout 百分比&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/ci/knowledge-cards/rollback-strategy/" data-link-title="Rollback Strategy" data-link-desc="說明發布異常時如何快速回到已知可用狀態">Rollback Strategy&lt;/a>&lt;/td>
 &lt;td>hotfix、remote config、kill switch&lt;/td>
 &lt;td>是否能處理已安裝舊版&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>Build 階段負責產生可安裝 artifact。Mobile 常見產物是 IPA、APK 或 AAB，desktop 則可能是 installer 或 signed package；版本號、build number 與 commit 對應關係會決定後續除錯與回報能否追溯。&lt;/p>
&lt;p>Signing 階段負責證明 artifact 由可信來源發布。憑證、profile、keystore 與 signing secret 都屬於發布能力；它們需要輪替、權限控管與備援流程，避免單一憑證問題中斷發布（安全治理延伸見 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/secret-management/" data-link-title="Secret Management" data-link-desc="說明 token、key、password 與憑證如何保存、輪替與撤銷">Secret Management&lt;/a>）。&lt;/p>
&lt;p>Test 階段負責驗證不同裝置與作業系統組合。App 測試常見風險是 emulator 通過但真機失敗、特定 OS 權限模型不同、背景執行限制不同；device matrix 要依使用者分佈與高風險功能選擇。&lt;/p>
&lt;p>Release 階段負責把 artifact 送進發行通道。Store review、phased rollout、internal testing、beta track 與 production track 都是 gate；發布節奏要把審核時間與分批比例納入 &lt;a href="https://tarrragon.github.io/blog/ci/knowledge-cards/rollout-strategy/" data-link-title="Rollout Strategy" data-link-desc="說明新版本如何以可控節奏推進到全部流量">rollout strategy&lt;/a> 的風險控制（backend 延伸見 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/config-rollout/" data-link-title="Config Rollout" data-link-desc="說明設定如何安全下發到正在運作的服務實例">Config Rollout&lt;/a>）。&lt;/p>
&lt;p>&lt;a href="https://tarrragon.github.io/blog/ci/knowledge-cards/rollback-strategy/" data-link-title="Rollback Strategy" data-link-desc="說明發布異常時如何快速回到已知可用狀態">Rollback Strategy&lt;/a> 階段負責處理已安裝版本。App 發布後會長期存在多個使用者版本，因此 hotfix、remote config、kill switch 與後端相容性要一起設計（相容治理延伸見 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/api-contract/" data-link-title="API Contract" data-link-desc="說明 request / response 邊界如何維持相容與可驗證">API Contract&lt;/a>）。&lt;/p>
&lt;h2 id="常見注意事項">常見注意事項&lt;/h2>
&lt;ul>
&lt;li>簽章憑證是發布能力的一部分，要用 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/secret-management/" data-link-title="Secret Management" data-link-desc="說明 token、key、password 與憑證如何保存、輪替與撤銷">Secret Management&lt;/a> 管理。&lt;/li>
&lt;li>版本號與 build number 要可追溯到 commit 與 artifact。&lt;/li>
&lt;li>Store review 會讓 rollback 和 hotfix 變慢，風險要提前用 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/feature-flag/" data-link-title="Feature Flag" data-link-desc="說明如何用可動態開關控制功能曝光與風險">feature flag&lt;/a> 控制。&lt;/li>
&lt;li>Client / server contract 要支援多版本共存。&lt;/li>
&lt;li>Crash reporting 與 phased rollout 是發布後 gate 的一部分。&lt;/li>
&lt;/ul>
&lt;h2 id="學習路線">學習路線&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>章節&lt;/th>
 &lt;th>主題&lt;/th>
 &lt;th>核心責任&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;a href="signing-store-rollout-flow/">App 簽章、商店審核與分批發布流程&lt;/a>&lt;/td>
 &lt;td>Signing, review and rollout&lt;/td>
 &lt;td>管理簽章、審核、分批發布與多版本共存&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="下一步路由">下一步路由&lt;/h2>
&lt;ul>
&lt;li>App 發布主流程：讀 &lt;a href="signing-store-rollout-flow/">App 簽章、商店審核與分批發布流程&lt;/a>。&lt;/li>
&lt;li>Gate 原理：讀 &lt;a href="../ci-gate-workflow-boundary/">CI gate 與 workflow 邊界&lt;/a>。&lt;/li>
&lt;li>失敗處理：讀 &lt;a href="../github-actions-failure-flow/">CI 失敗到修復發布流程&lt;/a>。&lt;/li>
&lt;/ul></description><content:encoded><![CDATA[<p>App 部署 CI/CD 的核心責任是把可安裝的 client <a href="/blog/ci/knowledge-cards/artifact/" data-link-title="Artifact" data-link-desc="說明 CI/CD 中可被驗證、保存與發布的交付產物">artifact</a> 安全送到發行通道。App 發布和 web 部署最大的差異是使用者裝置會保留舊版，app store 審核、<a href="/blog/ci/knowledge-cards/app-signing/" data-link-title="App Signing" data-link-desc="說明行動與桌面應用的簽章憑證如何影響發布能力">App Signing</a>、版本號與分批發布會直接影響交付節奏。</p>
<h2 id="場域定位">場域定位</h2>
<p>App 部署的風險集中在 artifact 不可變、簽章憑證、store review 與版本分佈。後端可以快速 rollback，前端靜態站可以重新部署，但已安裝的 App 需要靠更新、<a href="/blog/backend/knowledge-cards/feature-flag/" data-link-title="Feature Flag" data-link-desc="說明如何用可動態開關控制功能曝光與風險">feature flag</a> 或服務端相容性管理。</p>
<table>
  <thead>
      <tr>
          <th>面向</th>
          <th>App 部署常見責任</th>
          <th>判讀訊號</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Build</td>
          <td>IPA、APK、AAB、desktop package</td>
          <td>build number / version 是否遞增</td>
      </tr>
      <tr>
          <td>Signing</td>
          <td>certificate、profile、keystore</td>
          <td>secret 是否安全、是否可輪替</td>
      </tr>
      <tr>
          <td>Test</td>
          <td>unit、UI、device matrix</td>
          <td>是否覆蓋目標 OS 與裝置</td>
      </tr>
      <tr>
          <td>Release</td>
          <td>store review、phased rollout</td>
          <td>審核狀態與 rollout 百分比</td>
      </tr>
      <tr>
          <td><a href="/blog/ci/knowledge-cards/rollback-strategy/" data-link-title="Rollback Strategy" data-link-desc="說明發布異常時如何快速回到已知可用狀態">Rollback Strategy</a></td>
          <td>hotfix、remote config、kill switch</td>
          <td>是否能處理已安裝舊版</td>
      </tr>
  </tbody>
</table>
<p>Build 階段負責產生可安裝 artifact。Mobile 常見產物是 IPA、APK 或 AAB，desktop 則可能是 installer 或 signed package；版本號、build number 與 commit 對應關係會決定後續除錯與回報能否追溯。</p>
<p>Signing 階段負責證明 artifact 由可信來源發布。憑證、profile、keystore 與 signing secret 都屬於發布能力；它們需要輪替、權限控管與備援流程，避免單一憑證問題中斷發布（安全治理延伸見 <a href="/blog/backend/knowledge-cards/secret-management/" data-link-title="Secret Management" data-link-desc="說明 token、key、password 與憑證如何保存、輪替與撤銷">Secret Management</a>）。</p>
<p>Test 階段負責驗證不同裝置與作業系統組合。App 測試常見風險是 emulator 通過但真機失敗、特定 OS 權限模型不同、背景執行限制不同；device matrix 要依使用者分佈與高風險功能選擇。</p>
<p>Release 階段負責把 artifact 送進發行通道。Store review、phased rollout、internal testing、beta track 與 production track 都是 gate；發布節奏要把審核時間與分批比例納入 <a href="/blog/ci/knowledge-cards/rollout-strategy/" data-link-title="Rollout Strategy" data-link-desc="說明新版本如何以可控節奏推進到全部流量">rollout strategy</a> 的風險控制（backend 延伸見 <a href="/blog/backend/knowledge-cards/config-rollout/" data-link-title="Config Rollout" data-link-desc="說明設定如何安全下發到正在運作的服務實例">Config Rollout</a>）。</p>
<p><a href="/blog/ci/knowledge-cards/rollback-strategy/" data-link-title="Rollback Strategy" data-link-desc="說明發布異常時如何快速回到已知可用狀態">Rollback Strategy</a> 階段負責處理已安裝版本。App 發布後會長期存在多個使用者版本，因此 hotfix、remote config、kill switch 與後端相容性要一起設計（相容治理延伸見 <a href="/blog/backend/knowledge-cards/api-contract/" data-link-title="API Contract" data-link-desc="說明 request / response 邊界如何維持相容與可驗證">API Contract</a>）。</p>
<h2 id="常見注意事項">常見注意事項</h2>
<ul>
<li>簽章憑證是發布能力的一部分，要用 <a href="/blog/backend/knowledge-cards/secret-management/" data-link-title="Secret Management" data-link-desc="說明 token、key、password 與憑證如何保存、輪替與撤銷">Secret Management</a> 管理。</li>
<li>版本號與 build number 要可追溯到 commit 與 artifact。</li>
<li>Store review 會讓 rollback 和 hotfix 變慢，風險要提前用 <a href="/blog/backend/knowledge-cards/feature-flag/" data-link-title="Feature Flag" data-link-desc="說明如何用可動態開關控制功能曝光與風險">feature flag</a> 控制。</li>
<li>Client / server contract 要支援多版本共存。</li>
<li>Crash reporting 與 phased rollout 是發布後 gate 的一部分。</li>
</ul>
<h2 id="學習路線">學習路線</h2>
<table>
  <thead>
      <tr>
          <th>章節</th>
          <th>主題</th>
          <th>核心責任</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><a href="signing-store-rollout-flow/">App 簽章、商店審核與分批發布流程</a></td>
          <td>Signing, review and rollout</td>
          <td>管理簽章、審核、分批發布與多版本共存</td>
      </tr>
  </tbody>
</table>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>App 發布主流程：讀 <a href="signing-store-rollout-flow/">App 簽章、商店審核與分批發布流程</a>。</li>
<li>Gate 原理：讀 <a href="../ci-gate-workflow-boundary/">CI gate 與 workflow 邊界</a>。</li>
<li>失敗處理：讀 <a href="../github-actions-failure-flow/">CI 失敗到修復發布流程</a>。</li>
</ul>
]]></content:encoded></item><item><title>App Signing</title><link>https://tarrragon.github.io/blog/ci/knowledge-cards/app-signing/</link><pubDate>Wed, 06 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/ci/knowledge-cards/app-signing/</guid><description>&lt;p>App Signing 的核心概念是「簽章憑證即發布能力」。它決定 artifact 是否被平台接受與使用者裝置信任。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>App Signing 位在 app build 與 release channel 之間，涉及 certificate、provisioning profile、keystore 與 secret 管理。&lt;/p>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;ul>
&lt;li>發布因簽章失敗中斷。&lt;/li>
&lt;li>憑證過期導致發版中斷。&lt;/li>
&lt;li>金鑰輪替缺乏演練造成交付風險。&lt;/li>
&lt;/ul>
&lt;h2 id="接近真實服務的例子">接近真實服務的例子&lt;/h2>
&lt;p>iOS 發版需匹配正確 certificate 與 provisioning profile，Android 發版需維護 keystore 一致性與安全儲存。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>App Signing 要定義密鑰保存、輪替節奏、權限分離與緊急回復流程，確保發布能力可持續。&lt;/p></description><content:encoded><![CDATA[<p>App Signing 的核心概念是「簽章憑證即發布能力」。它決定 artifact 是否被平台接受與使用者裝置信任。</p>
<h2 id="概念位置">概念位置</h2>
<p>App Signing 位在 app build 與 release channel 之間，涉及 certificate、provisioning profile、keystore 與 secret 管理。</p>
<h2 id="可觀察訊號">可觀察訊號</h2>
<ul>
<li>發布因簽章失敗中斷。</li>
<li>憑證過期導致發版中斷。</li>
<li>金鑰輪替缺乏演練造成交付風險。</li>
</ul>
<h2 id="接近真實服務的例子">接近真實服務的例子</h2>
<p>iOS 發版需匹配正確 certificate 與 provisioning profile，Android 發版需維護 keystore 一致性與安全儲存。</p>
<h2 id="設計責任">設計責任</h2>
<p>App Signing 要定義密鑰保存、輪替節奏、權限分離與緊急回復流程，確保發布能力可持續。</p>
]]></content:encoded></item></channel></rss>