Voici un tutoriel complet intégrant l'ensemble des étapes suivantes, le tout en utilisant .NET 8 :

Chaque section ci-dessous détaille les tâches de développement et fournit le code nécessaire.


1. Déploiement du dépôt NuGet local avec BaGet (Docker Compose)

Tâches

Fichier docker-compose.yml (Méthode B – réseau Docker personnalisé)

version: "3.8"

services:
  nuget:
    image: loic-sharma/baget:latest
    container_name: nuget-server
    ports:
      - "80:80"        # Publication du port 80 de la machine hôte
    volumes:
      - ./baget-data:/var/baget/data
    networks:
      nuget-net:
        ipv4_address: 1.1.1.1

networks:
  nuget-net:
    driver: bridge
    ipam:
      config:
        - subnet: "1.1.1.0/24"

Remarque :


2. Création d’un projet consommateur (.NET 8) sous VSCode

Tâches

Création du projet

Dans VSCode, dans le terminal, exécutez :

dotnet new console -f net8.0

Cela génère par exemple un fichier Program.cs et un projet (ex. MyConsoleApp.csproj).

Fichier NuGet.config

À la racine du projet, créez le fichier suivant :

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <packageSources>
    <!-- Dépôt NuGet local BaGet -->
    <add key="LocalNuGet" value="http://1.1.1.1/v3/index.json" />
    <!-- Source officielle (optionnel) -->
    <add key="NuGet.org" value="https://api.nuget.org/v3/index.json" />
  </packageSources>
</configuration>

Ajout d’un package

Exemple : Pour ajouter un package existant (ex. Newtonsoft.Json), lancez :

dotnet add package Newtonsoft.Json

La commande met à jour le fichier .csproj avec la référence suivante :

<ItemGroup>
  <PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
</ItemGroup>

Vous pouvez également ajouter un package publié dans votre dépôt local (ex. MyLocalLibrary) en indiquant la source si besoin :

dotnet add package MyLocalLibrary --version 1.0.0 --source http://1.1.1.1/v3/index.json

3. Publication d’un package NuGet depuis une bibliothèque (.NET 8) sous VSCode

Tâches

Création du projet de bibliothèque

Dans VSCode, exécutez :

dotnet new classlib -n MyLibrary -f net8.0

Configuration du fichier MyLibrary.csproj

Modifiez-le pour y ajouter les métadonnées nécessaires :

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <!-- Génération automatique du package lors du build (optionnel) -->
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
    <!-- Métadonnées du package -->
    <PackageId>MyLibrary</PackageId>
    <Version>1.0.0</Version>
    <Authors>VotreNom</Authors>
    <Description>Ma première bibliothèque NuGet publiée via .NET 8.</Description>
    <PackageLicenseExpression>MIT</PackageLicenseExpression>
    <RepositoryUrl>https://votre.repo.git</RepositoryUrl>
  </PropertyGroup>
</Project>

Génération du package

Positionnez-vous dans le dossier du projet et lancez :

cd MyLibrary
dotnet pack -c Release -o ./nupkg

Le package MyLibrary.1.0.0.nupkg sera généré dans le dossier ./nupkg.

Publication du package sur BaGet

Utilisez la commande suivante pour publier :

dotnet nuget push ./nupkg/MyLibrary.1.0.0.nupkg --source http://1.1.1.1/v3/index.json --skip-duplicate --api-key anyvalue

Remarque :
L’option --api-key est requise par la CLI, même si BaGet n’impose pas une authentification stricte par défaut.


4. Intégration CI/CD avec Jenkins en utilisant un conteneur Docker (.NET 8)

Tâches

Exemple de Jenkinsfile

Créez un fichier nommé Jenkinsfile et insérez-y le contenu suivant :

pipeline {
    agent {
        docker {
            image 'mcr.microsoft.com/dotnet/sdk:8.0'
            // Optionnel : ajuster les permissions si nécessaire
            args '-u root:root'
        }
    }
    
    environment {
        // URL du dépôt NuGet local
        NUGET_SOURCE = "http://1.1.1.1/v3/index.json"
        // Valeur arbitraire pour l'API key (à sécuriser en production)
        NUGET_API_KEY = "anyvalue"
    }
    
    stages {
        stage('Checkout') {
            steps {
                // Commande générique pour récupérer le code source
                checkout scm
            }
        }
        
        stage('Restore') {
            steps {
                sh 'dotnet restore'
            }
        }
        
        stage('Build') {
            steps {
                sh 'dotnet build -c Release'
            }
        }
        
        stage('Pack') {
            steps {
                // Packager la bibliothèque ; le fichier .csproj doit contenir les métadonnées
                sh 'dotnet pack -c Release -o ./nupkg'
            }
        }
        
        stage('Publish') {
            steps {
                // Publication du package sur le dépôt NuGet local
                sh 'dotnet nuget push ./nupkg/*.nupkg --source $NUGET_SOURCE --skip-duplicate --api-key $NUGET_API_KEY'
            }
        }
    }
    
    post {
        success {
            echo 'Pipeline CI/CD terminée avec succès.'
        }
        failure {
            echo 'Échec de la pipeline CI/CD. Vérifiez les logs pour plus de détails.'
        }
    }
}

Explications :


5. Intégration complète dans l’environnement VSCode et Git

Actions à réaliser dans VSCode

  1. Dépôt NuGet local et docker-compose

    • Créez un dossier (ex. nuget-depot) et ajoutez-y le fichier docker-compose.yml.
    • Dans le terminal intégré, lancez :
      docker-compose up -d
      
    • Vérifiez l’accessibilité du service via un navigateur en accédant à http://1.1.1.1.
  2. Projet consommateur et publication

    • Créez votre projet consommateur et/ou votre projet de bibliothèque (en .NET 8) comme détaillé ci-dessus.
    • Ajoutez le fichier NuGet.config à la racine du projet pour pointer vers le dépôt local.
    • Testez l’ajout et l’utilisation de packages dans votre code.
  3. Publication et CI/CD

    • Intégrez le Jenkinsfile dans votre projet.
    • Utilisez Git pour versionner et pousser vos modifications (commande générique) :
      git add .
      
      git commit -m "Ajout du Jenkinsfile et configuration .NET 8"
      
      git push
      
    • Configurez Jenkins pour surveiller votre dépôt Git (via webhook ou polling) et déclencher la pipeline lors d’un push.

Ressources et références