建立Deployment Group



因為是布署到VM,在建立Release檔之前,要先綁定要布署到哪一台機器。
  • 這裡只要記的勾選使用個人access token這個選項即可
  • Script貼到VM的PowerShell執行後,所有選項都enter就可以了


建立Release Definition



Template看需求選擇,這裡選擇IIS Website Deployment。
  • 這裡只要記的勾選使用個人access token這個選項即可
  • Script貼到VM的PowerShell執行後,所有選項都enter就可以了


Add Artifact



  • Source選之前我們建立的Build


  • 設定持續布署Trigger(右上角的閃電) : 把trigger改成Enabled並選擇觸發的分支
  • Continuous deployment trigger : 勾選Enabled,新增Build branch filters

Environment



這裡環境先建立一個Environment布署到Stage,在卡一關審核布署到Prod。
  • 審核設定

  • 其他沒有需要特別處理的deployment condition就預設即可

Environment Task 設定



發行方式如果選的是檔案系統,不需要在release前置換config裡appsettings、connectionstring以外的區塊內容,只需要IIS Web App Deploy這個步驟就可以了。
這已我們區要在布署前置換一些參數,布署步驟如下圖:




  • Process
    • Website name : 填入你IIS設定的站台名稱

  • Run on deployment group
    • Deployment group : 選一個之前建立的Deployment group
    • 其他基本都用預設


  • Replace token


  • IIS Web App Deploy
    • Package or Folder : 選到發行檔設定的.zip檔案
    • SetParameters File : 選到SetParameters.xml
    • Remove Additional Files at Destination : 勾選



前言



目標是要將網站的CICD建立起來,想在VSTS設定在專案布署到Server前將config的一些資訊替換掉 :

建立發行檔



選擇Web Deploy封裝,封裝位置放在該專案的Publish資料夾下的一個.zip



另外,如果有需要在布署網站之前修改一些config檔設定,又不在VSTS預設就有可以設定變數的appsetting和connectionstring區段裡,就需要建立parameters.xml

建立parameters.xml




可以看到範例中,parameter要設定name、defaultValue,defaultValue設定為#{xxx}#的目的是在設定布署的task時,我們會加入一個Replace token的步驟,裡面預設就是以#{ }#來判斷他要抓取的變數,再把變數值在release environment的variables設定,在release前替換掉。parameterEntry的設定是指你要替換的值是在哪個檔案、哪種格式、在哪一種tag下的哪個attribute,以範例第一個parameter來說就是在web.config裡找exceptionless這個tag,tag裡的apiKey這個attribute為替換目標。parameters.xml在發行後會產生一個SetParameter.xml如下圖 :


在Release的Variables設定如下:

Builds



首先New一個Build Definition,Template看需求選擇,這裡因為是ASP.NET MVC Web Application,所以選擇ASP.NET,預設會產出好幾個Task步驟,這裡我們刪減後只剩下這些步驟 :


Process

  • Name的部分輸入Build名稱
  • Agent queue選擇你要用的host即可

Get sources

  • From選擇你的專案檔案來源
  • Repository選擇你的專案Repository
  • Branch你檔案來源的分支
  • Clean:在Build執行前是否清空你當前資料夾

Run on agent

  • Job cancel timeout設定為1

NuGet restore

  • Path to solution : 選專案sln (但要注意是如果你一個方案下有多個網站,請複製sln後開啟,把方案下其他專案移除後儲存)
  • Feeds to use : 如果專案有用私人nuget server,要選Feeds in my NuGet.config (PS : Nuget.Config在個人user資料夾下\AppData\Roaming\NuGet),自己是習慣把這個檔案複製到專案的App_Data底下。




Build solution

  • Visual Studio Version : 選你開發的vs版本即可
  • MSBuild Arguments : 發行檔用Web Deploy(封裝) => /p:DeployOnBuild=true;PublishProfile=CICD;PackageAsSingleFile=true
    發行檔用檔案模式 => /p:DeployOnBuild=true;PublishProfile=CICD
  • Configuration : web.config有切分不同環境不同檔案,就選擇你對應的名稱
  • Clean:打勾
  • 進階勾選 restore nuget packages


UnitTest

  • Visual Studio Version : 選你開發的vs版本即可
  • 其他基本都預設就可以


Copy File

  • Source Folder : 依據你建立發行資料的位置,這裡是發行到該專案的Publish資料夾下$(Agent.BuildDirectory)\s\FastIP.Application\Publish
  • Target Folder : 複製到的目標資料夾 $(Build.ArtifactStagingDirectory)
  • 進階 : 勾選清理目標資料夾



Publish Build Artifacts

  • 基本上都是預設


Triggers



勾選啟動CI,選擇你的目標分支即可

Options

Build number format : $(date:yyyyMMdd)$(rev:.r)
這次主要紀錄在可動態增減的component中,透過EventBus和父層做溝通的處理方式。

情境:
動態的圖片上傳component,上傳完後要顯示圖片在該component上

構想 :
多個上傳按鈕,但真正的上傳按鈕只有一個(隱藏起來),不管點了哪個上傳按鈕都去呼叫唯一的那個上傳功能,但是在註冊eventBus事件傳遞時,監聽的名稱都是一樣的,所以乾脆把物件本身丟入eventBus,然後在上傳完成時直接拿eventBus裡的資料出來把圖片url塞回去。




實際程式碼 :
// 在eventBus中加入data屬性讓呼叫者直接把自己物件傳入
var eventBus = new Vue({
    data: {
        target: []
    }
});

