自動化將專案建置到內部 nuget server

公司內部已架設 nuget server, dll 包版動作都是需要人為建置並手動包成 nupkg 並丟至內部 nuget server,這樣的動作也許可以考慮透過自動化來完成所有的事情

有這樣的需求,主要源自於 dll 的參考並不是以專案參考的形式來引入,而是將建置好的所有 dll 全數往一個地方置放

然而這樣的方式有一個很大的缺點,就是沒有版本的概念

雖然從 dll 裡的版本資訊可以看出,但在退版或是進版的,甚至是 trouble shooting 的時候將會是個難題

自建 nuget server (請見這裡) 雖然能達到版本控制與進退版的問題,但手動發版的行為應當可以朝自動化的方向邁進

nuget 一般較常使用的都是去 nuget server 抓下我們所需要的套件

但它其實提供了相當多的功能 push/delete ...etc 能讓我們可以更自動化的去管理套件

1. 產生 api key, 可以透過網路上別人寫好的 api key generator 
ooxx-5566

2. 在nuget server 設定 api web.config

    <add key="requireApiKey" value="true" />
    <add key="apiKey" value="ooxx-5566" />

3. 下載 nuget.exe,並放至 d:\tools 或是其他你習慣的地方
可至 https://www.nuget.org/downloads 下載

4. 將 nuget.exe 的路徑放入環境變數
在 system enviroment 中,將 d:\tools 加至 Path 的環境變數中

5. 指定內部 nuget server 要用哪個 api key
 nuget setApiKey ooxx-5566 -source http://yourInternalNugetServer/nuget
在 C:\Users\{帳戶名稱}\AppData\Roaming\NuGet\NuGet.Config 可以看到相關的資訊

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <packageSources>
    <add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
    <add key="ooxx.Nuget" value="http://yourInternalNugetServer/nuget" />
  </packageSources>
  ...
  <apikeys>
    ...
    <add key="http://yourInternalNugetServer/nuget" value="xxxxEncreptedMessagexxxxxx" />
  </apikeys>
</configuration>


6. 產出 nupkg
 在 csproj 的目錄下執行 nuget pack, 版號預設將會使用 assembly.cs 裡的 4 碼資訊 (1.0.0.0)

7.發行 nupkg 至 server 
 nuget push YourPorject.1.0.0.0.nupkg -source http://yourInternalNugetServer/nuget -skipDuplicate
 這裡若有重複版號將會 skip,否則舊的版本被蓋掉了,但同版本的新程式又有 bug,到時要退回去就更麻煩了
 
以上的行為是手動透過 api 的方式進行

然而我所希望的則是 
(1) 修正完推上 github,透過 pull request 的方式合至 dev
(2) github merged 後透過 webhook 通知 jenkins
(3) jenkins 執行 powershell (建置, 產出 nupkg, 推送至 nuget server)

考量到如果 workspace 若沒有清除的話, nuget pack 可能會保留著以往所 build 過的所有 nupkg, 所以只取最新的一筆當作發行版本

若該版本已經存存在則忽略

D:\Tools\nuget.exe pack
$packageFile = @(gci *.nupkg | Sort CreationTime -Descending)[0].Name
echo $packageFile
D:\Tools\nuget.exe push $packageFile -source http://yourInternalNugetServer/nuget -skipDuplicate

用 nuget pack 有一個很大的好處

當你的專案有用到第三方套件 (ex: Newton.json 或是 dapper )

只要有用到的都會在相依專案上幫你加上去,甚至會限定最低要使用的版本號為目前你打包的這個版本號

可以避免裝了自行開發的套件後,還要手動去裝其他相依套件

就醬,自動化的進度再往前一步了

 參考
 https://marcus116.blogspot.com/2019/02/nuget-nuget-server.html
 https://www.huanlintalk.com/2014/02/build-and-publish-your-nuget-packages.html
 https://docs.microsoft.com/zh-tw/nuget/reference/cli-reference/cli-ref-setapikey
 https://docs.microsoft.com/zh-tw/nuget/reference/cli-reference/cli-ref-push