[第八屆IT邦幫忙鐵人賽] .NET Core 多環境佈署設定

前言

DevOps 流程內會設置許多環境,像是 Development ,QA ,Staging, and Production,依據需求的不同分別提供給開發者、測試人員與客戶使用。其優點如下:

 

  1. Dev環境:因為佈署於伺服器而非工程師本機環境下進行操作與測試,減少了軟體套件未安裝、作業系統版本不同、系統參數不同...等佈署後發生問題的機率。
  2. QA環境:測試人員進行測試的階段可能需要輸入假資料進行測試,避免影響到正式產品的資料正確性。
  3. Staging:提供另一個備份的正式資料庫 搭配最新開發的程式進行操作。以最接近正式產品環境進行測試,找出可能發生的問題。
  4. Production: 正式機 (當然,如果能不碰就不碰 XD)

理所當然,自動化必須對於不同的環境進行不同的設定。過去在 ASP.NET Web Application 專案,我們可以透過 Solution 與 Web.config 的設定在發佈過程中選擇我們想要環境參數,而在 .NET Core 有著些微的改變,本篇將說明:

  1. 如何讀取與使用 appsetting.json
  2. 多環境佈署設定
  3. 環境變數設定方法
  4. 如何於網站上得知目前環境變數

若有說明錯誤或任何建議,請各位先進不吝提出,謝謝!


 

如何讀取 appsetting.json

在 Net Core 專案開發,已經有一種萬物皆注入(DI)的概念出現,過去直接使用 ConfigurationSettings 取得 web.config 內 appsetting 參數有所不同。參數寫入 appsetting.json 後,你必須要撰寫一個 DTO 對應內部參數後,在 startup.cs的內註冊。
UploadConfig.cs:

namespace Aft.Project.Infra.Config
{
    public class UploadConfig
    {
        public string Id { get; set; }
        public string Path { get; set; }
    }
}

startup.cs

public void ConfigureServices(IServiceCollection services)
{
    // Get appsetting
    services.Configure<UploadConfig>(Configuration.GetSection("UploadSetting"));
    
    //以下程式碼略
}

隨後若您需要使用:即可注入取得資料。
UploadController.cs

namespace Aft.Project.Web.Controllers.Web
{
    public class UploadController : Controller
    {
        private UploadConfig _uploadConfig;

        public UploadController(IOptions<UploadConfig> uploadConfig)
        {
            _uploadConfig = uploadConfig.Value;
        }
        
        //以下程式碼略
    }
}

'

 

多環境佈署設定

首先,我們依據環境設定增加我們的appsetting.json檔案(會自動縮合)
1.appsetting.json
appsetting.dev.json
appsetting.qa.json
appsetting.staging.json
appsetting.production.json
http://ithelp.ithome.com.tw/upload/images/20161207/200914941O7uZufoNw.png

2.startup
在 startup.cs 內加入下列程式碼。透過{Enviroment}參數可以讀入所有的appsetting.json

var builder = new ConfigurationBuilder()
    .SetBasePath(env.ContentRootPath)
    .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
    .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
    .AddEnvironmentVariables();

http://ithelp.ithome.com.tw/upload/images/20161207/20091494K6LkJSU0Lq.png
有別於過去 publish 給予指令確定是發佈哪一個環境的web.config(取代或新增),在 Net Core publish過程中選擇使用哪一個 appsetting.json 是依據作業系統環境變數(Enviroment Variable)。你可以輸出所有的 appsetting.json 去對應不同伺服器不同的環境變數設定。若環境變數沒有設定或者對應不到,在眾多的appsetting.json 檔案中,程式會自動選擇最後一個 appsetting.json 使用。

'

3.project.json(輸出內容格式)
與上一章節提到相同,記得將你的appsetting.xxx.json寫入到project.json的 publishopt參數內;否則就像我第一次做 publish 一樣,永遠找不到 appsetting.xxx.json 。
http://ithelp.ithome.com.tw/upload/images/20161207/20091494YipyvLBMAF.png

 

 

環境變數設定

當我們使用 dotnet publish 指令後 並放上伺服器
對於吃環境變數這件事情,雖然提升了安全性,但對於沒有這麼多主機/虛擬機可以使用的情況下,對於建構環境的工作人員是一個難題。還好在 IIS 上可以對於不同的 site 設定不同的 .NET CORE 環境變數。下面會對於各種環境設定環境變數進行說明:

windows 環境變數設定 (set environment variable on windows)

