[Azure DevOps]如何跨Organization共享Artifacts Feeds

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-scopedOrganization-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/feeds?view=azure-devops#public-feeds

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