gre*_*ven 15 azure nuget docker dockerfile azure-devops
有没有一种好方法可以为 DevOps 创建身份验证机制,以便能够访问工件 NuGet 提要?我想为我的团队创建一个基础映像,允许他们从我们的 Azure 容器注册表中提取一个映像,该映像可以访问我们的 devops nuget feed。理想情况下,人们不必在从主机构建系统获取 PAT 的每个项目中都拥有相同的 dockerfile 代码。这也能让我们将 CICD 做得更好一些。
我目前的解决方案
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-env
WORKDIR /app
ARG IT_PAT
ENV VSS_NUGET_EXTERNAL_FEED_ENDPOINTS "{\"endpointCredentials\": [{\"endpoint\": \"https://pkgs.dev.azure.com/MNPIT/_packaging/MNP/nuget/v3/index.json\",\"username\": \"build\",\"password\": \"${IT_PAT}\"}]}"
RUN mkdir -p $HOME/.nuget/plugins
WORKDIR /deps
# Downloads and installs the NuGet credential plugin so we can login to the private NuGet feed
RUN curl https://github.com/microsoft/artifacts-credprovider/releases/download/v0.1.24/Microsoft.NetCore2.NuGet.CredentialProvider.tar.gz -L -o creds.tar.gz -s
RUN tar -xzf creds.tar.gz
RUN cp -r plugins/netcore/ ~/.nuget/plugins
Run Code Online (Sandbox Code Playgroud)
Łuk*_*iec 22
NuGetAuthenticate任务以添加VSS_NUGET_ACCESSTOKEN到环境变量(更多信息)Docker作为参数传递给任务- task: NuGetAuthenticate@0
- task: Docker@2
displayName: 'build docker image'
inputs:
command: build
containerRegistry: 'happycodeacr'
repository: 'hc-app-sample-api-dev'
buildContext: '$(Pipeline.Workspace)/app'
Dockerfile: '$(Pipeline.Workspace)/app/src/HappyCode.Api/Dockerfile'
arguments: '--build-arg FEED_ACCESSTOKEN=$(VSS_NUGET_ACCESSTOKEN)'
tags: |
latest
$(Build.BuildId)
Run Code Online (Sandbox Code Playgroud)
VSS_NUGET_EXTERNAL_FEED_ENDPOINTS环境变量以进行 nuget 恢复过程NuGet.config文件dotnet restoreFROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /work
RUN curl -L https://raw.githubusercontent.com/Microsoft/artifacts-credprovider/master/helpers/installcredprovider.sh | sh
ARG FEED_ACCESSTOKEN
ENV VSS_NUGET_EXTERNAL_FEED_ENDPOINTS \
"{\"endpointCredentials\": [{\"endpoint\":\"https://happycode.pkgs.visualstudio.com/_packaging/hc-nuget-feed/nuget/v3/index.json\", \"password\":\"${FEED_ACCESSTOKEN}\"}]}"
COPY ["NuGet.config", "./"]
COPY ["src/*/*.csproj", "./"]
RUN for projectFile in $(ls *.csproj); \
do \
mkdir -p ${projectFile%.*}/ && mv $projectFile ${projectFile%.*}/; \
done
RUN dotnet restore /work/HappyCode.Api/HappyCode.Api.csproj
# further instructions
Run Code Online (Sandbox Code Playgroud)
Lev*_*SFT 14
我想为我的团队创建一个基础映像,允许他们从我们的 Azure 容器注册表中提取一个映像,该映像可以访问我们的 devops nuget feed。
您可以将凭据包含在图像中来实现此目的,但出于安全考虑,您最好添加一些额外的步骤或代码以从图像外部传递凭据。
根据您当前的解决方案,您可以使用系统预定义变量 $(System.AccessToken)来获取 azure devops CICD 管道中的安全令牌。然后在 docker 构建任务中,将访问令牌传递给 ARG IT_PAT 作为争论,
--build-arg IT_PAT=$(System.AccessToken)
除了使用 NuGet 凭据插件之外,您还可以使用 dotnet cli 将凭据添加到 nuget 源。然后通过$(System.AccessToken)构建争论。见下文:
ARG PAT
COPY . .
RUN dotnet nuget add source "your-source-url" --name "source-name" --username "useless" --password "$PAT" --store-password-in-clear-text
RUN dotnet restore
Run Code Online (Sandbox Code Playgroud)
另一个解决方法是将 nuget.config 包含在构建上下文中。但您需要首先包含一个没有凭据的 nuget.config 文件,然后添加一个额外的nuget 任务以将凭据添加到配置文件中。然后将 nuget.config 复制到 docker 文件中。见下文:
添加要在自定义命令下运行的 nuget 任务,以将凭据添加到 nuget.config 文件。
sources Add -Name "MyPackages" -Source "https://my.pkgs.visualstudio.com/_packaging/MyPackages/nuget/v3/index.json" -username any -password $(System.AccessToken) -ConfigFile Source/Nuget.config -StorePasswordInClearText
Run Code Online (Sandbox Code Playgroud)
复制docker文件中的nuget.config,恢复完成后不要忘记删除nuget.config文件:
COPY *.csproj .
COPY ./nuget.config .
RUN dotnet restore
RUN rm nuget.config
Run Code Online (Sandbox Code Playgroud)
如果您使用基于 Yaml 的管道。您还可以查看容器工作。然后,您可以通过设置容器端点来使用您的私有容器。然后您可以直接使用管道中的恢复任务。请参阅下面的示例,nuget 恢复任务将在您的私有容器中运行,并且它可以通过指定 nuget feed 的属性来直接访问您的 azure feed vstsFeed:
当您在管道中指定容器时,代理将首先获取并启动该容器。然后,作业的每一步都将在容器内运行。
container:
image: myprivate/registry:ubuntu1604
endpoint: private_dockerhub_connection
steps:
- task: NuGetCommand@2
inputs:
command: 'restore'
feedsToUse: 'select'
vstsFeed: 'my-azure-nuget-feed'
restoreSolution: '**/*.sln'
Run Code Online (Sandbox Code Playgroud)
欲了解更多信息,您可以查看此主题。
| 归档时间: |
|
| 查看次数: |
13991 次 |
| 最近记录: |