[CI/CD] Gitlab CI/CD 自動發布 Nuget Package 教學

以下是使用 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