以下是使用 Gitlab CI/CD 來自動部屬 Nuget Package 的教學
示範專案 / 環境
TargetFramework:.NET 6
專案類型:Library 類別庫專案
專案格式:SDK 樣式
Gitlab Runner:windows
指令建置 Nuget 套件方式
要進行 Nuget Package 發布之前,先來講解一下如何使用指令建立套件 ~
當前使用指令建立 Nuget 套件的方式有以下 3 種:
使用 MSBuild 建立 NuGet 套件 | Microsoft Learn
使用 nuget.exe CLI 建立 NuGet 套件 | Microsoft Learn
使用 dotnet CLI 建立 NuGet 套件 | Microsoft Learn
要使用上述哪一種建立方式,取決於是怎樣的專案格式,請參考 識別專案格式 | Microsoft Learn
這裡我使用的是 SDK 格式的 .NET 6 範例專案,所以以下將以 dotnet CLI 的建立方式說明
設置專案套件屬性
在上一篇 使用 NuGet Package Explorer 發布 Nuget Package 教學 的手動部屬教學上,是示範另外用其他工具去編輯專案套件的屬性,但是如果使用 CI/CD 自動部屬的話,就必須要在用指令建置套件的時候能夠自動將屬性附加上去。
在 .net framework 中,套件的屬性是設置在 AssemblyInfo.cs,但是在 .NET Core 已經將設置移回 csproj 了,所以必須在 csproj 設置以下屬性:
<PropertyGroup>
....
<!--Nuget Package Info-->
<PackageVersion>1.9.9.9</PackageVersion>
<Version>1.9.9.9</Version>
<Authors>Kitty.Chen</Authors>
<PackageId>KittyDemoClassLibrary</PackageId>
<Company>Kitty Company</Company>
<PackageProjectUrl>https://gitlab.com/kittyteam/kcdemoproject</PackageProjectUrl>
<PackageTags>KittyDemoClassLibrary</PackageTags>
<Description>This is kitty's package for teaching demonstrations.</Description>
<Copyright>Copyright (C) kitty.chen 2022</Copyright>
</PropertyGroup>
這裡的內容跟上一篇的設置沒有多大差異,可以拿上一篇來比對一下
要設置哪些屬性名稱可參考官方指定的 套件撰寫最佳做法 | Microsoft Learn 中的屬性名稱
不過我在實際使用時,發現一個小坑….
雖然官方指定屬性是 <PackageVersion>
,但是我發現如果只設這個,dll 在 windows 檔案內容顯示的 Version 吃不到
要指定 <version>
才能在 windows 檔案內容成功顯示版本,並且 Nuget 也吃的到
所以理論上只設置 <version>
就可以了,如果 <PackageVersion>
<version>
都設,Nuget 則會以 <PackageVersion>
為主
另外要提到一些會影響 dotnet pack 的 csproj 屬性
如果你選擇使用 dotnet pack 指令作業,執行 dotnet pack 的時候他預設會先自動幫你執行 dotnet build
但是如果在 csproj 有添加 <GeneratePackageOnBuild>
屬性的話(<GeneratePackageOnBuild>
是 建置時自動產生套件 的設置),他會導致 pack 時自動 build 的功能失效,如果想寫 dotnet pack 不想再加 dotnet build 的話就刪掉此設置 ⬇
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
dotnet pack 指令詳情可參考官方說明 dotnet pack 命令 - .NET CLI | Microsoft Learn
<GeneratePackageOnBuild>
的相關說明可以參考 使用 dotnet CLI 建立及發佈 NuGet 套件 | Microsoft Learn
dotnet CLI 建立 Nuget 套件
當你專案屬性都設置完後,即可開始生成 Nuget 包
可以先在 local 下指令測試看看
dotnet pack
如要指定組態可添加 -c
dotnet pack -c Release
沒異常的話即可看到他顯示 已成功建立封裝 xxx.nupkg
套件屬性如果都有設置成功,即可看到他生成的 .nupkg 檔名也會包含你制定的 Version
可以用上一篇文章提過的 NuGet Package Explorer 工具打開這個 .nupkg 檔檢查一下
即可看到剛剛在 csproj 設置的內容,如果沒看到就代表剛剛沒設置成功
dotnet CLI 發布 Nuget 套件
將 Library 上傳至 Nuget Server 的指令
dotnet nuget push E:\WorkProject\NETProjects\My\KittyDemoClassLibrary\KittyDemoClassLibrary\bin\Release\KC.KittyDemoClassLibrary.1.9.9.9.nupkg --api-key 21236522-1248-48C5-A5B3-88D6F123F333 --source http://192.168.7.123:1234/nuget
--api-key
:Nuget Server 的 Publish Key
--source
:Nuget Server
這樣就可以成功發布了
設置 gitlab-ci.yml
前面已經把打包 & 發布的指令搞清楚了,接著只要將這些指令添加至 gitlab-ci.yml 即可
Deploy Job
variables:
PublishSource: 'http://192.168.7.123:1234/nuget'
PublishKey: '21236522-1248-48C5-A5B3-88D6F123F333'
NUPKG_PATH: '$CI_PROJECT_DIR\bin\Release\*.nupkg'
stages:
- deploy
deploy-job:
stage: deploy
tags:
- windows_git_runner
script:
- echo 'Publish Nuget package...'
- dotnet pack -c Release
- dotnet nuget push $env:NUPKG_PATH --api-key $env:PublishKey --source $env:PublishSource
- echo 'Package published successfully.'
其中我將 nupkg 的檔名設成萬用字元,讓他可以辨識 & 取得各版本的 nupkg file
Job 執行順利
End