如果你的佈署狀況如下
[![](https://3.bp.blogspot.com/-uiFFGMOOPlQ/WmraN8BbjEI/AAAAAAAAIdo/xzVVbXd5NLkz4xpa1wI-gTNN048M5R7ngCLcBGAs/s640/1.png)](https://3.bp.blogspot.com/-uiFFGMOOPlQ/WmraN8BbjEI/AAAAAAAAIdo/xzVVbXd5NLkz4xpa1wI-gTNN048M5R7ngCLcBGAs/s1600/1.png) |
原諒我只繪畫醜圖.... |
有一次更版進到到Master Branch,而CI設定Trigger是Master更動時自動建置,CD接收到CI建置完成後執行佈署機器,而每台機器的Web.Config值都有差異,這時候該怎麼做?
#XML variable substitution
Azure App Service Deploy有提供XML variable substitutuin可以選擇
[![](https://4.bp.blogspot.com/-LN_4j9iX9As/WmrfdZWF3oI/AAAAAAAAId4/Tc9U1W24Lq45Ms0p9qhtBLNX2EJ8sKJ_QCLcBGAs/s640/1.png)](https://4.bp.blogspot.com/-LN_4j9iX9As/WmrfdZWF3oI/AAAAAAAAId4/Tc9U1W24Lq45Ms0p9qhtBLNX2EJ8sKJ_QCLcBGAs/s1600/1.png)
依據註解中說明就是,當這個選項勾選時,他會自動去找專案中的所有.Config檔案,檔案中的appSettings,application Settings , connectionString區塊,如果有Key或Name與設定的變數相同時自動置換,且是發生在Config transforms之後
什麼意思呢? 直接看範例,如果我們的Web.Config裡面長這樣
[![](https://1.bp.blogspot.com/-iEfgD967KZc/WmriR-qREbI/AAAAAAAAIeE/P_zG3I8Ah3EPMA4uADVKwh8LqCImdKpjACLcBGAs/s400/1.png)](https://1.bp.blogspot.com/-iEfgD967KZc/WmriR-qREbI/AAAAAAAAIeE/P_zG3I8Ah3EPMA4uADVKwh8LqCImdKpjACLcBGAs/s1600/1.png)
那他就會在去比對appSettings、connectionString區塊,裡面的Name或是Key有對應到變數設定的話,Value值會自動被替換,而變數設定又在哪邊呢?
[![](https://2.bp.blogspot.com/-bJ9GV3qzx1A/WmrjTH_HnSI/AAAAAAAAIeM/XMf0yAL-XBsfedMAXLy7jbkiS5RcfRViwCLcBGAs/s400/1.png)](https://2.bp.blogspot.com/-bJ9GV3qzx1A/WmrjTH_HnSI/AAAAAAAAIeM/XMf0yAL-XBsfedMAXLy7jbkiS5RcfRViwCLcBGAs/s1600/1.png)
以上面兩張圖來說,那他在WebDeploy到Azure App Service之前就會將我的StaticDomains、Domain的Value換掉,因為我們在變數檔案裡面有設定。
這樣我們就能透過建置多個環境的方式,在每個環境中設定好對應的變數值,只要執行一次CI流程,觸發多個CD流程,達到多台同時佈署的目的
[![](https://2.bp.blogspot.com/-Vn7jrg9S6zM/WmrkbLQL9JI/AAAAAAAAIeY/DSoCnAGpUUA_-3oKJhbPD6sj9bdNQ0DPQCLcBGAs/s400/1.png)](https://2.bp.blogspot.com/-Vn7jrg9S6zM/WmrkbLQL9JI/AAAAAAAAIeY/DSoCnAGpUUA_-3oKJhbPD6sj9bdNQ0DPQCLcBGAs/s1600/1.png)
#參數不在appSettings,application Settings , connectionString區塊之中
這邊特別注意,剛剛那種置換的值方法僅適用於上述區塊之中,換句話說,如果我們有環境設定變數,但他又不在這幾個區塊之中,該如何做?
Parameter.xml
還好微軟有提供另一種方式能處理這個問題,就是透過Parameters.xml
建立parameters.xml
[![](https://4.bp.blogspot.com/-DIAJpQ2tUYk/WmrlsIo55sI/AAAAAAAAIeg/PCaPpM04JucMUYC8QFByvv4X3pPcRwjJgCLcBGAs/s320/1.png)](https://4.bp.blogspot.com/-DIAJpQ2tUYk/WmrlsIo55sI/AAAAAAAAIeg/PCaPpM04JucMUYC8QFByvv4X3pPcRwjJgCLcBGAs/s1600/1.png)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <parameters> <parameter name="ExceptionlessAPIKey" defaultValue="#{ExceptionlessAPIKey}#" > <parameterEntry kind="XmlFile" scope="Web\.config" match="//exceptionless/@apiKey" /> </parameter> <parameter name="SessionConnectionString" defaultValue="#{SessionConnectionString}#" > <parameterEntry kind="XmlFile" scope="Web\.config" match="//configuration/system.web/sessionState/@sqlConnectionString" /> </parameter> </parameters>
|
Name : 變數名稱
Scope : 受影響的檔案為和,你可以設定整個專案底下全部的.Config也行
Match : 在這些檔案底下如何尋找要被替換的值
Example 1 : Web.Config底下從根結點開始找起,找到一個叫做exceptionLess的Tag,然後把apiKey這個屬性換成我設定的值
Example 2 : Web.Config底下從根結點開始找起,找到configuration底下的system.web底下的sessionState Tag,然後把sqlConnectionString這個屬性換成我設定的值
DefaultValue : 如果在佈署時沒有設定參數值時,預設給的Value
接著在VisualStudio按發行後應該會看到檔案長出SetParameters.xml
[![](https://3.bp.blogspot.com/-s_s3aU7dr74/WmrsRb8ETdI/AAAAAAAAIew/WYlqsjbIk0oj7ow-GOqheH4FJY6QZAUHgCLcBGAs/s640/1.png)](https://3.bp.blogspot.com/-s_s3aU7dr74/WmrsRb8ETdI/AAAAAAAAIew/WYlqsjbIk0oj7ow-GOqheH4FJY6QZAUHgCLcBGAs/s1600/1.png)
打開來會看到
[![](https://1.bp.blogspot.com/-viIUyylwlDg/Wmr6qYwZv-I/AAAAAAAAIgE/C0ISadjZIigW7FQ6sMezcjZwYudaEaLrwCLcBGAs/s640/1.png)](https://1.bp.blogspot.com/-viIUyylwlDg/Wmr6qYwZv-I/AAAAAAAAIgE/C0ISadjZIigW7FQ6sMezcjZwYudaEaLrwCLcBGAs/s1600/1.png)
到這邊我們已經成功將Web.Config的指定位置挖成變數值,等等在CD階段,我們就是要想辦法把SetParameters.xml的Value值換掉
回到CD設定介面
告訴Azure App Service Deploy Task,你有SetParameters.xml
[![](https://4.bp.blogspot.com/-NUpiKPxhPRY/Wmrtx-vh_HI/AAAAAAAAIfE/RRml5NRckGQ6S4uDWJJsfSHhX2H7CWEBgCLcBGAs/s640/1.png)](https://4.bp.blogspot.com/-NUpiKPxhPRY/Wmrtx-vh_HI/AAAAAAAAIfE/RRml5NRckGQ6S4uDWJJsfSHhX2H7CWEBgCLcBGAs/s1600/1.png)
安裝Replace Token Task
為了置換掉SetParameters.xml裡面的值,必須幫我們VSTS安裝套件
[![](https://1.bp.blogspot.com/-Kq1PpE97VYE/WmruR4NMthI/AAAAAAAAIfM/Vu2lwFOUsx4Npju7imY-kYBuW3Frt1exACLcBGAs/s400/1.png)](https://1.bp.blogspot.com/-Kq1PpE97VYE/WmruR4NMthI/AAAAAAAAIfM/Vu2lwFOUsx4Npju7imY-kYBuW3Frt1exACLcBGAs/s1600/1.png)
安裝連結 : [Replace Token MarketPlace ](https://marketplace.visualstudio.com/items?itemName=qetza.replacetokens)
在Azure App Service Deploy之前加上Replace Token Task
[![](https://2.bp.blogspot.com/-jDdk2Q7Mj7I/Wmru-f9N1fI/AAAAAAAAIfU/y2x-uJAWD8wQSwaij7_B6TyOS7T2RmMzQCLcBGAs/s640/1.png)](https://2.bp.blogspot.com/-jDdk2Q7Mj7I/Wmru-f9N1fI/AAAAAAAAIfU/y2x-uJAWD8wQSwaij7_B6TyOS7T2RmMzQCLcBGAs/s1600/1.png)
[![](https://3.bp.blogspot.com/-mTQYjeZIYho/WmrvSLWq_lI/AAAAAAAAIfY/hWpXjtyZkzMf40oTRqx4cfaWoSxvNQ5XgCLcBGAs/s640/1.png)](https://3.bp.blogspot.com/-mTQYjeZIYho/WmrvSLWq_lI/AAAAAAAAIfY/hWpXjtyZkzMf40oTRqx4cfaWoSxvNQ5XgCLcBGAs/s1600/1.png)
設定
[![](https://4.bp.blogspot.com/-j-77BDvLK7A/WmrxsFTAD8I/AAAAAAAAIfo/4PIBYR3ck7Uc0DSDfUcTbjs4bAA2CzM-ACLcBGAs/s640/1.png)](https://4.bp.blogspot.com/-j-77BDvLK7A/WmrxsFTAD8I/AAAAAAAAIfo/4PIBYR3ck7Uc0DSDfUcTbjs4bAA2CzM-ACLcBGAs/s1600/1.png)
**Root Directory : **要替換的目標檔案Root資料夾位置
**Target files : **告訴它我們要找的檔案是誰,以這邊來說就是SetParameters.xml
**Token prefix、Token suffix : **比對什麼是它要幫我們置換的,而這邊就是#{xxxx}#包起來的就是參數
這樣設定完之後,它就會在WebDeploy之前執行Replace Token Task,而這個Task會去找到SetParameters.xml,然後找到#{xxx}#符號的,然後用我們之前設定在Variables的參數置換掉
[![](https://2.bp.blogspot.com/-rvxpn3Nkvrw/WmrzQb7-SUI/AAAAAAAAIf0/fMBjj3gSnYwGvbR50p7UZcQQwvGUf5MNgCLcBGAs/s640/1.png)](https://2.bp.blogspot.com/-rvxpn3Nkvrw/WmrzQb7-SUI/AAAAAAAAIf0/fMBjj3gSnYwGvbR50p7UZcQQwvGUf5MNgCLcBGAs/s1600/1.png)