Déploiement automatisé sur IIS via GitLab Runner et scripts PowerShell

Architecture de déploiement pour environnements Windows

L'automatisation des déploiements sous Windows avec GitLab Runner nécessite une approche structurée pour garantir la maintenabilité. Plutôt que d'écrire des commadnes complexes directement dans le fichier .gitlab-ci.yml, l'utilisation de scripts PowerShell externes permet de centraliser la logique de déploiement. Cette méthode offre l'avantage de pouvoir mettre à jour le processus de livraison sans modifier les dépôts de code source individuellement.

Le workflow repose sur deux scripts principaux : un script d'orchestration exécuté par le Runner et un script de configurasion exécuté sur le serveur IIS cible via SSH.

1. Script d'orchestration (Exécuté sur le Runner GitLab)

Ce script prépare l'environnement distant et synchronise les fichiers compilés. Il utilise SSH pour déclencher la configuration IIS et SCP pour le transfert des données.

param (
    [Parameter(Mandatory=$true)] [string]$PrivateSshKey,
    [Parameter(Mandatory=$true)] [string]$LocalArtifactsDir,
    [Parameter(Mandatory=$true)] [string]$SshUser,
    [Parameter(Mandatory=$true)] [string]$TargetServer,
    [Parameter(Mandatory=$true)] [string]$RemoteRootPath,
    [Parameter(Mandatory=$true)] [string]$IisSiteName,
    [Parameter(Mandatory=$true)] [string]$IisAppPool,
    [Parameter(Mandatory=$true)] [string]$ApplicationName,
    [Parameter(Mandatory=$true)] [string]$BuildVersion
)

# Forcer l'encodage UTF-8 pour la console
$OutputEncoding = [System.Text.Encoding]::UTF8
chcp 65001 | Out-Null

# Nettoyage du format de version pour les chemins de dossiers
$SanitizedVersion = $BuildVersion -replace '\.', '_'

# Préparation des paramètres pour l'appel distant
$RemoteScript = "C:\Scripts\Provision-IIS-App.ps1"
$ExecArgs = "-IisSite '$IisSiteName' -AppPool '$IisAppPool' -AppName '$ApplicationName' -VersionTag '$SanitizedVersion'"

# Construction de la commande SSH pour configurer IIS avant le transfert
$SshParams = "-i `"$PrivateSshKey`" -o StrictHostKeyChecking=no $SshUser@$TargetServer"
$RemoteCommand = "powershell.exe -ExecutionPolicy RemoteSigned -File `"$RemoteScript`" $ExecArgs"

Write-Host "--- Initialisation de la configuration IIS à distance ---"
ssh {0} "{1}" -f $SshParams $RemoteCommand

if ($LASTEXITCODE -ne 0) {
    Write-Error "La configuration distante a échoué avec le code $LASTEXITCODE"
    exit $LASTEXITCODE
}

# Transfert des fichiers via SCP
$DestinationPath = "C:\$RemoteRootPath\$ApplicationName\$SanitizedVersion"
Write-Host "--- Transfert des fichiers vers $DestinationPath ---"
scp -i $PrivateSshKey -o StrictHostKeyChecking=no -r "${LocalArtifactsDir}\*" "${SshUser}@${TargetServer}:$DestinationPath"

exit $LASTEXITCODE

2. Script de configuration IIS (Exécuté sur le serveur Web)

Ce script réside sur le serveur de destination. Il s'assure que l'arborescence des dossiers existe et crée ou met à jour l'application au sein d'IIS.

param(
    [Parameter(Mandatory=$true)] [string]$IisSite,
    [Parameter(Mandatory=$true)] [string]$AppPool,
    [Parameter(Mandatory=$true)] [string]$AppName,
    [Parameter(Mandatory=$true)] [string]$VersionTag
)

# Encodage pour supporter les caractères spéciaux
chcp 65001 | Out-Null

$PhysicalTargetDir = "C:\inetpub\apps\$AppName\$VersionTag"

# Création du dossier de destination si inexistant
if (-not (Test-Path $PhysicalTargetDir)) {
    New-Item -Path $PhysicalTargetDir -ItemType Directory -Force | Out-Null
}

# Chargement du module WebAdministration
if (!(Get-Module -ListAvailable WebAdministration)) {
    Write-Error "Le module IIS WebAdministration est requis sur le serveur."
    exit 1
}
Import-Module WebAdministration

# Vérification de l'existence du pool d'applications
if (-not (Test-Path "IIS:\AppPools\$AppPool")) {
    Write-Error "Le pool d'applications '$AppPool' est introuvable."
    exit 1
}

# Vérification de l'existence du site Web parent
if (-not (Test-Path "IIS:\Sites\$IisSite")) {
    Write-Error "Le site IIS '$IisSite' est introuvable."
    exit 1
}

# Création ou mise à jour de l'application IIS
Write-Host "Déploiement de l'application : $AppName sur le site : $IisSite"
try {
    # Utilisation de -Force pour reconfigurer si l'application existe déjà
    New-WebApplication -Name $AppName -Site $IisSite -ApplicationPool $AppPool -PhysicalPath $PhysicalTargetDir -Force
    Write-Host "Application IIS configurée avec succès sur $PhysicalTargetDir"
}
catch {
    Write-Error "Erreur lors de la création de l'application IIS : $_"
    exit 1
}

exit 0

Cette approche modulaire permet une gestion fine des versions de l'application sur le serveur de destination. Chaque déploiement crée un nouveau répertoire basé sur la version (ou le hash du commit), ce qui facilite les retours en arrière (rollback) en cas de défaillance, simplement en faisant pointer l'application IIS vers le dossier précédent.

Étiquettes: GitLab CI IIS PowerShell Windows Server devops

Publié le 31 juillet à 03h21