props: {
model: {
type: Object,
},
},
data: function () {
return {
widgetModel: this.model,
}
},

methods: {
clickUpload: function (index) {
eventBus.$data.target = this.widgetModel[index];
$('#fileupload').click();
},
}

mounted: function () {
$('#fileupload').fileupload({
autoUpload: true,// 自動上傳
url: '上傳圖片的API位置',
add: function (e, data) { //選擇圖片後會跑入這個事件
//驗證
if (!data.files[0].name.match(/^[\S\s]+\.{1}(jpg|png|jpeg|gif){1}$/i)) {
alert('只能上傳圖片')
return;
}
data.submit();
},
done: function (e, data) {
eventBus.$data.target.ImageUrl = data.result.Response[0];
},
fail: function (e, data) {
alert('上傳圖片失敗');
}
});
},





接續上一篇 【Redis】Windows 環境 - Redis的Master-Slave-Sentinel (Part1)

建立Sentinel Config :


  • 預設安裝完Redis是沒有Sentinel.conf這個檔案,所以自己建立一個。
  • github sentinel設定參考
  • 基本設定
    1. port設定
      • port 26381
    2. 指定監看的master資料,master名稱可自訂,最後一個數值代表需要幾個sentinel同意,master才算失效。
      • sentinel monitor master_6381 127.0.0.1 6381 1
    3. 指定監看的master多少毫秒內沒回應就算失效。
      • sentinel down-after-milliseconds master_6381 3000
    4. 發生failover時,可以有多少個slave從新的master同步資料回去。
      • sentinel parallel-syncs master_6381 1
    5. 多少毫秒內未完成failover即為失敗。
      • sentinel failover-timeout master_6381 180000
    6. 指定連線master的密碼(就是master的密碼)。
      • sentinel auth-pass master_6381 123

啟動Sentinel :


  • 指令
    1. redis-server.exe sentinel.conf --sentinel
    2. 注意 ! 在Windows7環境下,使用最新版3.2.100將會啟動失敗如下圖,請使用3.0.504版本(上一版)


    3. 安裝3.0.504版本後加入sentinel.conf後執行結果


  • Windows Service
    • sc.exe create "RedisSentinel" start= auto binPath= "D:\Tools\Redis\redis-server.exe --service-run D:\Tools\Redis\sentinel.conf --sentinel" DisplayName= "RedisSentinel"

測試 master 失效 :


  • master失效後執行failover。


  • sentinel.conf自動修改了。

Config設定 :


  • 複製一份redis.windows.conf當作Slave,改名為redis.windows6380.conf。
  • 我這裡設定redis.windows.conf(master)的port為6381,redis.windows6380.conf的為6380。
  • 設定密碼為123,兩個conf都要設定 (密碼非必要)
    1. requirepass 123
    2. masterauth 123
  • 設定Slave的master => slaveof  <masterip> <masterport>  ,這裡的範例為 slaveof 127.0.0.1 6381。

啟動Master-Slave :


  • 以指令啟動 (切換D槽指令cd /d D:\)
    1. 啟動master指令 redis-server redis.windows.conf
    2. 啟動slave指令 redis-server redis.windows6380.conf
    3. 結果 (左邊是master,右邊是slave)
  • 建立service來啟動
    1. 建立master => sc.exe create "Redis6381" start= auto binPath= "D:\Tools\Redis\redis-server.exe --service-run D:\Tools\Redis\redis.windows.conf" DisplayName= "Redis6381"
    2. 建立slave => sc.exe create "Redis6380" start= auto binPath= "D:\Tools\Redis\redis-server.exe --service-run D:\Tools\Redis\redis.windows6380.conf" DisplayName= "Redis6380"
    3. 結果
  • 查看執行狀況
    1. master => redis-cli -h 127.0.0.1 -p 6381 -a 123 info replication
    2. slave => redis-cli -h 127.0.0.1 -p 6380 -a 123 info replication
    3. 結果
在安裝完Redis,預設在Redis資料夾底下會有兩個conf檔案.


redis.windows-service.conf 是給Service用的
redis.windows.conf 是用指令的方式啟Redis Server用
兩個config檔設定參數都差不多,這裡以redis.windows.conf來說明。

Config "NETWORK" 參數說明 :

  • bind
    • Redis Server 只接收Bind的IP進行連線。
    • 可接收單一或多IP進行連線。
      範例 :
      • bind 127.0.0.1
        bind 192.168.1.100 10.0.0.1
    • 預設沒指定Bind哪個IP的話,會接收所有Server可用網路。
  • protexted-mode
    • 預設保護模式是開啟的。
    • 當保護模式開啟,而且(以下兩者皆符合)
      • 沒指定Bind哪個IP
      • 沒設定密碼
      那Server只接受 127.0.0.1 和 ::1 還有 Unix domain sockets(可靠的連線,不會通過網路協議棧)。
  • port
    • 連到這個Redis Server的port,預設為6379。
    • 當設定為0,將不會接受TCP socket。
  • timeout
    • 設定幾秒後將關閉閒置的連線。
    • 當設定為0,將不啟用。

Config "GENERAL" 參數說明 :

  • daemon
    • 預設不以daemon模式(Service模式)執行。
    • 當設定daemonize,Redis會寫pid file在/var/run/redis.pid路徑下。
    • 在Windows環境不支援daemonize。

參考資料
Redis GitHub
redis.windows.conf