VSTS使用Package Management擴充架設有權限功能的私有NuGet Server
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。
加入「New feed」
取得 NuGet package source Url:
權限設置:
這裡與 NeGet Server 不同,我們可以依功能、群組、專案等等來新增多組 Feed 進行組態,而我們上傳的元件可以與其中的 Feed 來產生關連性,這點與 NuGet Server 的單一 Source Url 不太一樣。
整合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 設置
-
NuGet restore
- Path to solution or packages.config
- **\*.sln
- Path to NuGet.config
- **\**\*.config
如果專案中除了 nuget.config 還有其他 .config 檔案,Path to NuGet.config 的地方也可以直接按「...」進行選擇。
-
Build solution
-
Test Assemblies
可以沒有測試專案,可以省略。
-
Publish symbols path
-
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)
-
Copy Files to
- Source Folder
- $(build.sourcesdirectory)
- Contents
- **
- Target Folder
- $(build.artifactstagingdirectory)
-
Publish Artifact
- Path to Publish
- $(build.artifactstagingdirectory)
- Artifact Name
- drop
- Artifact Type
- Server
在 build step 中,有一些 Path 的地方,請依照你專案結構自行調整。例如,一方案多專案,那麼直接透過「...」選擇是比較快且不容易出錯。
Release Management (CD)
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 當中。
登入你 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
沒有留言:
張貼留言
感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。