Ola PessoALL,

Esses dias me deparei com uma situação interessante e que me tomou algumas horas para resolver e vou documentar aqui para ter como referência no futuro e para ajudar outras pessoas.

Em um dos projetos que atuo temos alguns pacotes em um feed privado no Azure Artifacts, quando usamos os pipelines do Azure Devops a autenticação funciona automaticamente, no Visual Studio podemos autenticar com nosso e-mail, em um terminal podemos usar dotnet restore --interactive para autenticar, mas como fazemos quando estamos dentro de um container ou usando outros pipelines como bitbucket ou gitlab?

Azure Artifacts Credential Provider

Felizmente temos um utilitário chamado Azure Artifacts Credential Provider que facilita a aquisição de um token para autenticarmos automaticamente o ambiente e automatizar nosso processo.

Na documentação tem todos os passos para os mais diversos ambientes, aqui no artigo vou focar apenas na construção de um container docker.

O primeiro passo é termos um arquivo nuget.config com o feed que queremos autenticar. Esse arquivo precisa ser copiado para dentro do container.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <packageSources>
    <add key="public" value="https://api.nuget.org/v3/index.json" />
    <add key="customfeed" value="https://fabrikam.pkgs.visualstudio.com/_packaging/MyGreatFeed/nuget/v3/index.json"  />
  </packageSources>
</configuration>

No nosso dockerfile precisamos instalar o Credentials Provider e copiar o arquivo nuget.config para dentro do container.

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /app

# Instala o Credential Provider
RUN curl -L https://raw.githubusercontent.com/Microsoft/artifacts-credprovider/master/helpers/installcredprovider.sh  | sh

# Copy csproj and restore as distinct layers
COPY *.csproj .
# Copia o arquivo nuget.config para dentro do container
COPY ./nuget.config .
# Define um argumento de build para passarmos o token
ARG FEED_ACCESSTOKEN
# O endereço do endpoing precisa ser o mesmo definido no seu nuget.config
ENV VSS_NUGET_EXTERNAL_FEED_ENDPOINTS="{\"endpointCredentials\": [{\"endpoint\":\"https://fabrikam.pkgs.visualstudio.com/_packaging/MyGreatFeed/nuget/v3/index.json\", \"username\":\"docker\", \"password\":\"${FEED_ACCESSTOKEN}\"}]}"
RUN dotnet restore

# Copy and publish app and libraries
COPY . .
RUN dotnet publish -c Release -o out --no-restore


FROM mcr.microsoft.com/dotnet/runtime:5.0 AS runtime
WORKDIR /app/
COPY --from=build /app/out ./
ENTRYPOINT ["dotnet", "dotnetapp.dll"]

Para fazermos o build do nosso container precisaremos passar um argumento chamado FEED_ACCESSTOKEN que é o seu PAT.

Se ainda não tem um PAT ou não sabe como criar um, use o seguinte link para criar: https://docs.microsoft.com/en-us/azure/devops/organizations/accounts/use-personal-access-tokens-to-authenticate?view=azure-devops&tabs=preview-page
# build the container
docker build --build-arg FEED_ACCESSTOKEN=SeuPersonalAccessToken .

Prontinho, agora podemos criar nossos containers tanto na máquina local quanto nos servidores de build.

[]s e até a próxima