Azure DevOps 自動打包和發佈 NuGet 套件到 Artifacts

  • 495
  • 0

身為使用微軟解決方案的開發者,一定都會使用到 NuGet 套件,不管是官方或是非官方的,一定多少都會使用到。然後在實務上一定會有需求會要建立私人的 NuGet 提供庫,比如說公司內部共用的類別庫,這些很多都牽扯到商業邏輯,不可能直接發佈到官方公開的 NuGet 上,這時候就可以使用 Azure DevOps 內的 Artifacts 來管理和提供套件,既然都已經使用到 Azure DevOps 了,那當然也希望可以自動打包並部署到 Artifacts,不然得在每次 commit 之後還得自己執行指令來打包和推送套件上去,這樣太花時間了,本文就針對 .NET Core 來說明如何設定自動化和使用 Artifacts 取得套件。

前言

身為使用微軟解決方案的開發者,一定都會使用到 NuGet 套件,不管是官方或是非官方的,一定多少都會使用到。然後在實務上一定會有需求會要建立私人的 NuGet 提供庫,比如說公司內部共用的類別庫,這些很多都牽扯到商業邏輯,不可能直接發佈到官方公開的 NuGet 上,這時候就可以使用 Azure DevOps 內的 Artifacts 來管理和提供套件,既然都已經使用到 Azure DevOps 了,那當然也希望可以自動打包並部署到 Artifacts,不然得在每次 commit 之後還得自己執行指令來打包和推送套件上去,這樣太花時間了,本文就針對 .NET Core 來說明如何設定自動化和使用 Artifacts 取得套件。

實做

首先先建立一個 .NET Core 類別庫並且推送到 Azure DevOps 的 Repository 內。

而範例的程式碼就簡單的寫個 Hello World 吧!

namespace AnYunNuGet
{
    public class AnYunLib
    {
        public void HelloWorld()
        {
            Console.WriteLine("Hello World!");
        }
    }
}

接下來在 Artifacts 裡面新增第一個 Feed

輸入名稱和設定好權限,這之後會影響到可以使用套件的帳號。

到這邊就完成初始的準備了,接下來就是開始設定 Azure Pipeline 來自動化部署。點選到 Pipelines 來新增 Pipeline。

點選下方的 Use the classic editor to create a pipeline without YAML. 來使用視覺化的編輯器編輯。

選擇剛剛上傳的 Repository,這邊因為只有 master 分支,所以選擇 master,實務上如果有其它分支,比如說 release ,就可以選擇這一個分支,之後在分支有異動的時候就會觸發這一個 Pipeline 來自動化部署。

接下來選擇樣版,這邊直接用空的樣版來一個一個步驟新增吧!

選完之後可以得到這樣的內容,就按照自己專案類型來設定了。

之後依序新增 4 個 .NET Core,並且按順序設定命令。

完整產出的 YAML 如下

# Agent Queue 'Azure Pipelines' was used with unrecognized Agent Specification, vmImage property must be specified to determine image - https://docs.microsoft.com/en-us/azure/devops/pipelines/agents/hosted?view=azure-devops&tabs=yaml#software
trigger:
  branches:
    include:
    - refs/heads/master
jobs:
- job: Job_1
  displayName: Agent job 1
  pool:
    name: Azure Pipelines
  steps:
  - checkout: self
  - task: DotNetCoreCLI@2
    displayName: dotnet restore
    inputs:
      command: restore
      projects: '**/AnYunNuGet/*.csproj'
  - task: DotNetCoreCLI@2
    displayName: dotnet build
    inputs:
      projects: '**/AnYunNuGet/*.csproj'
  - task: DotNetCoreCLI@2
    displayName: dotnet pack
    inputs:
      command: pack
      searchPatternPack: AnYunNuGet/AnYunNuGet.sln
  - task: DotNetCoreCLI@2
    displayName: dotnet push
    inputs:
      command: push
      feedPublish: 
...

再來切換到 Triggers 分頁設定持續開啟 CI,這樣之後有 commit 就會自動觸發 Pipeline 了。

接下來就存檔並執行來測試看看是否正確。這邊要注意的點是因為我專案選擇 .NET 6,所以 Agent 需要選擇 windows 2022 才可以正確的編譯 .NET 6。

等執行完成之後應該就可以看到綠色的打勾符號,也可以點選 Job 進去看所有步驟執行狀態,如果有錯誤的話也可以去看錯誤訊息來 Debug。

接下來到 Artifacts 檢查是否有正確的發佈上去,的確有如預期的發佈上去了。

再來測試看看是否可以正常觸發 CI,更改版號之後 commit。

這邊要注意如果沒有更改版號,部署到 Artifacts 會因為版號相同而產生衝突。

commit 有正確觸發 Pipeline 執行。

Artifacts 的套件版本號也的確更新了。

最後就是如何連接並下載套件了,點選 Connect to feed。

選擇要用來連接的方式,這邊我用 Virtual Studio,可以從 Source 取得連接的網址。

到 Virtual Studio 新增套件來源,並輸入前面取得的套件網址。

可以正確看到並取得套件了。

簡單新增一個 .NET 6 的 Console 程式來測試套件。

結論

本文章是針對 .NET Core 之後的版本當作範例,因為微軟在設計的時候已經有針對 NuGet 打包和部署做好相對應的 Pipelines 的 Task,所以可以很輕鬆的完成自動化打包和部署的工作,如果是 .NET Framework 則要選擇 NuGet 這一個 Task 來做設定,在設定上會稍微不同。

另外就是版本號問題,必須要注意更新,不然會產生衝突的錯誤,設計上是不會因為版本號相同而覆蓋過去,所以要特別注意。之後有機會常試看看會再補充用變數的方式來達到自動編號的方式。

參考資料