iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 5
0
DevOps

從.Net工程師的角度來看DevOps - 到底能夠幫助什麼系列 第 5

[iThome第8屆鐵人賽 05]準備建制專案環境的Task

  • 分享至 

  • xImage
  •  

在上篇對於psake有些瞭解以後,我們開始把所學的東西用於如何搭配方便建制專案。

在這篇,我們會定義當專案建制的時候,我們的資料夾結構和先把那些資料夾環境準備好

同步發表於我的部落格:http://blog.alantsai.net/2016/12/devopsSeries-buildDirectoryTask.html (部落格的格式會漂亮一些,ithome不支援html好不方便)

建制結果的資料夾結構

當我們專案開始建制的時候,要有地方能夠放置一些暫存檔案和最終編譯結果,我們將會使用以下結構:

build結構

  • .build - 是最上層的部分,目前習慣好像.開頭的資料夾都是暫時性的內容,例如visual studio的設定。所以我們會一樣的概念來儲存我們的建制結果
  • temp - 當建制完成的時候,結果會儲存在這個temp裡面
  • testResult - 這個是儲存我們測試執行完成的結果
  • testCoverage - 這個用來儲存我們測試的範圍度
  • artifact - 這邊儲存的是最後的結果。例如,zip出來的發佈內容,或者nuget package

準備Init task

parameter

要準備這個建制結果的資料夾,我們會增加一個task專門做這個事情。

不過我們要先有個位置記錄.build的位置 - 這樣未來如果要改位置非常的方便

由於我們的.build位置會需要在properties動態在設定,因此沒有辦法直接使用properties的參數 - 在psake裡面還有一個叫做parameter的參數適合做這個事情。

parameter 和 properties的差異在於,properties的順序在parameter後面,換句話說,在properties裡面可以取得到parameter的值。
所以我們的build.ps1會變成:

....
Invoke-psake -buildFile .\default.ps1 -taskList Test `
  -parameters @{
  "solutionFile" = (Get-ChildItem("..\*.sln")).FullName |
   Sort-Object $_ | select -Last 1
  }`
  -properties @{
  "testMsg"="測試訊息"
  }

在default.ps1會增加一個Init的task,同時properties裡面就會有用到這個參數:

Properties{
...
 $solutionDirectory = (Get-Item $solutionFile).DirectoryName
 $buildDirectory = "$solutionDirectory\.build"
}  
 
task Init -depends Clean -description "初始化建制所需要的設定"{
  
 Write-Host "建立建制結果的資料夾 $buildDirectory"
 New-Item $buildDirectory -ItemType Directory | Out-Null
}
 
task Compile -depends Clean, Init -description "編譯程式碼" { 
 Write-Host $compileMsg
}

上面我們用了parameter的solutionFile來建制我們的.build資料夾同solution檔案層級

然後我們增加一個init的task來建立最上層的資料夾,並且把init作為compile的dependency

建制資料夾的邏輯區分開來
接下來我們就在properties裡面持續增加我們其他幾個資料夾路徑的參數,然後一個一個建立出來

Properties{
...
 $solutionDirectory = (Get-Item $solutionFile).DirectoryName
 $buildDirectory = "$solutionDirectory\.build"
 $buildTempDirectory = "$buildDirectory\temp"
 $buildTestResultDirectory = "$buildDirectory\testResult"
 $buildTestCoverageDirectory = "$buildDirectory\testCoverage"
 $buildArtifactDirectory = "$buildDirectory\artifact"
}
 
task Init -depends Clean -description "初始化建制所需要的設定"{
 Write-Host "建立建制結果的資料夾 $buildDirectory"
 New-Item $buildDirectory -ItemType Directory | Out-Null
 
 Write-Host "建立建制結果裡面的Temp資料夾 $buildTempDirectory"
 New-Item $buildTempDirectory -ItemType Directory | Out-Null
 
 Write-Host "建立建制結果裡面的TestResult資料夾 $buildTestResultDirectory"
 New-Item $buildTestResultDirectory -ItemType Directory | Out-Null
 
 Write-Host "建立建制結果裡面的TestCoverage資料夾 $buildTestCoverageDirectory"
 New-Item $buildTestCoverageDirectory -ItemType Directory | Out-Null
 
 Write-Host "建立建制結果裡面的Artifact資料夾 $buildArtifactDirectory"
 New-Item $buildArtifactDirectory -ItemType Directory | Out-Null
}

這邊會發現,雖然建制都沒有什麼問題,但是Init這個task變的有點長。同程式一樣,我們可以把同樣類型的功能放到一個方法一樣,我們可以用一樣概念來重構我們的內容。

function InitDirectory{
 Write-Host "建立建制結果的資料夾 $buildDirectory"
 New-Item $buildDirectory -ItemType Directory | Out-Null
 
 Write-Host "建立建制結果裡面的Temp資料夾 $buildTempDirectory"
 New-Item $buildTempDirectory -ItemType Directory | Out-Null
 
 Write-Host "建立建制結果裡面的TestResult資料夾 $buildTestResultDirectory"
 New-Item $buildTestResultDirectory -ItemType Directory | Out-Null
 
 Write-Host "建立建制結果裡面的TestCoverage資料夾 $buildTestCoverageDirectory"
 New-Item $buildTestCoverageDirectory -ItemType Directory | Out-Null
 
 Write-Host "建立建制結果裡面的Artifact資料夾 $buildArtifactDirectory"
 New-Item $buildArtifactDirectory -ItemType Directory | Out-Null
}
 
task Init -depends Clean -description "初始化建制所需要的設定"{
 InitDirectory
}

這個時候我們的Init方法又變的很乾淨了。

Clean Task 調整

到目前為止,在建立build使用的資料夾完成了,不過這個時候會發現,第二次執行的時候,資料夾已經存在了,所以會執行不了

所以在clean的task裡面,我們要針對這個部分吧上次結果給清理掉

task Clean -description "刪除上次編譯遺留下來的內容"{ 
 
 if(Test-Path $buildDirectory){
  Write-Host "清除上次編譯的結果 $buildDirectory"
  Remove-Item $buildDirectory -Recurse -Force
 }
 
 Write-Host $cleanMsg
}

可以看到我們先測試一下這個資料夾有沒有存在,如果有存在,我們就把這個資料夾下面所有內容都刪掉

結語

在這篇我們瞭解到了,怎麼實際開始定義Task並且用作於之後我們build會儲存的位置。

這個準備好了之後,下面我們就實際開始做build的動作


上一篇
[iThome第8屆鐵人賽 04]開始瞭解如何使用psake
下一篇
[iThome第8屆鐵人賽 06]開始建制一個Asp .Net Mvc專案
系列文
從.Net工程師的角度來看DevOps - 到底能夠幫助什麼7
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
superpucy
iT邦新手 3 級 ‧ 2016-12-06 00:55:35

/images/emoticon/emoticon31.gif

Alan Tsai iT邦新手 2 級 ‧ 2016-12-06 07:25:42 檢舉

哎呀,這麼晚睡覺對身體不好偶

我要留言

立即登入留言