Consumir Azure #Artifacts en dotnet restore al hacer #Docker Build

Javier Torrecilla
Jtorrecilla .NET
Published in
2 min readApr 10, 2019

Este es un post que se va a saltar un poco mi idea de crear una serie de artículos en los que voy a hablar de Docker, Kubernetes y más cosas, pero mientras preparo dichos artículos (que escribiré en castellano e ingles), os voy a contar un problema que me he encontrado hoy.

Situación

Estoy montando un proyecto utilizando una arquitectura basada en Microservicios.

Tengo una estructura muy sencilla de Web Apis con .NET Core con sus DockerFile asociados, y estoy definiendo los procesos de CI dentro de Azure Devops.

Dentro de la empresa trabajamos con Azure Artifacts donde tenemos ciertos paquetes que compartimos entre diversos proyectos, y como no podía ser de otra manera mi API utiliza un nuget de este feed privado.

Os pongo el DockerFile Inicial y el AzurePipeline.yml

Si hacemos un docker build del fichero de arriba (desde nuestro entorno y en nuestro pipeline de CI) obtendremos un error ya que no tenemos configurado el feed de Azure Artifacts.

Investigando e investigando encontre varias alternativas:

Solución (1) No funciona bien

La más prometedora y que me parecía más limpia era usar Azure Artifact Credentials.

Para utilizar esta versión:

  1. Modificar nuestro DockerFile para obtener el endpoint de nuestro artifact y un PAT (Personal Access Token) definido en Azure Devops con acceso al Package Management.
  2. Modificar nuestro DockerFile para descargar el sh y ejecutar la configuración básica del Nuget Credential Provider, y definir las variables de entorno: NUGET_CREDENTIALPROVIDER_SESSIONTOKENCACHE_ENABLED y VSS_NUGET_EXTERNAL_FEED_ENDPOINTS. Esta ultima es un json donde usaremos las variables definidas en el punto anterior.
  3. Definir dentro de Azure Devops en la “Librería de Variables” un grupo de variables en el que pondremos la url de nuestro Artifact Feed y nuestro PAT. Y permitiremos que se utilicen en los procesos de Build.
  4. Modificar el fichero yml de definicion de la Build para usar el grupo de variables definido anteriormente, y pasar como parámetros del Docker Build las variables que necesitamos.

Hecho todo esto, no he conseguido que funcione como debería.

Solución (2) It works!

En vista del fracaso de la solución anterior encontré una alternativa menos limpia, pero que funciona bastante bien, y pasa por generar un fichero Nuget.Config al vuelo incrustando valores desde el proceso de Build.

Vamos a ver el DockerFile y el yml de build y vamos explicándolo:

Tenemos 3 variables definidas: ARTIFACTS_ENDPOINT, ACCESS_TOKEN y USER, que vamos a utilizar para configurar nuestras credenciales del Feed de Nuget.

Antes de hacer el dotnet restore, y dentro de la misma ruta del csproj, vamos a ejecutar un comando echo redirigiendolo al fichero Nuget.Config.

Como se puede ver en el ejemplo del Nuget, se hace uso de las variables que hemos definido previamente.

Vamos a ver ahora el fichero de CI:

Permitimos usar las variables de la Librería, igual que en la solución anterior, y pasamos los valores a utilizar en los argumentos.

Si ejecutamos nuestro proceso de build, veremos que tenemos una generación correcta.

--

--

Javier Torrecilla
Jtorrecilla .NET

Geek, Map 2010, MCC 2011, MVP C# 2011/12 Msdn Forum MOD