Power Platform Managed Solution:Update、Upgrade、Stage for Upgrade 完整區別

| PowerPlatform | 3 Reads

在 Power Platform 中,如果 Canvas App、Dataverse Table、Power Automate Flow 等元件都透過 Solution 管理,常見的 ALM 發布流程是:

Development
    ↓
Unmanaged Solution
    ↓
匯出 Managed Solution
    ↓
Sandbox
    ↓
Production

也就是說,開發環境通常使用 Unmanaged Solution,而 Sandbox、Production 等下游環境則匯入 Managed Solution

當 Sandbox 或 Production 已經存在舊版本 Managed Solution,再匯入同一 Solution 的較新版本時,Power Platform 會判斷這是一個既有 Solution 的更新,並提供 Update、Upgrade、Stage for Upgrade 等處理方式。

一、Update、Upgrade、Stage for Upgrade 有什麼不同?

方式 主要行為 新版已刪除的舊 Component 是否產生 _Upgrade
Update 將新版內容更新到既有 Solution 保留
Upgrade 直接完成正式升級 刪除 目前一般不會
Stage for Upgrade 先建立 Pending Upgrade,再稍後完成正式升級 Apply 前暫時保留

二、Update:更新,但不清理舊 Component

例如舊版本包含:

Canvas App
Table A
Table B
Flow A

新版已經把 Flow A 刪除:

Canvas App
Table A
Table B

如果使用 Update,新版內容會更新進去,但是舊版中的 Flow A 不會因為新版已經沒有它而自動刪除。

因此最後可能仍然是:

Canvas App
Table A
Table B
Flow A  ← 仍然存在

Update 適合只想更新既有 Component,而暫時不希望 Power Platform 清理舊 Component 的情況。

另外,Update 不會產生:

MyBusinessSolution_Update

這種 Solution 並不存在。

三、Upgrade:更新並完成舊 Component 清理

如果對同樣的版本變更使用 Upgrade

舊版:
Canvas App
Table A
Table B
Flow A

新版:
Canvas App
Table A
Table B

正式 Upgrade 完成後會變成:

Canvas App
Table A
Table B

Flow A 因為已經不包含在新版 Solution 中,因此會被移除。

目前 Power Platform 的單步 Upgrade 流程已經過最佳化,正常直接執行 Upgrade 時,一般不需要先建立一個暫時的 _Upgrade Solution。

因此一般發布通常可以理解為:

MyBusinessSolution 1.0.0.0
        ↓
Import 1.1.0.0
        ↓
Upgrade
        ↓
MyBusinessSolution 1.1.0.0

Solution 清單最終仍然只有一個正式 Solution。

四、Stage for Upgrade:把 Upgrade 拆成兩個階段

Stage for Upgrade 比較特殊。

假設目前環境中已經存在:

MyBusinessSolution

匯入新版時選擇 Stage for Upgrade,完成後 Solution 清單會暫時看到:

MyBusinessSolution
MyBusinessSolution_Upgrade

這裡的 _Upgrade 是 Power Platform 用於 Pending Upgrade 的特殊 Solution。它不是一閃而過的畫面狀態,也不會幾分鐘後自動消失。

只要還沒有執行 Apply Solution Upgrade,這兩個 Solution 就會繼續存在。

流程可以理解為:

原 Managed Solution
        ↓
Stage for Upgrade
        ↓
MyBusinessSolution
MyBusinessSolution_Upgrade
        ↓
進行必要確認、資料移行、Dependency 處理等
        ↓
Apply Solution Upgrade
        ↓
MyBusinessSolution

Apply Solution Upgrade 完成之後,Pending Upgrade 會被正式套用,新版不存在的舊 Component 也會被清理,最後再次只剩一個正式 Solution。

五、兩個 Solution 是否代表有兩個 Canvas App?

不是。

這是 Stage for Upgrade 最容易誤解的地方。

例如 Stage 後看到:

MyBusinessSolution
└─ MainCanvasApp

MyBusinessSolution_Upgrade
└─ MainCanvasApp

這並不代表環境中存在:

MainCanvasApp_舊版
MainCanvasApp_新版

兩套獨立 App。

只要兩邊所列的是同一個 Canvas App Component,它們實際指向的仍然是同一個 App Component

差別在於這個 Component 存在不同的 Solution Layer

概念上比較接近:

同一個 MainCanvasApp
        │
        ├─ Base Solution Layer
        │
        └─ Pending Upgrade Layer
                ↑
              上層

也就是說,Solution 是元件的「封裝與 Layer 管理單位」,並不是每一個 Solution 都保存一套完全獨立的 Canvas App。

