2016年12月25日 星期日

[iThome第8屆鐵人賽 14]程式碼品質 - 介紹篇

我曾經聽過一個笑話,一個人到一家公司面試,面試官問他:「請問你如何保證/保持你的程式碼品質?」

這個年輕人回答:「我...我會在發現bug的時候把問題加班修好」。

其實這個有點悲哀,也說明了為什麼軟體工程師時常需要加班,因為當軟體越寫越複雜的時候,要保持程式的品質是需要一些事情,但是這些事情是什麼?有沒有可能進入到我們日常環境里?

這個就是接下來會介紹的部分,我們如何透過做CI把程式碼品質要做的事情整合進來。


[iThome第8屆鐵人賽 13]執行測試 4 - 重構

在之前幾篇已經介紹完了.Net常見的三種Test Framework(Xunit,Nunit 和 MSTest)整合方式之後,相信會發現到這三個task有很地方是重複邏輯。

這些重複邏輯我們都是用了copy 和 paste 的方式處理了,但是未來如果要維護這個build script,甚至要把它變成一個常用/通用的script,這種方式是非常不好

所以,就像任何好的工程師會做的事情一樣,我們也要重構我們的Script。

這篇將會介紹重構什麼,和如何重構。


[iThome第8屆鐵人賽 12]執行測試 3 - MSTest

在介紹完Xunit和Nunit測試之後,這篇將要來看最後一個常見的測試Framework,Visual Studio內建的MSTest。


[iThome第8屆鐵人賽 11]執行測試 2 - NUnit .Net

在上篇介紹完如何整合Xunit做測試之後,在這篇我們將會看看在.Net世界裡面另外一個常用的測試Framework,NUnit。

2016年12月23日 星期五

[iThome第8屆鐵人賽 10]執行測試 1 - XUnit .Net

經過一段時間的介紹,相信對於使用psake來建制專案已經沒什麼問題了 - 我們就要開始進入建制的下個階段,也就是測試。

專案建制起來只是基本條件,但是單元測試是否有通過才是保證程式碼品質的一種方式,因此,不跑單元測試更本就不完整。

在接下來幾篇,將會介紹幾個常見的unit test的framework,先從xunit開始。


2016年12月20日 星期二

[iThome第8屆鐵人賽 09]建制失敗的處理 - 為什麼失敗了但是build server還是認為成功

在進入下個階段之前(也就是開始執行Unit Test),有個部分一直沒有碰到,那就是當建制失敗的時候會發生什麼事情。

整個CI的概念就是盡早發現建制有問題好去做一些處理,但是如果出錯了都發現不到,不就等於沒有意義了?

這篇我們將會看看這方面的處理。

sample 程式在 github devops-psake sample/chapter9

2016年12月17日 星期六

[iThome第8屆鐵人賽 08]建制結果問題 - 方法2 透過MSBuild的Target

在上篇了解到如果什麼都沒調整的情況下,建制出來的內容會放在一起,根本無法區分哪些內容屬於哪些專案。

也提到了.Ner 4.5能夠使用GenerateProjectSpecificOutputFolder,但是假設是.Net 4.5以下呢?

這篇我們會沿著這個思路,看看為什麼Asp .Net Mvc專案有個_PublishedWebsite,並且我們是否能夠使用這個資訊來做些處理。

sample 程式在 github devops-psake sample/chapter8


[iThome第8屆鐵人賽 07]建制結果問題 - 說明 和 處理方法 1

上篇我們提到了用psake來建制一個asp .net mvc的專案,並且修正了psake執行時候呈現的內容,在這篇,我們將進一步延伸來看一下,buid結束產生的內容是什麼和 加入另外兩種常見的.Net專案:

  1. Console Project
  2. Library Project


sample 程式在 github devops-psake sample/chapter7

2016年12月7日 星期三

[iThome第8屆鐵人賽 06]開始建制一個Asp .Net Mvc專案

經過了幾天的理論介紹,我們開始要進入建制專案的部分。

我們會先拿一個Asp .net Mvc的網站作為第一個要建制的專案,所以我們會先建立出來,然後在使用MSBuild帶來的幫助,幫我們快速建立專案

這次的建制我們都是focus在.net Framework的部分,或許.net core會有所不同,但是概念是一樣。

(之後下面提到的code都可以從這邊看到內容:github repo,這篇會是tag sample/chapter6)


2016年12月3日 星期六

[iThome第8屆鐵人賽 03]CI - VS是如何建制(Build) .Net專案

在上篇了解到說什麼是DevOps之後,我們就開始探討第一個部分,也就是Continous Integration (CI)。

CI最基本的核心就是build專案 - 所以我們需要了解一下到底VS是如何build專案的,只有了解之後我們才能夠把它腳本化,也才有可能自動化。

因此,這篇將會介紹:

  1. VS到底如何建制專案
  2. 什麼是build tool
  3. 為什麼接下來系列會選擇使用psake作為build tool


2016年12月2日 星期五

