0%

【CI/CD】4. 在佈署階段置換參數值,以Web.Config為例

如果你的佈署狀況如下

[![](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、DomainValue換掉,因為我們在變數檔案裡面有設定。

這樣我們就能透過建置多個環境的方式,在每個環境中設定好對應的變數值,只要執行一次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)