建立一個 SCRUM Team:第一週

目標一、定義什麼是完成!

一個SCRUM團隊,必須要有最基本的針對什麼是 PBI (項目:Product Backlog Item) 「完成的定義」

  1. 團隊共識什麼叫做完成
  2. 讓其他人知道完成一個小需求要做的事是很多的,而不是一下就好了
  3. 將完成的目標放入到 Product Backlog
  4. 將他寫在 A3 的紙上,貼在團隊後方,讓每一個來訪的人都可以看到
組織團隊會議,針對問題:『一個需求完成我們必須要做』,提出每個人的意見與整個團隊的共識
  • 開發:
    • 先撰寫單元測試
    • 50% 的程式碼都有單元測試涵蓋
    • 可以正常編譯,並且通過單元測試
    • 程式碼已經被內入到 main master
    • 測試資料庫的 Table Schema 已經被納入到正式資料庫
    • 程式碼有被其他人檢查是否撰寫OK
  • 測試、發佈、運營
    • 有QA測試計畫
    • QA測試計畫被其他人檢視確認正確
    • 在測試環境發佈與測試完成
    • 有撰寫自動UI測試並且通過
    • 少於一到兩個嚴重的BUG
    • 有明確的驗收標準,並且被專案經理審視過
    • 部署計畫有被運營單位確認
    • 正確發佈到正式區

目標二、討論什麼是速度

用 Story Point 分析每個項目的得分,請注意,這裡的分數是代表整個團隊投入需要的工作,並且項目的完成必須要滿足上面的「完成的定義」

作法:將目前手上的項目提出,用之前我們完成項目的經驗,再給定每一個項目分數。每個人可以用以下的分數給分:

接下來,進行討論會議:
1. 提出一個 Story Point = 5 的需求A,描述這個需求A要做哪些工作
2. 在舉範例需求B,描述需求B工作,為什麼比需求A大,再描述需求C與為什麼比需求A小
3. 在拿出目前的工作項目,讓團隊成員每個人決定這個需求分數
4. 請最大跟最小分數的人說明原因
5. 在重複團隊決定分數
直到大家都趨近一個數字即可停止。

解決 EF Core 2.0 當呼叫 Add-Migraion 會出現無法產生的錯誤

EF Core 2.0 執行 Add-Migration 會出現錯誤:

  PM> Add-Migration InitialCreation
Unable to create an object of type 'OrderContext'. Add an implementation of 'IDesignTimeDbContextFactory<OrderContext>' to the project, or see https://go.microsoft.com/fwlink/?linkid=851728 for additional patterns supported at design time.

這是因為 EF Core 2.0 有改變 Tools 的作法,在 Asp.net
core
最佳的解法是:

WebHost.CreateDefaultBuilder(args)

如果是 Console program,可以用 emtpy constructor 的方式:

public class OrderContext : DbContext
{
    public OrderContext() { }
    public OrderContext(DbContextOptions<OrderContext> options) : base(options) { }
    public DbSet<OrderProcess> OrderProcesses { get; set; }
 
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(@"Server=(localdb)\MSSQLLocalDB;Database=Msmtest;Trusted_Connection=True;");
    }
}

重點在於 OnConfiguring 加上指定的 SqlServer connection。一旦產生 Migration 之後,就可以將
empty constructor comment
掉(因為可能會影響程式的正常邏輯)。

獨立使用 serilog in Asp.net Core 2.0

一般而言,我們都使用:將 Serilog 加入到預設的 LOG 中:

loggerFactory.AddSerilog();

但這裡會有一點點麻煩的是 Asp.net Core內建的 Ilogger 會自動記錄系統執行狀況,造成 log 訊息過多,反而不方便分析。

如果只想要將明確指定的LOG記錄在檔案內,不是透過 information 等設定,也不想要內建的複雜訊息,可以透過分開設定 Serilog 透過 Rolling File 記錄我們想要的訊息:

首先,在 Program.cs 中,設定 ConfigureAppConfiguration如下(也可以直接在 Startup.cs 中的 constructor 中設定,但因為這些是屬於基本設定,我們不希望讓 startup 複雜化,因此在這裡就直接設定好)

Log.Logger = new LoggerConfiguration()
    .WriteTo.RollingFile(@"logs\log-{Date}.txt",
        outputTemplate: "{Timestamp:HH:mm:ss} [{SourceContext}][{Level}]{Message}{NewLine}")
    .CreateLogger();

這裡重點在於 Log.Logger 透過用 Serilog 的 Configuration 建立的 Logger 參數,我們設定了許多的訊息表達方式。

其次,在 Startup.cs 中,利用 Singleton 將此 Log.Logger 利用 dependency Injection 提供給需要使用的 class:
services.AddSingleton(Log.Logger);

這裡必須要指定 Serilog.ILogger 否則會跟內建的 ILogger interface 混淆。

同樣的,要使用的 class 也要透過 injection 使用:

public class ContactModel : PageModel
{
    public string Message { get; set; }
 
    private readonly Serilog.ILogger _logger;
 
    public ContactModel(Serilog.ILogger logger)
    {
        _logger = logger.ForContext<ContactModel>();
    }
}

其中,指定 ForContext 會搭配 {SourceContext} 顯示在 log 檔案中。