[iThome第8屆鐵人賽 02]什麼是DevOps?




DevOps到底是一個什麼概念?對於工程師來說指的是什麼?為什麼DevOps最近這麼夯是我們在這篇所要討論的事情。


[iThome第8屆鐵人賽 01]開篇 - 為什麼要寫這個主題

又到了新的一屆鐵人賽,針對這次是否要參賽其實非常的糾結:一方面因為工作的關係,額外的時間越來越少,但是一方面又想把寫日誌的習慣找回來,在這種糾結的心情中,最後,還是想寫戰勝了不想寫。

這已經是第三次參加鐵人賽了,對我來說,每一年的主題都比上一年的更加困難,今年選擇的主題更是我這兩年想做但是一直沒有做的部分,也就是如何在日常生活中把DevOps引進來,並且提升日常工作效率。

同去年一樣,今年很多東西會是邊執行並且邊研究和邊記錄,希望大家能夠在這個系列學習到東西。


2016年5月14日 星期六

建立自己的Library - 使用Nuget Package Explorer (GUI) 建立nuget package (下篇) 建立第一個package

在上一篇建立自己的Library - 使用Nuget Package Explorer (GUI) 建立nuget package (上篇) 介紹package結構介紹了package的結構之後,在這篇我們將來用上篇所了解的結構,來建立一個簡單的package。

首先會建立一個簡單的library project,這個project會建立出等一下建立的package內容。

建立出package之後,接下來會介紹如何在本地測試這個package。

最後,當正式要把package發佈出去,讓外面的人使用,有什麼地方有提供host這些package。


2016年4月14日 星期四

建立自己的Library - 使用Nuget Package Explorer (GUI) 建立nuget package (上篇) 介紹package結構

在上一篇 (何為nuget,該如何使用,和2.7版本之後建議的回覆nuget package(套件)的方式) 介紹如何使用nuget後,應該會發現要在專案裡面使用某個Library實在是很方便,同個Library在不同專案使用只要透過nuget安裝就搞定。

作為開發者,相信大家都有一些小工具或者一些方法是常常被使用到的,而每次不同專案要使用,都需要copy整個程式碼實在很不方便,更別說如果哪天發現有bug ,要更新所有有用到的專案就更加困難和浪費時間。

如果可以把自己的小工具包成一個nuget就超級方便了,而且要更新程式碼也很容易,更棒的是要把nuget放到微軟的nuget.org網站上面是完全免費,不好好利用就太浪費這個服務了。

在這篇,將會介紹如何使用nuget package explorer來先了解package的結構,並且之後在用這些知識來建立自己package。


2016年3月13日 星期日

何為nuget,該如何使用,和2.7版本之後建議的回覆nuget package(套件)的方式

第一次接觸.Net開發的人常常會聽到一個名詞,那就是nuget。而習慣nuget的開發者通常也會常說,“你就用nuget去裝xxx套件就好了”。

可是,常常會忽略掉非.Net開發者其實聽不太懂這個術語。在這篇,我希望能夠可以給新進的.net開發者,能夠瞭解什麽是nuget,爲什麽要用nuget,nuget產生的什麽東西應該進入版控,和最重要的建議回覆nuget package的方式(網路上面很多教學都是舊版本的做法)


2016年3月7日 星期一

如何用config管理多個網站的ssh key和如何不用每一組輸入ssh的Pass Phrase

在上一篇(何謂ssh,在Windows下如何使用ssh,如何在Windows透過ssh下載和上傳程式到github)介紹完了如何用ssh來和github做push和pull,接下來的問題會是:那如果我有多個站台ssh要連到怎麼辦?舉例來說,假設我的bitbucket也要用ssh聯繫,要怎麼做?

另外一個問題是,每一次用ssh連線都要輸入pass phrase,上篇有介紹了ssh-agent來設定。在這篇將會在延伸ssh-agent的介紹,包括如何新增和刪除key的pass phrase,方便管理多個ssh key的pass phrase。

這篇會假設已經有用上篇的方式建立了一個ssh key給github用,而這篇將會在建立一個ssh key給bitbucket用。


2016年3月3日 星期四

[Asp .Net Mvc]http status 400 的JsonResult在正式機器無法取得回傳的Json資料

在之前介紹客制JsonResult的時候([iThome 第七屆鐵人賽 28] Javascript和Mvc溝通 - 概念篇[iThome 第七屆鐵人賽 29] Javascript和Mvc溝通 - 實作篇),其中一個原因是爲了讓回傳的資訊可以利用http裏面的狀態碼(status code)設定為400來表示Json結果是錯誤, 然後前端接到的時候可以直接透過在error事件的function來處理有出錯的邏輯。而不是要在success function裏面透過回傳的json物件來判斷是否有成功。

在實際使用的時候,開發都沒有什麽問題,但是在正式機器的時候出現bug,會導致沒有辦法取得回傳的Json物件內容

這篇將會介紹發生的原因和如何處理。