[[Vorlage(Getestet, general)]] [[Vorlage(Fortgeschritten)]] {{{#!vorlage Wissen [:Pakete_installieren: Installation von Programmen] [:Editor: Einen Editor öffnen] }}} [[Inhaltsverzeichnis()]] [[Bild(Wiki/Icons/package.png, 64, left)]] Ein "Personal Package Archive" (PPA; auf deutsch: eigenes Paketarchiv) ist ein Service von [:Launchpad:]. Es bietet die Möglichkeit, Debian-Pakete für unterschiedliche Architekturen (`i386`, `amd64`) und für unterschiedliche Ubuntu-Versionen zu bauen. Diese Pakete können dann entweder als eigene Paketquelle oder als Direktlinks anderen zur Verfügung gestellt werden. Das Kompilieren eines Projekts bzw. der jeweiligen Quelltexte erfolgt weitgehend automatisiert auf den Servern von Canonical. Daher kann man unabhängig von der vorhandenen Ubuntu-Version Debian-Pakete auch für andere Ubuntu-Versionen bauen lassen. Dieser Artikel beschäftigt sich mit den Grundlagen und wie man mit Hilfe eines PPAs Debian-Pakete erstellen kann. Voraussetzung dazu ist jedoch, dass man weiß, wie man ein Debian-Quellpaket (sogenannte source-packages) erstellt. Informationen dazu findet man in Kurzform im Artikel [:Paketbau:] oder ausführlich unter [:Grundlagen_der_Paketerstellung:]. Grundsätzlich wird empfohlen, die Erstellung aus dem Quelltext und die "Debianisierung" erst auf dem eigenen Rechner zu testen, bevor man ein PPA nutzt. Die Installation von Programmen aus einem PPA ist nicht Thema dieses Artikels, dazu siehe [:Paketquellen_freischalten/PPA:]. = PPA einrichten = Um ein PPA einzurichten, muss man folgenden Dinge erledigen: 1. Auf [launchpad:projects/+login:Launchpad] {en} ein Benutzerkonto (Account) unter Angabe einer E-Mail-Adresse registrieren 1. Einen öffentlichen Schlüssel hinterlegen 1. Ein Ubuntero werden 1. PPA aktivieren Die Schritte 1-3 sind ausführlich im Artikel [:Ubuntero:] beschrieben. Bleibt noch der letzte Schritt. == PPA aktivieren == Um ein PPA zu aktivieren, meldet man sich bei Launchpad an, klickt auf ''"Overview"'' und in der linken Spalte unter ''"Actions"'' auf ''"Activate PPA"''. Dort kann man sich die allgemeinen Bedingungen durchlesen, eine Beschreibung zum PPA angeben (die nachträglich jederzeit noch geändert werden kann) und zum Schluss durch Klicken auf ''"Add"'' das PPA aktivieren. = Code in ein PPA laden = == Vorbereitung == Folgendes Paket muss installiert [1] werden, um später Dateien hochladen zu können: {{{#!vorlage Paketinstallation dput devscripts }}} Außerdem ist es zum Bauen von Paketen praktisch, die E-Mail-Adresse und den Maintainernamen zu setzen: {{{#!vorlage Befehl export DEBFULLNAME="VORNAME NACHNAME" export DEBEMAIL="MAIL@ADRESSE" }}} == Erforderliche Dateien == === Quellcode === Es ist empfehlenswert, sich den Artikel [:Grundlagen_der_Paketerstellung:] anzuschauen. Analog zu diesem Artikel werden dem Beispielordner '''~/PPA-PROJEKT/test_0.0.1/''' im [:Homeverzeichnis:] die Quelldateien des Projekts hinzugefügt. Der Ordnername '''test_0.0.1''' setzt sich aus dem Programmnamen und der Version zusammen. === Dateien im Verzeichnis /debian === Im Ordner '''~/PPA-PROJEKT/test_0.0.1''' muss zusätzlich ein Unterordner '''debian/''' mit folgenden Dateien angelegt werden: '''changelog, compat, control, copyright''' und '''rules'''. Nun fehlt nur noch ein Ordner '''debian/source/''' mit der Datei '''format'''. Im Wesentlichen kann man sich bei diesen Dateien am oben erwähnten Artikel orientieren. Damit das Beispielprojekt z.B. für [:Trusty_Tahr:Ubuntu 14.04] gebaut und veröffentlicht werden kann, sind folgende Änderungen vorzunehmen: * In der Datei '''debian/changelog''' wird die erste Zeile so korrigiert: {{{ test (0.0.1-1~trusty) trusty; urgency=low }}} * Die Datei '''source/format''' sollte diesen Inhalt haben: {{{ 3.0 (quilt) }}} Ist eine Datei mit diesem Inhalt vorhanden, wird später die Datei '''~/PPA-PROJEKT/test_0.0.1-1~trusty.debian.tar.gz''' erzeugt. Ohne die genannte Datei wird die Datei '''test_0.0.1-1~trusty.diff.tar.gz''' erzeugt, die Fehlermeldungen hervorrufen kann. Nachdem im Ordner '''~/PPA-PROJEKT/test_0.0.1/''' alle erforderlichen Dateien vorhanden sind, muss im übergeordneten Ordner '''~/PPA-PROJEKT/''' eine komprimierte Archivdatei des Ordners '''~/PPA-PROJEKT/test_0.0.1/''' erstellt werden. Der Name muss dieser Konvention entsprechen: PROGRAMMNAME_VERSIONSNUMMER.orig.tar.gz. In dem Beispiel somit '''test_0-0-1.orig.tar.gz'''. === Dateien erzeugen, die zum Hochladen benötigt werden === Nachdem alle erforderlichen Dateien vorhanden sind, werden die benötigten Dateien mit '''debuild''' erzeugt: {{{#!vorlage Befehl cd ~/PPA-PROJEKT/test_0.0.1/ debuild -S -sa }}} Dieses Hilfsprogramm kümmert sich gleich um drei Punkte: 1. es ruft '''dpkg-buildpackage''' zur Paketerstellung auf 1. dann wird der Paketbau mit '''lintian''' kontrolliert 1. Zum Schluss erfolgt die Signierung mit '''debsign''' Dabei werden mehrere Dateien im Ordner '''~/PPA-PROJEKT/''' erzeugt, u.a. '''test_0.0.1-1~trusty.dsc''' und '''test_0.0.1-1~trusty_source.changes'''. War die Erstellung des Projekts nicht erfolgreich, müssen mit den Hinweisen von lintian die Fehler ermittelt und korrigiert werden. == Dateien signieren == Wenn der Paketbau dagegen mit dem Befehl: {{{#!vorlage Befehl debuild -us -uc }}} durchgeführt wurde, dann müssen die erstellten Dateien '''test_0.0.1-1~trusty.dsc''' bzw. '''test_0.0.1-1~trusty_source.changes''' erst noch signiert werden, damit sie beim Hochladen nicht zurückgewiesen werden: {{{#!vorlage Befehl cd ~/PPA-PROJEKT/test_0.0.1/ debuild -S -k"0xABCD1234" }}} Hier ist `"0xABCD1234"` durch die Nummer des eigenen öffentlichen PGP-Schlüssels zu ersetzen. Man beachte das "0x" vor dem Schlüssel. === Erstmaliges Hochladen des Projekts === {{{#!vorlage Befehl cd ~/PPA-PROJEKT dput ppa:LAUNCHPAD-ID/PPA-NAME PROGRAMMNAME_VERSION_source.changes }}} Die Werte für `LAUNCHPAD-ID/PPA-NAME` und `PROGRAMMNAME_VERSION` müssen entsprechend angepasst werden. Praktisch also, um beim Beispiel zu bleiben: {{{#!vorlage Befehl dput ppa:BENUTZERNAME/ppa test_0.0.1-1~trusty_source.changes }}} Man bekommt dann eine E-Mail, ob das Paket akzeptiert wurde und falls nicht, warum. Wurde das Quellpaket akzeptiert, wird nun versucht, Debianpakete für die Architekturen `i386`, `amd64` und `lpia` (nur bis Ubuntu 10.04) zu erstellen. Das kann je nach Auslastung der Build-Server etwas dauern. In eigenen Launchpad-Profil unter ''"Actions -> Personal Package Archive -> View build records"'' kann man den Fortschritt kontrollieren und, falls das Erstellen scheitert, das Build-Log mit den Fehlern beim Paketerstellen einsehen. Nur im Fehlerfall erhält man eine E-Mail mit einem Link auf die Build-Log-Datei. Sind die Pakete erfolgreich erstellt worden, sieht man dies im Profil unter ''"Actions -> Personal Package Archive"''. Hier findet man dann auch die Direktlinks zu den Debian-Paketen und die Adresse der eigenen Paketquelle. Im Beispielprojekt findet man die Pakete als '''LAUNCHPAD-ID/PPA-NAME/test_0.0.1~trusty.SYSTEMARCHITEKTUR.deb'''. === Erneutes Hochladen des Projekts === Wurden am Quelltext Änderungen vorgenommen, muss in der Datei '''debian/changelog''' die Versionsnummer erhöht werden (z.B. von `test_0.0.1-1` auf `test_0.0.1-2`). Dann werden, wie oben beschrieben, die zum Hochladen erforderlichen Dateien erzeugt, signiert und hochgeladen. Eine weitere Möglichkeit ist die Erstellung von Patch-Dateien. Der Artikel [:Grundlagen_der_Paketerstellung:] gibt hierzu weitere Hinweise. === Hochladen des Projekts für verschiedene Ubuntu-Versionen === Durch das Ersetzen von `trusty` im Dateinamen kann das Projekt problemlos für weitere Ubuntu-Versionen gebaut und veröffentlicht werden. Die folgenden Änderungen sind erforderlich, wenn das Projekt beispielsweise (zusätzlich) für [:Precise Pangolin:Ubuntu 12.04] veröffentlicht werden soll: 1. Die erste Zeile in der Datei '''debian/changelog''' muss angepasst werden, indem zweimal das vorhandene `trusty` durch `precise` ersetzt wird. 1. Im Ordner '''~/PPA-PROJEKT/''' wird nur der Unterordner '''test_0.0.1-1/''' mit dem Quelltext und die Archivdatei '''test_0.0.1.orig.tar.gz''' benötigt. Alle weiteren vorhandenen Dateien müssen gelöscht werden. Nun folgt die Erstellung und Signierung die erforderlichen Dateien. Entweder benutzt man wie oben den Befehl "`debuild -S -sa`" oder den folgenden, wenn ein bestimmter Schlüssel verwendet werden soll: {{{#!vorlage Befehl cd ~/PPA-PROJEKT/test_0.0.1/ debuild -S -sd -k"0xABCD1234" }}} Das Hochladen erfolgt mit dem bereits oben erläuterten Befehl: {{{#!vorlage Befehl cd .. dput ppa:LAUNCHPAD-ID/PPA-NAME test_0.0.1-1~precise_source.changes }}} Die Dateien '''test_0.0.1-1~precise_source.changes''', '''test_0.0.1-1~precise.dsc''' und '''test_0.0.1-1~precise.debian.tar.gz''' werden hochgeladen, nicht aber die Datei '''test_0.0.1.orig.tar.gz'''. Auch hier bekommt man eine E-Mail, ob das Paket akzeptiert wurde oder nicht. = Problembehebung = == Paket wurde "rejected" == Bekommt man nach dem Hochladen per E-Mail die Meldung, dass das Paket "rejected" (abgelehnt) wurde, kann dies mehrere Ursachen haben. Dies steht meist sehr aussagekräftig in der E-Mail beschrieben. Bekommt man diese Meldung: {{{ Rejected: MD5 sum of uploaded file does not match existing file in archive Files specified in DSC are broken or missing, skipping package unpack verification }}} dann ist das Problem, dass man zuvor schon mal den gleichen Code hochgeladen hat. Lädt man es nochmal hoch, muss man unbedingt die Versionsnummer in der '''debian/changelog''' ändern. Selbst wenn man das alte Paket über das Webfrontend gelöscht hat, ist es zwingend erforderlich, eine andere Versionsnummer zu wählen, da sich ein PPA immer merkt, was für Pakete man bereits hochgeladen hatte. Anstelle von X.X.X-1 muss man dann X.X.X-2 nehmen. == Paket wurde nicht gebaut == Auch dies kann viele Ursachen haben und das Build-Log gibt meistens Aufschluss darüber, was schief gelaufen ist. In dem Großteil der Fälle ist die Ursache, dass man gewisse Abhängigkeiten (also "build-dependencies") in der '''debian/control''' nicht angegeben hat oder ein falsches Kommando zum Kompilieren in der Datei '''debian/rules''' steht. == Signieren schlägt fehl == Erhält man folgende Meldung beim Signieren eines Pakets: {{{ Now signing changes and any dsc files... signfile test_0.0.4-1~trusty.dsc Benutzername gpg: »Benutzername « übersprungen: Geheimer Schlüssel ist nicht vorhanden gpg: /tmp/debsign.xSsGps0Q/test_0.0.4-1~trusty.dsc: clearsign failed: Geheimer Schlüssel ist nicht vorhanden debsign: gpg error occurred! Aborting.... debuild: fatal error at line 1283: running debsign failed }}} dann muss man den Befehl `debuild` mit der Nummer des eigenen Schlüssels [#Dateien-signieren kombinieren]: {{{#!vorlage Befehl debuild -S -sa -k"0xABCD1234" }}} = Links = * [man_de:debuild:] - deutsche Manpage des zentralen Werkzeugs zur Paketerstellung * [http://www.rum3ber.ch/index.php/projekte/64-ppa-the-easy-way PPA - The easy way] {de} - Blogbeitrag 05/2011 * [https://help.launchpad.net/Packaging/PPA PPA-Quickstart-Guide] {en} - offizielle Dokumentation * [https://help.launchpad.net/Packaging/PPA/BuildingASourcePackage Building a source package] {en} * [launchpad:ubuntu/+ppas: PPA-Suche] - PPA für ein Programm finden * [askubuntu:296197/how-to-find-out-the-package-download-count-from-a-ppa:How to find out the package download count from a PPA?] {en} * [http://wpitchoune.net/blog/ppastats/ PPAStats] {en} * [:Open_Build_Service:] - Das OpenSuSE Projekt bietet ebenfalls einen Build Service für Ubuntu-Pakete an #tag: Community, Ubuntu, Programmierung, Launchpad, Paketbau