Existe-t-il de toute façon pour que msiexec fasse écho à stdout au lieu de se connecter à un fichier

8

Dans le cadre d'un pipeline de livraison continue, j'aimerais installer un msi sur une machine donnée. msiexec plus psexec le fait parfaitement, mais il semble que msiexec ne peut se connecter qu'à un fichier et j'en ai besoin pour me connecter à stdout / stderr.

À l'heure actuelle, pour récupérer la sortie dans notre logiciel CI, je vais devoir ajouter une deuxième étape pour faire écho au contenu du journal, ce qui semble un peu inutile.

Est-ce que quelqu'un a déjà fait face à ce problème (et l'a surmonté?)

Merci d'avance pour toute aide ici.

marque

mrmrcoleman
la source
Utilisez la journalisation de fichiers intégrée de msiexec et relisez à partir du disque. Plusieurs processus msiexec.exe peuvent être lancés pendant l'installation, et je pense que vous auriez du mal à rediriger la sortie de chacun d'eux. Vous pouvez voir des processus msiexec.exe générés automatiquement s'exécuter dans différents contextes de sécurité et également pour exécuter des actions personnalisées. Une boîte de vers que je dirais de traiter.
Stein Åsmul

Réponses:

5

J'ai vérifié à nouveau et voici quelques informations mises à jour :

Il est possible de supprimer l'interface graphique MSI et de définir une interface graphique externe implémentée par un tiers. Cette interface graphique externe peut recevoir des messages de msiexec.exe lors de l'installation. Il s'agit principalement d'implémenter une barre de progression personnalisée , mais il semble que vous pouvez également intercepter la plupart des autres messages d'erreur et messages d'état: fonction MsiSetExternalUI .

Le paramètre intéressant est le dwMessageFilter . En le définissant, vous pouvez, par exemple, recevoir uniquement les messages d'erreur qui se produisent lors de l'installation - ou du moins il semblerait. Je suppose que cela peut suffire dans la plupart des cas.

INSTALLUI_HANDLER MsiSetExternalUI(
  _In_  INSTALLUI_HANDLER puiHandler,
  _In_  DWORD dwMessageFilter,
  _In_  LPVOID pvContext
);

Malheureusement, je n'ai pas d'exemple de code pour le moment. Je testerai cela plus tard, une fois que mon système sera correctement configuré. La fonction MsiEnableLog est un appel de fonction connexe qui permettra la journalisation dans un fichier. Mise à jour: voici à quoi ressemble un exemple de SDK fonctionnel .

Au niveau de l'interface de ligne de commande , vous pouvez également définir la journalisation pour vider immédiatement son tampon dans un fichier en ajoutant le ! paramètre:

msiexec.exe /I "IsWiX.msi" /QN /L*V! "C:\msilog.log" 

Cela signifie que le fichier journal est écrit en continu afin qu'aucun tampon de journal ne soit perdu si msiexec.exe se bloque. Le coût est un installateur considérablement plus lent en raison des frais généraux d'E / S.

Stein Åsmul
la source
3

MsiExec peut uniquement se connecter à un fichier, vous devrez donc répéter le contenu de ce fichier après la fin du programme d'installation.

Ansgar Wiechers
la source
1

Je préfère mettre en cache le fichier journal MSI sur le système local en permanence dans un emplacement commun pour chaque installation, puis enregistrer simplement le code de sortie de l'ensemble de l'installation. Si la configuration signale un succès, le fichier journal est assez inintéressant? Juste plus de "bruit"?

En dehors de cela, il existe plusieurs systèmes de livraison de logiciels qui captureront les informations du journal pour une installation MSI et les stocker de manière centralisée. Un exemple est SCCM (Microsofts renommé Systems Management Server - SMS).

Configuration de la journalisation pour tous les fichiers MSI, voir la section "Globalement pour toutes les configurations sur une machine": http://www.installsite.org/pages/en/msifaq/a/1022.htm

Stein Åsmul
la source
0

J'utilise le script powershell suivant. Il nécessite toujours d'écrire le journal dans un fichier, mais il écrit également le contenu en direct sur stdout:

$main_process = Start-Process -FilePath ".\installer.exe" -ArgumentList "/S /V`"/qn /l*! output.log`"" -NoNewWindow -PassThru
$log_process = Start-Process "powershell" "Get-Content -Path output.log -Wait" -NoNewWindow -PassThru
$main_process.WaitForExit()
$log_process.Kill()
exit $main_process.ExitCode
inkychris
la source