如果要將內建的 log 訊息寫入到 Serilog 中(或者簡單說用 serilog 取代內建的 Extension.ILogger ),可以用:
1. 引用 nuget package: Serilog.Extensions.Logging
2. 在 Startup.ConfigureServices 中,使用 AddSerilog 方式達成:

Asp.net Core 2.0 用既有的使用者帳密作為驗證機制

主要使用情境為採用企業內部其他的既有網站授權機制(例如簡單的 User Table),裡面包含使用者的資料,往往同仁會希望採用同樣的帳號與密碼就可以登入,而不要再產生新的帳密。在這種情境下,無法使用 Asp.Net 推薦的 Aspnet.Identity 的驗證方式,因為要整個移轉有資料庫方面的問題。

但 Asp.net Core 提供 Cookie Authentication 可以存取既有的資料庫做為驗證的來源。參閱官方說明:Using Cookie Authentication without ASP.NET Core Identity官方設定範例

 

實做參考:Cookie Authentication In ASP.net Core 2.0  主要修改:

public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthentication("CookieAuthenticationScheme")
        .AddCookie("CookieAuthenticationScheme", options =>
        {
            options.AccessDeniedPath = "/Account/Forbidden/";
            options.LoginPath = "/Account/Login/";
            options.ExpireTimeSpan = TimeSpan.FromHours(2);
        });
 
    services.AddMvc();
}

使用 [Authorize] attribute 時候,必須要指定要使用的認證方式,否則不會自動導入到 Login Page

在 Sign In 的時候,可以直接建立一個虛假的 Claim,只需要給名字即可:

private async Task SignInAsync(User user)
{
    var claims = new List<Claim> { new Claim(ClaimTypes.Name, user.Name) };
    var userIdentity = new ClaimsIdentity(claims, "login");
    ClaimsPrincipal principal = new ClaimsPrincipal(userIdentity);
 
    await HttpContext.SignInAsync("CookieAuthenticationScheme", principal);
}

請注意這裡也要使用同樣的字串名稱。

使用 Docker 安裝 SQL Server on Windows

一般而言我們都會直接安裝 SQL Server,但會牽涉到安裝的方式與設定的參數。透過 Docker 可以直接使用微軟原始的設定,並且不需要安裝在 Host machine。當然主要目的還是測試使用,正式環境還是推薦直接安裝。

在安裝之前,建議先安裝 server core image,理由是因為後續可以安裝不同版本的 sql server,但同樣都是架構在 server core 之上,因為 docker 會自動管理磁碟空間,透過 image 是層層疊加的,安裝兩個 images 的空間會被重複利用。

作法如下:

  1. 安裝 server core image

docker pull microsoft/windowsservercore

  1. 安裝 sql server developer edition:

docker run -d -p 1433:1433 -e sa_password=<SA_PASSWORD> -e ACCEPT_EULA=Y microsoft/mssql-server-windows-developer

其中, -d 代表 detach (也就是在背景中執行)、 -p 代表 port number(與外部 host 的 mapping)、 -e  / –env 代表環境變數,這裡使用 ACCEPT_EULA(必須要接受微軟的條款才可以使用),加上 sa_password 代表對應的 sa 密碼

因為在背景執行,必須要透過 logs 檢查是否 SQL Server 正在執行。透過 docker ps 只能看到 windows server instance 而已:

說明實際上是失敗的,因為密碼強度不夠(因前面的設定密碼 = password),因此必須要加入英數字等密碼字母組合:

首先用 stop 停止執行中的 image:

再次執行 run 並指定包含數字與特殊符號的密碼:

這次再使用 docker logs 就可以看到有正確的執行:

接下來就可以透過 SSMS 存取 localhost database (因為 port mapping 的關係,但實際上是不同的IP,可以透過 inspect 檢查):

Linux Container 與 Windows Container 的差異

在 Windows 執行 docker container,主要有兩種方法:

windows Container

只有在 windows 2016 server core 才提供,利用內建的 dockerd 可以直接運行 container,不需要額外的 VM。架構如下:

Linux Container

windows 2016 Server & windows 10 Pro 以上版本都有提供,必須要透過 Hyper-V (參閱安裝 docker for windows) ,主要透過 docker proxy 執行 VM 裡面的 container:

Windows container 最大的優勢是可以在 host machine 上,直接看到 container 的執行序、新增的硬碟空間等,因為他們的底層 Kernel 是一樣的;

相反的 Linux container 的執行序無法被 host 得知,並且也無法直接存取 container 的目錄,因為底層 Kernel 不一樣。

安裝 Docker for Windows

  • 安裝 hyper-v

首先要確定 virtualization 是否啟用:『模擬』要設定為啟用:

        

上圖代表已被停用,因此需要在硬體的 bios 上啟用虛擬化:

  • 啟動 hyper-Vdocker for Windows 使用 hyper-V,如果我們不設定啟用,docker 也會自動協助設定
  • 安裝 Install Docker for Windows

必須要是 windows 10 pro 64 bits,目前主要還是要選擇 edge channel,因為 stable channel 目前不支援 windows container。如果要安裝穩定版本,可以在 Docker 官網下載

  • 安裝完畢後,要等待 docker initialization

完畢後,就會出現 docker Welcome 畫面,代表 Docker 已經啟動成功:

       

我們可以檢查 hyper-v,會出現 linux VM,這是 Docker host 主要的 VM

透過 docker cli 可以查詢 docker info,在此可以看到執行的環境是 linux: