VSTS使用Package Management擴充架設有權限功能的私有NuGet Server

VSTS使用Package Management擴充架設有權限功能的私有NuGet Server

Package Management

https://www.nuget.org/ 提供套件管理的好處大家都知道,處理相依性、web.config組態管理、套件升降級等等方便性,免費。大量佛心人員提供可重覆使用的元件(輪子),免費(絕大多數)。而自從有了 NuGet Server 之後,架設私有NuGet Server就是一件簡單不過的事。對於要上傳套件至 Nuget Server 也走過一些路,最早是用 NuGet Package Explorer 發行與管理,後來知道了 NuGet Packager 這個好物,可以直接從 Visual Studio 進行發行,超高興的。不過好景不長,大家又開始流行 DevOps,希望往自動化更進一步,所以我們又開始在VSTS上進行 Team Build + Release Management 發行至 Microsoft Azure 上的站台!

非內網 NuGet Server 問題

這裡有個很大的問題 Azure Web Site,預設的 NuGet Server 是個公開的環境,除了上傳套件需要 ApiKey 外,其他瀏覽或下載使用很非常自由的。也就是,在非公司內網環境,你的私有套件可能有一天突然就被下載與看光光了。

以前是無解,現在終於有一個很好的選擇:Visual Studio Team Service - Package Management

Package Management

Package Management 可以說是 VSTS 的 NuGet Server (目前,未來還計畫提供其他如 npm、Maven 等套件支援,所以命名是"套件管理"),與 VSTS 的 Team Build + Release Management 有良好的整合外,它本身是有權限的設計。目前有 Owner、Contributor、Reader 三種權限。除了 VSTS 外,也可以與其他如 Jenkins 進行整合。還有,此功能未來也有可能整合在地端 TFS 裡。

專案中NuGet套件組態

這裡類別庫專案的內容不是重點,重點在一些配置文件上。

nuget.config

新增一個 nuget.config 的 XML 檔案,內容如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <packageSources>
    <!-- remove any machine-wide sources with <clear/> -->
    <clear />
    <!-- add a Team Services feed -->
    <add key="BestFeed" value="https://{your vsts name}.pkgs.visualstudio.com/_packaging/{feed name}/nuget/v3/index.json" />
    <!-- also get packages from the NuGet Gallery -->
    <add key="nuget.org" value="https://www.nuget.org/api/v2/" />
  </packageSources>
  <activePackageSource>
    <add key="All" value="(Aggregate source)" />
  </activePackageSource>
</configuration>  
 

主要是指定你的 Feed Source 路徑讓 NuGet 知道。

Package.nuspec

新增 Package.nuspec 的 XML 檔案,它是要產出 {package name}.nupkg 套件的組態檔,這個檔案可以透過前面提到的 NuGet Package Explorer 來幫忙產生。

<?xml version="1.0"?>
<package >
  <metadata>
    <id>kkbruce.HelloPM</id>
    <version>2016.7.15.1</version>
    <title>Bruce Chen Components</title>
    <authors>BruceChen</authors>
    <owners></owners>
    <description>
      Bruce Chen components.
    </description>
    <releaseNotes>
      假的,哎呀!我眼睛業障重啊!
    </releaseNotes>
    <summary>
      Bruce Chen components.
    </summary>
    <language>en-US</language>
    <projectUrl>https://kkbruce.tw/</projectUrl>
    <iconUrl>https://nuget.org/Content/Images/packageDefaultIcon-50x50.png</iconUrl>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <licenseUrl>https://kkbruce.tw/</licenseUrl>
    <copyright>Copyright  2016</copyright>
    <dependencies>
        <!--<group targetFramework="net40">
          <dependency id="log4net" version="1.2.10" />
        </group>-->
      <!--<dependency id="NLog" version="4.3.4" />-->
    </dependencies>
    <references></references>
    <tags></tags>
  </metadata>
  <files>
    <file src="bin\Release\HelloPM.*" target="lib" />
    <!--<file src="lib\" target="lib" />
    <file src="tools\" target="tools" />
    <file src="content\" target="content" />-->
  </files>
</package>  
 

target="lib"src="..." 要對,預設產出的版號是抓 <version>,也可以在 CI (Team Build) 裡去設置。

Package Management - feeds

先把 Package Management 擴充功能加入 VSTS

  1. 加入「New feed」

    Package Management - New Feed(1)
    Package Management - New Feed(2)
  2. 取得 NuGet package source Url:

    Package Management - New Feed - NuGet package source Url
  3. 權限設置:

    Package Management - New Feed - Permissions

這裡與 NeGet Server 不同,我們可以依功能、群組、專案等等來新增多組 Feed 進行組態,而我們上傳的元件可以與其中的 Feed 來產生關連性,這點與 NuGet Server 的單一 Source Url 不太一樣。

Package Management - New Feed - Packages

整合Team Build 與 Release Management

Package Management 新增元件途徑有使用 NuGet.exe 與整合 CI & CD 服務,Jenkins 不是我的菜,所以只能為大家介紹 VSTS 的 Team Build (CI) 與 Release Management (CD) 整合。另外,NuGet Package Explorer 因為無權限設置功能,目前暫時是無法使用在 Package Management。

Team Build (CI) Step 設置

  1. NuGet restore

    NuGet restore
    Path to solution or packages.config
    **\*.sln
    Path to NuGet.config
    **\**\*.config

    如果專案中除了 nuget.config 還有其他 .config 檔案,Path to NuGet.config 的地方也可以直接按「...」進行選擇。

  2. Build solution

    Build solution
  3. Test Assemblies

    Test Assemblies

    可以沒有測試專案,可以省略。

  4. Publish symbols path

    Publish symbols path
  5. NuGet Packager

    NuGet Packager
    Path to csproj or nuspec file(s) to pack
    **\*.nuspec
    Package Folder
    $(build.sourcesdirectory)
    Automatic package versioning
    這部分看需求,預設依 .nuspec 裡的 version 當版本號,也可以在這裡設置想要的版本號規則。
    Configuration to Package
    $(BuildConfiguration)
  6. Copy Files to

    Copy Files to
    Source Folder
    $(build.sourcesdirectory)
    Contents
    **
    Target Folder
    $(build.artifactstagingdirectory)
  7. Publish Artifact

    Publish Artifact
    Path to Publish
    $(build.artifactstagingdirectory)
    Artifact Name
    drop
    Artifact Type
    Server

在 build step 中,有一些 Path 的地方,請依照你專案結構自行調整。例如,一方案多專案,那麼直接透過「...」選擇是比較快且不容易出錯。

Release Management (CD)

NuGet Publisher

NuGet Publisher
Path/Pattern to nupkg
**\*.nupkg;-:**\packages\**\*.nupkg;-:**\*.symbols.nupkg
Feed type
Internal NuGet Feed
Internal Feed URL
https://{name}.pkgs.visualstudio.com/_packaging/{Feed Name}/nuget/v3/index.json
NuGet Arguments
-ApiKey VSTS

部署成功後,應該就能看到Package Management - feeds小節最後一張圖,元件會與 Feed 連結起來。

測試 Feeds

將 Package Management 取得的 NuGet package source URL 加入到 Visual Studio 的 NuGet Source 當中。

Test Package Management Feed

登入你 VSTS 所用的帳密後,應該就能看到上傳成功的元件。

刪除NuGet Package

如果要刪除 Package Management 上的 NuGet 套件,並不像使用 NuGet Server 去網站資料夾把套件刪除就好,這裡需要一些步驟。

  • 回到 Feed 頁面,有個藍色按鈕「Bundle: NuGet.exe + VSTS Credential Provider」請下載回來並解壓縮。
  • nuget.exe 是讓你下 nuget 指令。
  • CredentialProvider.VSS.exe 是執行身分驗證。
  • 指令:nuget.exe delete {your_package_id} {version} -Source {NuGet v2 package source URL} -ApiKey VSTS

注意:刪除 -Source 指定的路徑是 v2,不是 v3 的,在「First, pick your」切換至 v2 取得。

你可以依 Feed 頁面的 nuget 指令去上傳、安裝套件。

小結

使用 VSTS Package Management 你可以得到一個含有權限的 NuGet Server,Feed 的設置可以把套件分群分組,並且與 CI & CD 服務整合後,順暢度相當的好。更重要的是解決了公開網路上可能的安全性問題。

參考:Overview of Visual Studio Team Services Package Management

沒有留言:

張貼留言

感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。