Erzeugen eines Debian-Packages
OK, wir haben jetzt unsere Anwendung erstellt und können diese Anwendung auf jedem System ausführen, für das wir sie kompiliert haben (um genauer zu sein, System und Architektur).
Allerdings haben *nix-artige Betriebssysteme Einschränkungen bei der Verwendung von Netzwerksockets.
Das Erfordernis von Root-Rechten für Netzwerkoperationen unter Linux und macOS, insbesondere beim Umgang mit Roh-Sockets oder beim Binden an Ports unter 1024, ist eine übliche Einschränkung aufgrund von Sicherheitsrichtlinien.
Soll heißen, wir befinden uns mit ICMP definitiv unter Port 1024.
Und müssten jedes Mal wenn wir das Programm unter Linux oder Mac ausführen wollen, dies mit erweiterten sudo-Rechten tun.
Irgendwie schräg und nicht ganz das, was wir erreichen wollen.
Im folgenden wird gezeigt, wie man mit einfachsten Mitteln ein (für unsere Zwecke ausreichend) Debian-Package (.deb) erstellen kann, in dem alles für die Installation auf einem Debian-Derivat enthalten ist.
Das schließt ein, dass die Anwendung immer an die gleiche Stelle installiert wird, alle erforderlichen Rechte gesetzt werden und bei Versions-Updates die neue Version über die alte Version installiert wird.
Außerdem ist man hierüber in der Lage, nicht mehr benötigte Pakete auf einfache Art und Weise zu deinstallieren.
Wie fangen wir an?
Naja, im vorherigen Schritt haben wir eine Build-Pipeline aufgebaut um die Anwendung zu kompilieren. Jetzt erweitern wir diese Pipeline um einen Deployment-Schritt.
Allerdings werden wir das Deployment in diesem Falle so gestalten, dass das fertige *.deb-Paket als Artefakt in Gitlab abgelegt wird. Wir können allerdings das fertige Paket irgendwo hin releasen und somit für jeden verfügbar machen.
deploy-debian-x64:
stage: deploy
needs:
- build-job-debian-x64
script:
- mkdir -p pingc/usr/local/bin
- mkdir -p pingc/DEBIAN
- cp pingcs/pingcs pingc/usr/local/bin
- cp pingcs/deb/control pingc/DEBIAN
- cp pingcs/deb/postinst pingc/DEBIAN
- chmod +x pingc/DEBIAN/postinst
- dpkg-deb -b pingc
artifacts:
paths:
- pingc.deb
expire_in: 1 week
Was tun wir hier?
Basierend auf dem initialen Basis-Image (ganz oben in der .gitlab-ci.yml),
containerruntimeglobal_x64_bflat:23.04_8.0.1
das auf debian basiert, bauen wir jetzt ein Debian-Package.
Warum Debian, wir könnten doch auch ubuntu verwenden?
Ja, allerdings lassen sich mit ubuntu erstellte .deb Packages bislang nur für ubuntu und deren Derivate verwenden, da hier ein anderer Packer verwendet wird, den debian nicht nativ unterstützt.
Debian erzeugte .deb-Packages funktionieren hingegen sowohl auf Ubuntu- als auch auf Debian-Plattformen.
Das Script erzeugt im Grunde genommen nur die Verzeichnisstruktur für das .deb-Package. Ausgehend vom Verzeichnis pingc, was als Stammverzeichnis für das Package gilt, legen wir hier die Unterverzeichnisse usr/local/bin an.
Warum? Ganz einfach! Bei der Installation mit dpkg wird das was sich im Package unter usr/local/bin befindet, im Zielsystem unter /usr/local/bin kopiert.
In diesem Falle kopieren wir die vorher erzeugte und als tar gespeicherte Executable pingcs in das Verzeichnis pingc/usr/local/bin.
Danach werden noch 2 Steuerdateien in die Verzeichnisstruktur im Verzeichnis DEBIAN installiert.
Die Datei control enthält beispielsweise Informationen zur Version, eine Beschreibung, den Namen der Anwendung. Diese werden bei der Verwendung von dpkg verwendet.
Die Datei postinst ist sehr interessant. Hier können Befehle eingetragen werden, die nach der Installation des Packages durch dpkg ausgeführt werden. In unserem Falle enthält die Datei genau einen Eintrag:
setcap cap_net_raw+ep /usr/local/bin/pingcs
Dieser Befehl ist Teil des Linux-Fähigkeiten (Capabilities) Systems, das eine feingranulare Kontrolle über die Privilegien von Prozessen ermöglicht. Es bietet eine Alternative zur Verwendung von Root-Privilegien für spezifische Aufgaben, indem es erlaubt, bestimmte Privilegien zu Prozessen hinzuzufügen oder zu entfernen, ohne ihnen volle Superuser-Rechte zu gewähren.
Der Befehl setcap cap_net_raw+ep /usr/local/bin/pingcs weist dem pingcs Programm die Fähigkeit zu, Roh-Sockets zu nutzen, was es ihm erlaubt, Ping-Operationen ohne Root-Rechte durchzuführen. Diese Anpassung erhöht die Sicherheit, da sie verhindert, dass das Programm mit den vollen Rechten des Superusers ausgeführt werden muss, was das Risiko von Sicherheitslücken verringern kann.
Die Datei postinst im Verzeichnis DEBIAN muss noch als ausführbar markiert werden, damit sie durch den Prozess dpkg auch ausgeführt werden kann.
Danach verwenden wir das Tool dpkg-deb mit dem Verzeichnis pingc an, um das Debian-Package pingc.deb zu erzeugen.
Dieses Package deployen wir jetzt einfach als Artefakt am Build-Prozess. Denkbar wäre hier jedoch alles mögliche, der Push auf eine Website oder in eine Package-Registry.