Step.1 開始 -> 右鍵點選我的電腦 -> 內容 -> 進階系統設定
https://4.bp.blogspot.com/-CteREsiuQEg/V7-3wzHMc1I/AAAAAAAAcOU/tdHAobu91pIflD2YlO710zIyAS7OmBLnQCLcB/s1600/001.png

Step.2 在進階頁籤 -> 環境變數 -> 加入 -> 輸入:
變數名稱:ASPNETCORE_ENVIRONMENT
變數值:Development
https://2.bp.blogspot.com/--UhsUdpYTys/V7-3w4ZJG8I/AAAAAAAAcOQ/orOE_iuC-jsWStdPnyN-TJOPEWF5ON1OACLcB/s1600/002.png

 

 

IIS 內環境變數設定 (set environment variable on iis)

Step.1 展開站台,點選網站 -> 選擇設定編輯器
https://1.bp.blogspot.com/-vd4AoSN-Kd4/V7_BAsiPHFI/AAAAAAAAcOk/ZpW1pVgj27cZmgJAWDyIObodaXO49_ONgCLcB/s1600/003.png

Step.2 從下拉選單(section)選擇 "system.webServer" -> "aspNetCore"
https://1.bp.blogspot.com/-2-pSnX9QybA/V7_BBFg6n3I/AAAAAAAAcOw/AN3h9el_WcoIFT32Z3zU8jeCngn4w9vVACLcB/s1600/004.png

Step.3 從下拉選單(from)選擇 project.web.config,點選 environmentVariables
https://3.bp.blogspot.com/-rOakM12FARo/V7_BBKB29OI/AAAAAAAAcO0/rGEkSd2IFdkC87iyWj017P7M85DBGy81QCLcB/s1600/005.png

Step.4 點選加入,輸入
變數名稱:ASPNETCORE_ENVIRONMENT
變數值:Development
https://4.bp.blogspot.com/-2OgbolcqLzY/V7_BBQHvPRI/AAAAAAAAcO4/FlPQykEwuQw2Sb9_xbMlDXxRc7h3YUIDgCLcB/s1600/006.png

Step.5 從下拉選單(from)選擇 ApplicationHost.config...,點選 environmentVariables
https://2.bp.blogspot.com/-xWEN_84crH8/V7_BBsAKqZI/AAAAAAAAcO8/6pNPggjoGaQ1_d4SG5TBWVC_DY5it-zpQCLcB/s1600/007.png

Step.6 點選加入,輸入
變數名稱:ASPNETCORE_ENVIRONMENT
變數值:Development
https://1.bp.blogspot.com/-4DLVI_2bANg/V7_BBmZUEYI/AAAAAAAAcPA/hOnC1_WJVOMK3EIS2x-PXJdiHJioVNf2gCLcB/s1600/008.png

Step.7 儲存變更
https://4.bp.blogspot.com/-mGewuK4Cgbw/V7_BB1ooHlI/AAAAAAAAcPE/XSvKhUXppoofLSNwiNWiU5Q_2JqBkx-sQCLcB/s1600/009.png

 

 

如何於網站上得知目前環境變數

您可以透過 TagHelpers 來協助得知目前環境

@addTagHelper "*, Microsoft.AspNetCore.Mvc.TagHelpers"
@{
    <environment names="Development">
        <p>Environment: Development</p>
    </environment>
    <environment names="QA">
        <p>Environment: QA</p>
    </environment>
    <environment names="Staging">
        <p>Environment: Staging</p>
    </environment>
    <environment names="Production">
        <p>Environment: Production</p>
    </environment>
}

https://3.bp.blogspot.com/-ltgW7GUkr_M/V7_qmH3AesI/AAAAAAAAcPY/QTgwrRkEKQUCkkT5epsNnrqB_R0zKq1nwCLcB/s1600/003.png

https://3.bp.blogspot.com/-8ETf2RKiIlk/V7_qmOQpROI/AAAAAAAAcPU/UG2GcQiO3xc6OpuOWXN9IbNw4D4c0QBjgCLcB/s1600/004.png

http://ithelp.ithome.com.tw/upload/images/20161208/20091494Ep4jJYmf6p.png

https://3.bp.blogspot.com/-HXg6yPlnj2k/V7_qmjNzERI/AAAAAAAAcPo/YDxAaTLevgoytxGb77IC4ohzV8kSS18gACLcB/s1600/008.png


上一篇:Net Core 基本指令與整合TeamCity
下一篇:Gulp 介紹與安裝
返回目錄


參考資料

.NET Documentation: https://docs.microsoft.com/zh-tw/dotnet/

註:本系列文章將於2016 IT邦幫忙鐵人賽進行同時,一併發佈於個人blogger與dotblog。