【问题标题】:Azure Devops nuget artifact feed and dockerAzure Devops nuget 工件源和 docker
【发布时间】:2020-07-29 17:01:57
【问题描述】:

有没有一种好方法可以为 Devops 创建身份验证机制,以便能够访问工件 NuGet 提要?我想为我的团队创建一个基础镜像,允许他们从我们的 Azure 容器注册表中提取一个可以访问我们的 devops nuget 提要的镜像。理想情况下,人们不必在每个从主机构建系统中获取 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
  • 每个构建文件中的库存代码
  • 每个用户都使用 PAT 配置其环境变量
  • 在每次构建时传递 PAT
  • 不适用于自动构建系统

【问题讨论】:

  • 嗨,您有机会查看以下解决方法吗?效果如何?
  • 还没有,抱歉。转到另一个问题,但我会在下周尝试回到这个问题

标签: azure docker azure-devops nuget dockerfile


【解决方案1】:

YAML

  1. 运行NuGetAuthenticate 任务以将VSS_NUGET_ACCESSTOKEN 添加到环境变量(more info)
  2. 将令牌作为参数传递给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)

Dockerfile

  1. 下载并安装工件提供程序 (more info)
  2. 接收令牌
  3. 为 nuget 恢复过程设置 VSS_NUGET_EXTERNAL_FEED_ENDPOINTS 环境变量和 feed url 和令牌
  4. 复制NuGet.config文件
  5. 运行dotnet restore
FROM 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 

【讨论】:

  • 不要忘记在工件库中为构建 docker 容器的构建代理赋予读者角色 - 特别是如果工件库处于组织级别或在不同的项目中。希望这可以为某人节省几个小时的调试时间!
  • 我在这里遇到的一个问题是,当使用经典的 Azure DevOps 构建管道时,在 Docker 任务“构建映像”中,在构建参数中我必须传递 FEED_ACCESSTOKEN=$(VSS_NUGET_ACCESSTOKEN) 而不是从 YAML 复制的 --build-arg FEED_ACCESSTOKEN=$(VSS_NUGET_ACCESSTOKEN) .
【解决方案2】:

我想为我的团队创建一个基础映像,让他们可以从我们的 Azure 容器注册表中提取一个可以访问我们的 devops nuget 提要的映像。

您可以在图像中包含凭据以实现此目的,但出于安全考虑,您最好添加一些额外的步骤或代码以从图像外部传递凭据。

根据您当前的解决方案,您可以使用 system predefined variable $(System.AccessToken) 在 azure devops CICD 管道中获取安全令牌。然后在 docker build 任务中,将访问令牌作为参数传递给 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

另一种解决方法是将 nuget.config 包含在构建上下文中。但是您需要先包含一个没有凭据的 nuget.config 文件,然后再添加一个额外的 nuget task 以将凭据添加到配置文件中。然后将 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

复制docker文件中的nuget.config,还原完成后不要忘记删除nuget.config文件:

COPY *.csproj .
COPY ./nuget.config .
RUN dotnet restore
RUN rm nuget.config

如果您使用的是基于 Yaml 的管道。您也可以查看container jobs。然后你通过设置container endpoints 来使用你的私有容器。然后您可以直接使用管道中的还原任务。请参见下面的示例,nuget restore 任务将在您的私有容器中运行,它可以通过为您的 nuget feed 指定属性 vstsFeed 直接访问您的 azure feed:

当您在管道中指定容器时,代理将首先获取并启动容器。然后,作业的每一步都将在容器内运行。

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'

欲了解更多信息,您可以查看this thread

【讨论】:

  • 我最初考虑过建立这样的系统(使用 CICD 访问令牌),但由于暴露了敏感数据而将其驳回。我想在私人 ACR 中没关系。不过,PAT 可能很快就会过时,是吗?
  • 是的,此令牌有效期为 48 小时,请参阅this thread
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-06
  • 1970-01-01
  • 2021-02-17
  • 1970-01-01
  • 2022-11-24
相关资源
最近更新 更多