六、從兩個 Solution 入口進入,看到的是不是同一個 App?

如果 Base Solution 和 _Upgrade Solution 中都列出了同一個 Canvas App,那麼兩個入口指向的是同一個 App Component。

因此不存在:

從 MyBusinessSolution 打開 → 執行舊版 App

從 MyBusinessSolution_Upgrade 打開 → 執行新版 App

這種選擇方式。

Stage for Upgrade 並不是建立一套可以與正式 App 完全隔離運行的「新版測試 App」。

七、那 Stage for Upgrade 後應該怎麼測試?

可以直接進入 Power Apps 左側的:

アプリ
    ↓
MainCanvasApp
    ↓
Play

也可以從 Solution 中找到該 Canvas App 再打開。

兩種方式最終執行的仍然是目前這個環境中的同一個 Canvas App。

因此 Stage for Upgrade 後真正需要確認的是整個環境目前實際運行的狀態,例如:

  • Canvas App 畫面與操作是否正常
  • Dataverse Table、Column 是否正常
  • Power Automate Flow 是否正常
  • Connection Reference 是否正常
  • Environment Variable 是否正確
  • Security Role 與資料權限是否正常
  • 資料移行是否完成
  • 舊 Component 是否仍存在 Dependency

需要注意的是,Pending Upgrade 會形成新的 Solution Layer。對大多數採用「Top wins」規則的 Component,較上層 Layer 可以影響實際 Runtime。

因此不能把 Stage for Upgrade 理解為:

舊版仍然正式運行
新版完全隔離在 _Upgrade 裡等待測試

這並不是一個獨立的測試環境。

八、為什麼 Apply Solution Upgrade 後還要再測一次?

因為 Stage 階段與 Apply 完成後的狀態並不完全相同。

例如舊版有:

Canvas App
Table A
Flow A

新版只有:

Canvas App
Table A

Stage for Upgrade 階段,Flow A 可能仍然暫時存在。

但執行:

Apply Solution Upgrade

之後,Flow A 才會因為新版已經不包含它而被正式清理。

因此比較完整的確認流程是:

Stage for Upgrade
        ↓
第一次確認
        ↓
資料移行 / Dependency 處理
        ↓
Apply Solution Upgrade
        ↓
舊 Component 清理
        ↓
第二次 Smoke Test

尤其是存在 Table、Column、Relationship、Flow 等刪除操作時,Apply 後的最終確認非常重要。

九、Stage for Upgrade 主要是拿來做什麼?

Stage for Upgrade 並不是一般版本發布時必須使用的功能。

它更適合這類情況:

新版準備刪除舊 Table / Column / Component
        ↓
但正式刪除之前
還需要搬資料、解除 Dependency 或完成其他處理
        ↓
Stage for Upgrade
        ↓
完成必要工作
        ↓
Apply Solution Upgrade

如果只是普通的 Canvas App 功能更新,通常沒有必要刻意使用 Stage for Upgrade。

十、一般建議的 Dev → Sandbox → Production 流程

比較簡單而且乾淨的方式是:

Development
Unmanaged Solution
        ↓
提高 Solution Version
        ↓
Export Managed Solution
        ↓
Sandbox
        ↓
Upgrade
        ↓
完整測試
        ↓
同一個 Managed ZIP
        ↓
Production
        ↓
Upgrade
        ↓
Smoke Test

例如:

Development
1.0.0.0
        ↓
修改 Canvas App / Flow / Table
        ↓
1.1.0.0
        ↓
Export Managed
        ↓
Sandbox:Import → Upgrade
        ↓
測試 OK
        ↓
Production:匯入同一個 Managed ZIP → Upgrade

這樣 Production 實際部署的,就是 Sandbox 已經驗證過的同一份 Artifact。

十一、三種方式最簡單的記法

Update
= 更新新版內容
= 不主動清除新版已刪除的舊 Component

Upgrade
= 更新新版內容
= 同時完成舊 Component 清理

Stage for Upgrade
= 把 Upgrade 拆成兩個階段
= 先 Pending Upgrade
= 完成必要處理後再 Apply Solution Upgrade

而對 _Upgrade 最重要的理解則是:

兩個 Solution
≠
兩套 Canvas App

而是:

同一個 Component
+
不同的 Solution Layer

因此在一般 ALM 中,可以把 Upgrade 當作正常版本發布方式;只有在正式清理舊 Component 之前還需要進行資料移行、解除 Dependency 等特殊操作時,再考慮使用 Stage for Upgrade

This article was last edited at