寫在前面
大部分一定規模的團隊都有搭建私有nuget的需求;例如:
而我們使用的Azure DevOps
平臺本身就提供了Artifacts
, Artifacts不單隻支援nuget包,還支援Npm、Maven、pip等;
這裡簡單說說nuget的Azure Devops Artifacts的整合;
先建立Artifacts Feed
Feed就是倉庫的集合;也就是nuget、npmjs、pip等倉庫都是一個feed的:
我這裡建立了一個Feed: samm-feed
;
點選“Connect to feed” 可以看到支援的倉庫型別;
接下來我們nuget的怎麼用;
vs新增nuget包源
vs2022為例:工具-》nuget 包管理器-》nuget包源,新增一個Feed:
名稱
samm-feed
Source
https://pkgs.dev.azure.com/jack4it/_packaging/samm-feed/nuget/v3/index.json
Note: 每臺機器都要設定一次
釋出包
Nuget.exe方式
1、先下載nuget.exe並配置到環境變數(直接放c盤windows目錄也行)
https://go.microsoft.com/fwlink/?linkid=2099732
2、建立一個 nuget.config
檔案到 .csproj
or .sln
所在目錄
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<clear />
<add key="samm-feed" value="https://pkgs.dev.azure.com/jack4it/_packaging/samm-feed/nuget/v3/index.json" />
</packageSources>
</configuration>
3、restore包
Run this command in your project directory
nuget restore
4、釋出包
Publish a package by providing the package path, an API Key (any string will do), and the feed URL
nuget.exe push -Source "samm-feed" -ApiKey az Siluzan.Infrastructure.0.0.1.nupkg
5、設定其他人publish許可權
azure feed建立的源其他同事是隻有隻讀許可權的;
需要在feed-setting-》permission這裡加上最少contributor許可權才行;
vs外掛方式
Nupack暫不支援vs2022,待更新
Azure Pipeline 拉取私有倉庫映象
背景
一般專案用了samm-feed私有映象的包後,直接用原來的Pipeline yaml構建會報如下錯:
/src/src/*.Cutapi.WebApi/*.Cutapi.WebApi.csproj : error NU1301: Unable to load the service index for source https://pkgs.dev.azure.com/jack4it/_packaging/samm-feed/nuget/v3/index.json.
1、先獲取private feed的個人令牌
按連結步驟獲取獲取個人令牌
2、新增nuget.config
在解決方案目錄新增檔案nuget.config
,內容:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<packageSources>
<add key="public" value="https://api.nuget.org/v3/index.json" />
<add key="samm-feed" value="https://pkgs.dev.azure.com/jack4it/_packaging/samm-feed/nuget/v3/index.json" />
</packageSources>
</configuration>
3、修改Dockerfile
以net6
為例,其他版本參考本節開頭的檔案解決;
修改基礎映象
#FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
FROM gebiwangshushu/hei-dotnet-sdk6-azurefeed-certprovider AS build #改為這個
RUN dotnet restore
指令改為如下指令:
...
COPY nuget.config .
ARG FEED_USERNAME
ARG FEED_ACCESSTOKEN
ENV VSS_NUGET_EXTERNAL_FEED_ENDPOINTS="{\"endpointCredentials\": [{\"endpoint\":\"https://pkgs.dev.azure.com/jack4it/_packaging/samm-feed/nuget/v3/index.json\", \"username\":\"${FEED_USERNAME}\", \"password\":\"${FEED_ACCESSTOKEN}\"}]}"
RUN echo $VSS_NUGET_EXTERNAL_FEED_ENDPOINTS \
&& dotnet restore "src/Siluzan.Cutapi.WebApi/Siluzan.Cutapi.WebApi.csproj"
...
4、修改Azure DevOps Pipeline
新增個人令牌引數
variables:
- name: azureFeedUsename
value: <個人令牌使用者名稱> eg:wangsiheng@gmail.com
- name: azureFeedToken
value: <步驟1的個人令牌>
映象構建和推送要改為如下邏輯
- task: Docker@2 build
inputs:
containerRegistry: '**.azurecr.cn'
repository: '<你的映象名>'
command: 'build'
Dockerfile: 'src/***/Dockerfile' #你Dockerfile的目錄
buildContext: './'
arguments: '--build-arg FEED_USERNAME=$(azureFeedUsename) --build-arg FEED_ACCESSTOKEN=$(azureFeedToken)'
- task: Docker@2 push
inputs:
containerRegistry: '**.azurecr.cn'
repository: '<你的映象名>'
command: 'push'
總結
azure pipeline 的拉取feed的nuget的問題花了不少時間踩坑,留個記錄;
總體來說使用Azure Artifacts 來做私有倉庫比自己搭建的好用;
收費上的話:
每個訂閱有2G的免費儲存,2G以上部分$2/1G/一個月,更多...
參考
azure pipeline 的拉取feed的nuget的參考文件:https://github.com/dotnet/dotnet-docker/blob/main/documentation/scenarios/nuget-credentials.md
大家遇到問題可參考以上文件解決;