Azure DevOps是微軟在DevOps領域的一個平臺服務,
性質上與市面上其他DevOps的平臺相近,
提供VCS、CI、CD及Artifacts等功能。
近日在協助公司導入Azure DevOps Server(地端版)時,
在建置Pipelines/Build(CI)流程Nuget Restore Task時,
有些內部套件需要從Artifacts Feeds拉取,
而因為有跨組織專案共享內部套件的需求,
花了些時間才搞懂這些東西如何設定,
趕緊趁著還沒忘記之前記錄一下。
前言
一般軟體公司在團隊專案數量越來越大時,
經常會針對許多內部共用服務而開發自用套件(.dll, .nupkg),
除減少重工外亦能提供團隊在部分功能上實作的一致性。
而當跨團隊的專案需要共用某些內部套件時,
在Visual Studio套件來源(Nuget Package Source)指定共享資料夾是個不錯的選擇,
除能解決跨團隊專案時共享套件的安裝及還原外,
亦算是一個輕便的管理方式(資料夾嘛)。
而另一種方式就是本次的主題 - Artifacts Feeds。
Artifacts Feeds
Artifacts Feeds可當作多種套件來源,
除了可整合公有的套件服務(upstream source,如Nuget、npm、PYPI、Maven),
也可使用官方提供的Nuget CLI Tool上傳內部套件,
可作為開發及CI建置流程中的套件來源。
而Feeds的存取範圍預設分為Project-scoped與Organization-scoped兩種,
而這兩者皆可被同一個Organization內的專案存取。
那如何讓B組織內的專案也能共享A組織專案的Feeds來源呢?
在預設中組織內的專案沒有權限存取其他組織的Feeds,
若您的組織是使用AAD(Azure Active Directory)來管理組織成員,
在Artifacts -> Feed settings -> Views中調整存取權限後,
即可共享跨組織的Feeding Source。
而因為筆者是公司內部自架的地端版Azure DevOps Server,
且組織管理上整合了公司既有的AD服務,
這時候就必須要另外動點手腳了。
首先請在B組織的專案內新增一個nuget.config,
存放目錄建議與.sln、.csproj相同。
nuget.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<clear />
<!-- 加入Azure Artifacts feed -->
<add key="org-a-feed" value="https://pkgs.dev.azure.com/robersonliou/_packaging/org-a-feed/nuget/v3/index.json" />
<!-- 加入公開的NuGet Gallery -->
<add key="nuget.org" value="https://www.nuget.org/api/v2/" />
</packageSources>
</configuration>
接著請使用Azure DevOps的組織管理員身分登入,
並在右上方圖像中點選UserSettings -> Personal Access Token,
接著新增一組token作為跨組織共享用,
為了存取安全上的考量我們將Packaging權限設定為Read。
好了之後會看到一組雜湊過的token,
請記得先將它複製下來,
否則就只能重新產生了。
最後到組織B中的Pipelines -> Build,
選擇編輯您目前建置的CI腳本(若無則新增一個),
點選左方Nuget restore選項後,
在右方的設定視窗中找到Feeds and authentication,
接著修改為Feeds in my Nuget.config並設定剛才新增的nuget.config路徑。
最後在下方的Credentials加入剛才新增的user token,
並填入A組織中提供套件來源的feeds url。
請注意user token是有時效性的(30天),
所以在token過期時則必須重新產製。
如果使用IAC的YAML腳本設定Build流程,
則可在restore task中調整相關設定,
但就必須要在Project Settings中自行加入Service Connection。
azure-pipelines.yml
- task: NuGetCommand@2
inputs:
command: restore
includeNuGetOrg: false
restoreSolution: '$(solution)'
nugetConfigPath: 'BuildDemoWeb2/nuget.config'
externalFeedCredentials: 'org-a-feed-service'
feedsToUse: config
補充
以上實作內容雖然也可在Azure DevOps雲端版使用,
但因為在雲端版中必須將Project設定為public,
建議還是使用加入AAD組織權限成員的方式來設定跨組織共享Feed。
結語
筆者個人認為Azure DevOps Server地端版是個很棒的DevOps工具,
除了基本的功能都安裝完成就有了之外,
也可從Azure DevOps Marketplace中選擇套件進行擴充,
以上內容若有錯誤歡迎指正,
參考
https://docs.microsoft.com/en-us/azure/devops/artifacts/concepts/upstream-sources?view=azure-devops
https://docs.microsoft.com/zh-tw/nuget/consume-packages/install-use-packages-nuget-cli
https://docs.microsoft.com/en-us/azure/devops/pipelines/packages/nuget-restore?view=azure-devops
https://docs.microsoft.com/en-us/azure/devops/artifacts/concepts/views?view=azure-devops