md5 und sha1 Hash im Jenkins Build generieren
Die Aufgabe
Manchmal braucht man für Dateien einen Hash. Md5 und sha1 werden oft verwendet. Zum Beispiel um einen Download zu verifizieren, oder um dem Virenscanner vorab eine Datei bekannt zu machen. Nach dem Entwickler-Leitsatz: „Wenn du etwas automatisieren kannst: Automatisiere Es!“ gehört eine solche Aufgabe natürlich in den Jenkins Build.
Anforderung war, dass eine Datei mit dem sha1 Hash neben dem erstellten File abgelegt wird. Des Weiteren wollte ich den Hash auch gerne im Buildlog sehen. Mit der Zeit habe ich festgestellt, dass das Buildlog eine der wichtigsten Anlaufstellen ist. Wenn also die Erstellung selbst im Log auftaucht, dann soll auch bitte das Ergebnis ebenfalls drin stehen.
Die Lösung
Nach einer kurzen Internetrecherche hatte ich nichts fertiges für Jenkins gefunden. ich konnte aber ein kommandozeilenbasiertes kostenloses Tool von Microsoft entdecken: File Checksum Integrity Verifier (FCIV) Dieses Tool kann mit wenigen Befehlen schöne Ergebnisse liefern.
Umsetzung
Ich gehe hier mal nur auf die beiden von mir verwendeten Befehle ein. Eine ausführliche Erläuterung erhält man über den obigen Link.
Der Befehl zum Erstellen der Hashes lautet:
fciv -md5 -sha1 "C:\Jenkins\Workspace\TestProjekt\Output" -xml "C:\Jenkins\Workspace\TestProjekt\Output\Hashes.xml" -type *.msi
Das Tool selbst liegt in einem bekannten Pfad und kann so direkt via fciv
aufgerufen werden. -md5
und -sha1
sorgen dafür, dass die jeweiligen Hashes erstellt werden. Die Hashes werden für alle Dateien im angegebene Pfad erstellt und in die mit -xml
eingeleitete Datei geschrieben. „-type *.msi“ grenzt die Erstellung dann auf Dateien mit der Endung „.msi“ ein. Ausgegeben wird dann eine Datei mit folgendem Inhalt:
<?xml version="1.0" encoding="utf-8"?>
<FCIV><FILE_ENTRY><name>
c:\jenkins\workspace\TestProjekt\output\Tradus_13.06.20.1306.msi</name>
<MD5>o6ilOja1uH6jWa61mjdA4Q==</MD5><SHA1>GUtvjw78AkIGIYS0PWebb9JJuy0=</SHA1></FILE_ENTRY>
</FCIV>
Damit ist die erste Anforderung erfüllt. Die XML Ausgabe hat den Vorteil, dass sie gut programmatisch weiter zu verarbeiten ist. Für die zweite Anforderung wäre mir dies aber nicht übersichtlich genug gewesen. Es hätte ja die Möglichkeit gegeben die Hashes.xml einfach via Batch Befehl „type“ ausgeben zu lassen. Die zweite Alternative wäre den obigen Befehl erneut aufzurufen, die XML-Ausgabedatei wegzulassen und das ganze erneut auszuführen. Allerdings widerstrebt mir der Gedanke, einer solchen „Ressourcenverschwendung“ wenn es auch anders geht. Dazu dient der Befehl zur Ausgabe im Log:
fciv -md5 -sha1 -list -xml "C:\Jenkins\Workspace\TestProjekt\Output\Hashes.xml"
-list
sorgt dafür, dass die Werte aus einer Datenbank/Datei angezeigt werden. Auch hier kann man wieder wählen, welche Hashes anzuzeigen sind.
Das Log mit md5 und sha1
C:\Jenkins\Workspace\TestProjekt>fciv -md5 -sha1 "C:\Jenkins\Workspace\TestProjekt\Output" -xml "C:\Jenkins\Workspace\TestProjekt\Output\Hashes.xml" -type *.msi
//
// File Checksum Integrity Verifier version 2.05.
//
Error loading XML document.<br>Create New XML database<br>C:\Jenkins\Workspace\TestProjekt>fciv -md5 -sha1 -list -xml "C:\Jenkins\Workspace\TestProjekt\Output\Hashes.xml"
//
// File Checksum Integrity Verifier version 2.05.
//
Listing entries in database:
----------------------------
MD5 SHA-1
-------------------------------------------------------------------------
a3a8a53a36b5b87ea359aeb59a3740e1 194b6f8f0efc0242062184b43d679b6fd249bb2d c:\jenkins\workspace\TestProjekt\output\TestProjekt_13.06.20.1306.msi
Number of entries found: 1
Fazit
Mit wenig Aufwand kann man das Erstellen von Hashes in den Buildvorgang integrieren. Ein Download und zwei Zeilen als Buildschritt reichen aus, um die Dateiintegrität überprüfbar zu machen. Bei meiner Recherche nach „Jenkins Hash“ war das Top-Ergebnis Jenkins hash function was mich aber erstmal nicht weiterbrachte. Trotzdem nett zu wissen 😉