avril 2, 2019
Coucou les pipous, au programme un tuto tout naze sur l’excellent Azure DevOps et l’ingénieux Docker !
Pré-requis
Docker CE
un compte Docker hub
Visual Studio 2017 avec l’extension docker
un compte Azure DevOps (VSTS)
Activer les fin de lignes UNIX dans Visual Studio
Les fichiers Dockerfile & docker-compose utilisent les fins de lignes UNIX voici comment les activer (une autre solution consiste à éditer et créer les fichiers dans un autre éditeur tel que Notepad++)
Outils > Personnaliser
Onglet Commande
Dans “Barre de menu” sélectionnez “fichier”
Cliquez “Ajouter une commande”
Categorie “fichier”
Sélectionner “Option d’enregistrement avancées”
Au programme
- Développement d’une application Web basique sur Visual Studio
- Préparation du Dockerfile
- Création du pipeline de Build sur Azure DevOps
Création du site ASP. NET CORE
Dans visual Studio créer un nouveau projet Asp.Net core type Web api ou MVC.
Cocher la case support docker et sélectionner container linux
Le projet généré, est normalement fonctionnel,vous constaterez la présence d’un fichier Dockerfile :
Vérifier que tout fonctionne en lançant le debug.
Du coté Azure DevOps, ce n’est pas aussi simple, tel quel,l’agent de build n’arrivera pas a compiler l’image et vous obtiendrez l’erreur suivante :
COPY failed: stat ***/Docker/publish: no such file or directory /usr/bin/docker failed with return code: 1
Pour résoudre ce problème, il faut un dockerfile un peu différent de celui généré.
Pour ce faire, créez un nouveau dockerfile, appelez le par exemple Dockerfile.CI, il devrait apparaître comme un sous élément de votre docker file existant.Il est basé sur la solution proposé dans la Documentation Docker
FROM mcr.microsoft.com/dotnet/core/sdk:2.1 AS build-env WORKDIR /app # Copy csproj and restore as distinct layers COPY *.csproj ./ RUN dotnet restore # Copy everything else and build COPY . ./ RUN dotnet publish -c Release -o out # Build runtime image FROM mcr.microsoft.com/dotnet/core/aspnet:2.1 WORKDIR /app EXPOSE 80 COPY --from=build-env /app/out . ENTRYPOINT ["dotnet", "tutodemo.dll"]
Pensez à adapter le fichier à votre solution, en particulier l’ ENTRYPOINT ainsi que les ports exposés,etc..
La différence avec l’existant, c’est que la compilation est réalisé dans un conteneur, le résultat est ensuite copié dans l’image docker finale :
- Le runtime .net core
- le code de l’application
Préparation du pipeline de build sur Azure DevOps
Premièrement ajoutez votre solution a un repo vsts de votre choix, committez.
Dans la section build créez une nouvelle définition de build basée sur le template docker container, par défaut la build sera effectué sur l’agent Hosted Ubuntu
Tache Build
Connection à Docker Hub
Dans container registry type selectionnez container registry,
ajouter une connection à docker hub en cliquant sur new, renseigner vos identifiants.
Build Command
Modifier le champs dockerfile pour qu’il pointe vers notre fichier Dockerfile.CI de la sorte : **/Dockerfile.CI
C'est tout pour la build !
Tâche Tag (optionnel)
Cette tâche est optionnel si vous poussez votre image avec un tag existant ou le tag latest Ajoutez une tache entre celle de Build & Push.
Sur cette nouvelle tâche sélectionnez la connexion au hub précédemment créée, puis dans command sélectionnez tag et c’est tout.
Tâche Push
Renseignez la connection au Docker Hub, vous pouvez en suite lancer la build via save & queue.
Si tout se déroule comme prévu, coté vsts vous devriez avoir du vert partout ;) :
Et coté Docker Hub, un nouveau repo et contenant l’image tagué (pour moi avec le numéro de build) :
La suite c’est du classique il suffit de pull & run sur n’importe quel environnement exécutant docker ! FABULOUS !!!
A+ pour d’autres tutos de merde !
Originally published at blogg.codemylife.dev on April 2, 2019.