Azure Pipelines – Agent privatif compatible .NET Core 3.0

Azure Pipelines – Agent privatif compatible .NET Core 3.0

Dans un précédent article, j’indiquais la marche à suivre pour déployer dans une infrastructure, un agent VSTS/Azure Pipelines Dockerizé afin de générer et déployer des projets .NET Core.

L’image Docker utilisée et le repo Github associé n’est plus maintenu par Microsoft. Je présente dans cet article la marche à suivre pour en recréer une par vous-même, incluant le SDK .NET Core 3.0.

Depuis le 23 sept 2019, la version 3.0 de .NET Core est disponible et j’en profite pour convertir un projet ASP.NET Core v2.2 existant, vers cette nouvelle release. Mes builds et déploiements étant gérés par un agent VSTS privé dans mon infra, je vais chercher la nouvelle image sur le Hub Docker et ce que je redoutais se vérifie : les images ne sont pas à jour. Elles sont toujours destinées à du .NET Core 2.2 et on été compilées la dernières fois en janvier 2019. La dénomination est même restée VSTS contre Azure Pipelines désormais.

Par rebond sur le Github du projet, celui-ci est tout simplement en statut Deprecated.

Une courte recherche m’indique que les images sont désormais générées pour une utilisation directement dans des VM Azure et que le côté ‘Agent Azure Pipelines Docker’ n’est plus proposé.

L’équipe .NET chez Microsoft reste tout de même sur sa lancée d’ouverture au monde OpenSource et nous indique la marche à suivre pour recompiler sois-même des images Azure Pipelines de base pour Docker. Ce que l’on met dedans par la suite est notre problème.

Je vais donc en profiter pour faire une image complète équivalente à la ubuntu-16.04-docker-18.06.1-ce-standard. Pour les plus pressés, je vous invite directement à aller à la fin de l’article pour faire un pull de l’image que j’ai publié sur le hub Docker.

Création d’un agent AZP de base

La démarche est assez simple, créer un dossier de travail, y déposer le script Dockerfile de base ainsi que le fichier start.sh qui permettra à l’image de télécharger et installer l’agent AZP lors du premier démarrage.

$ mkdir ~/dockeragent
$ cd ~/dockeragent
$ nano Dockerfile
FROM ubuntu:16.04

# To make it easier for build and release pipelines to run apt-get,
# configure apt to not require confirmation (assume the -y argument by default)
ENV DEBIAN_FRONTEND=noninteractive
RUN echo "APT::Get::Assume-Yes \"true\";" > /etc/apt/apt.conf.d/90assumeyes

RUN apt-get update \
&& apt-get install -y --no-install-recommends \
        ca-certificates \
        curl \
        jq \
        git \
        iputils-ping \
        libcurl3 \
        libicu55 \
        libunwind8 \
        netcat

WORKDIR /azp

COPY ./start.sh .
RUN chmod +x start.sh

CMD ["./start.sh"]

Je ne copie pas le script start.sh qui est bien plus imposant et que l’on ne va pas modifier de toute façon.

En éxecutant l’instruction $ docker build -t dockeragent:latest ., notre image sera créée mais ne comportera quasiment aucun des outils nécessaires utiles dans un agent de build.

Personnalisation de l’image

C’est ici que la personnalisation commence. Comme je l’indiquais plus haut, c’est un tag particulier des images générées par Microsoft par le passé, qui m’intéresse. Celle-ci comprends entre autre :

  • SQL Server command-line tools tools
  • Dotnet Core 2.2 SDK
  • Dotnet Core 3.0 SDK
  • Docker 18.06.1-ce
  • Docker compose 1.22.0
  • curl, zip, git, wget, apt-utils, dnsutils, file, ftp, iproute2, openssh-client, rsync, telnet, time, unzip, …

Dans ce cas, il suffit simplement d’ajouter les commandes d’installation dans le fichier Dockerfile en prenant soin de garder le lancement du script start.sh comme dernière instruction.

Le résultat est le suivant :

FROM ubuntu:16.04

# To make it easier for build and release pipelines to run apt-get,
# configure apt to not require confirmation (assume the -y argument by default)
ENV DEBIAN_FRONTEND=noninteractive
RUN echo "APT::Get::Assume-Yes \"true\";" > /etc/apt/apt.conf.d/90assumeyes

RUN apt-get update \
&& apt-get install -y --no-install-recommends \
        ca-certificates \
        curl \
        jq \
        git \
        iputils-ping \
        libcurl3 \
        libicu55 \
        libunwind8 \
        netcat \
	wget \
	apt-utils \
        dnsutils \
	file \
	ftp \
	iproute2 \
	locales \
	openssh-client \
	rsync\
	shellcheck \
	sudo \
	telnet \
	time \
	unzip \
	wget \
	zip \
	tzdata \
	apt-transport-https \
	&& rm -rf /var/lib/apt/lists/*

# Setup the locale
ENV LANG en_US.UTF-8
ENV LC_ALL $LANG
RUN locale-gen $LANG \
 && update-locale

# Accept EULA - needed for certain Microsoft packages like SQL Server Client Tools
ENV ACCEPT_EULA=Y

# Install essential build tools
RUN apt-get update \
 && apt-get install -y --no-install-recommends \
    build-essential \
 && rm -rf /var/lib/apt/lists/*

#SQL Server command-line tools tools on Ubuntu 16.04

RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - \
	&& curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list | tee /etc/apt/sources.list.d/msprod.list \
	&& apt-get update \
	&& apt-get install mssql-tools unixodbc-dev \
	&& rm -rf /var/lib/apt/lists/* \
	&& rm -rf /etc/apt/sources.list.d/* \
	|| echo -n

ENV PATH=$PATH:/opt/mssql-tools/bin

#Register Microsoft key and feed

RUN wget -q https://packages.microsoft.com/config/ubuntu/16.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
RUN dpkg -i packages-microsoft-prod.deb

#Install the .NET SDK

RUN apt-get update
RUN apt-get install dotnet-sdk-2.2 \
	dotnet-sdk-3.0 \
	&& rm -rf /var/lib/apt/lists/*

#Install Docker
ENV DOCKER_CHANNEL stable
ENV DOCKER_VERSION 18.06.1-ce

RUN set -ex \
 && curl -fL "https://download.docker.com/linux/static/${DOCKER_CHANNEL}/`uname -m`/docker-${DOCKER_VERSION}.tgz" -o docker.tgz \
 && tar --extract --file docker.tgz --strip-components 1 --directory /usr/local/bin \
 && rm docker.tgz \
 && docker -v

ENV DOCKER_COMPOSE_VERSION 1.22.0

RUN set -x \
 && curl -fSL "https://github.com/docker/compose/releases/download/$DOCKER_COMPOSE_VERSION/docker-compose-`uname -s`-`uname -m`" -o /usr/local/bin/docker-compose \
 && chmod +x /usr/local/bin/docker-compose \
 && docker-compose -v

# Clean system
RUN apt-get clean \
 && rm -rf /var/lib/apt/lists/* \
 && rm -rf /etc/apt/sources.list.d/*

COPY start.sh /start.sh

RUN chmod +x /start.sh

ENTRYPOINT ["/start.sh"]

Vous noterez que j’utilise l’instruction ENTRYPOINT plutôt que CMD en dernière ligne car le fichier start.sh devrait être sinon obligatoire localement au déploiement de l’image sur le serveur.

Mon image est prête localement, plus qu’un push pour la mettre à disposition et le tour est joué !

Comme vous l’aurez compris, cette manière de procéder apporte une personnalisation totale quant aux besoin que vous aurez. Pour rappel, l’image de Microsoft dont je me servais jusqu’alors pesait près de 10Go. J’ai enlevé, ou plutôt, je n’ai pas inclus une quantité d’outils et de produit tels que MySQL, PHP 7 et bien d’autres dont je n’ai pas l’utilité au travers de Azure DevOps pour arriver à une image de seulement 2,4Go.

Pull de l’image

Vous pouvez utiliser dès à présent cette image depuis https://hub.docker.com/r/wizzapi/azpdockeragent ou directement par un simple :

$ docker pull wizzapi/azpdockeragent

N’hésitez-pas si vous avez des questions ou suggestion –> https://twitter.com/wizzapi

Laisser un commentaire