簡體   English   中英

Azure Devops nuget 工件提要和 docker

[英]Azure Devops nuget artifact feed and docker

有沒有一種好的方法可以為 Devops 創建身份驗證機制,以便能夠訪問工件 NuGet 提要? 我想為我的團隊創建一個基礎鏡像,這樣他們就可以從我們的 Azure Container Registry 中提取一個鏡像,該鏡像可以訪問我們的 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
  • 不適用於自動構建系統

YAML

  1. 運行NuGetAuthenticate任務以將VSS_NUGET_ACCESSTOKEN添加到環境變量( 更多信息
  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)

通過 NuGetAuthenticate 任務生成令牌

Dockerfile

  1. 下載並安裝工件提供程序(更多信息
  2. 接收令牌
  3. 使用提要 url 和 nuget 恢復過程的令牌設置VSS_NUGET_EXTERNAL_FEED_ENDPOINTS環境變量
  4. 復制NuGet.config文件
  5. 運行do.net 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 Container Registry 中提取一個鏡像,該鏡像可以訪問我們的 devops nuget 提要。

您可以在圖像中包含憑據以實現此目的,但出於安全考慮,您最好添加一些額外的步驟或代碼以從圖像外部傳遞憑據。

根據您當前的解決方案,您可以使用系統預定義變量$(System.AccessToken)來獲取 azure devops CICD 管道中的安全令牌。 然后在 docker 構建任務中,將訪問令牌作為參數傳遞給 ARG IT_PAT,

--build-arg IT_PAT=$(System.AccessToken)

除了使用 NuGet 憑證插件,您還可以使用 do.net 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 任務以將憑據添加到配置文件中。 然后將 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 的管道。 您還可以查看容器作業 然后通過設置容器端點使用您的私有容器。 然后您可以直接在管道中使用還原任務。 參見下面的示例,nuget 恢復任務將在您的私有容器中運行,它可以通過為您的 nuget 提要指定屬性vstsFeed直接訪問您的 azure 提要:

當您在管道中指定容器時,代理將首先獲取並啟動容器。 然后,作業的每一步都將在容器內運行。

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'

有關詳細信息,您可以查看 此線程

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM