Deb-Pakete zum Verteilen von Code verwenden

    In diesem Artikel möchte ich darüber sprechen, wie Sie ein Deb-Paket-Build-System für ein abstraktes Projekt implementieren können. Die Verteilung und Bereitstellung von paketbasierter Software bietet mehrere Vorteile:
    • Atomizität des Pakets (Präsentation des Produkts als einzelne Datei);
    • Vorhandensein von Skripten vor / nach der Installation / Deinstallation von Software;
    • Sie können Abhängigkeiten für Software angeben.
    Wenn Sie Software auf der Basis von Paketen anstatt auf der Basis von SVN bereitstellen , sind Sie garantiert vor Problemen mit .svn-Ordnern geschützt .

    Projektstruktur


    Betrachten Sie also ein my-app-Webprojekt unter SVN-Kontrolle mit der folgenden Dateistruktur:
    / | -config
     | | -parameters.ini
     | -htdocs
     | | -index.php
     | -libs
     | -Vorlagen
    


    Paketstruktur


    Zum Erstellen von Paketen benötigen wir eine Reihe von Dateien und Skripten, die wir im Ordner .package ablegen. Diese werden dann zum Stammverzeichnis des Projekts hinzugefügt. Die Struktur dieses Ordners sieht folgendermaßen aus:
    /|-.Struktur
     | | -DEBIAN
     | | | -conffiles
     | | | -Kontrolle
     | | | -postinst
     | | | -postrm
     | | | -preinst
     | | | -prerm
     | | | -Vorlagen
     | | -etc
     | | -var
     | | | -log
     | | | -www
     | -package.xml
     | -package.properties
    

    Tatsächlich ist der .structure-Katalog unser zukünftiges Paket. Das DEBIAN-Unterverzeichnis enthält Service-Dateien, auf die weiter unten eingegangen wird. Alle anderen Verzeichnisse wiederholen die Verzeichnishierarchie des Debian Linux-Dateisystems vollständig. Die Dateien package.xml und package.properties enthalten Skripts und Einstellungen zum Erstellen von Paketen mit dem Dienstprogramm Apache Ant . Aber das Wichtigste zuerst.

    Debian-Verzeichnis


    Das DEBIAN-Verzeichnis enthält Projekteinstellungsdateien und Skripts vor / nach der Installation / Deinstallation.

    Die Conffiles-Datei enthält eine Liste von Konfigurationsdateien, die bei der Installation nicht überschrieben werden dürfen: In unserem Fall wird hier die Projekteinstellungsdatei angezeigt. Die Steuerdatei enthält allgemeine Informationen zum Paket:
    /etc/my-app/parameters.ini




    Package: my-app
    Version: {{{VERSION}}}
    Section: user
    Priority: optional
    Architecture: all
    Installed-Size: 0
    Maintainer: Mikhail Krestjaninoff
    Depends: nginx, php5-common (>= 5.2), php5-cli
    Description: My application

    Separate Beachtung in dieser Datei verdient Punkte Version und Depends. Wir geben speziell die Konstante {{{VERSION}} als Paketversion an, da wir sie in Zukunft beim Zusammenstellen des Pakets durch den aktuellen Wert ersetzen werden. In der Liste der Abhängigkeiten haben wir nur nginx und php angegeben. Wenn Ihr Projekt jedoch zusätzliche Pakete (z. B. PHP-Module) verwendet, können Sie diese explizit auflisten, um das Risiko einer fehlerhaften Ausführung des Projekts beim Posten auf dem Battle Server zu verringern.

    Die preinst-Datei enthält ein Vorinstallationsskript : In unserem Fall sind keine vorbereitenden Schritte erforderlich, daher ist die Datei leer. Die postinst-Datei enthält ein Nachinstallationsskript. In diesem Fall legt das Skript die Berechtigungen fest und konfiguriert die Konfiguration mit dem Dienstprogramm debconf
    #!/bin/sh



    und Verzeichnisse für temporäre Dateien erstellen:
    #!/bin/sh
    if [ configure = "$1" ]; then
        # Set permissions
        chown -R www-data:www-data /etc/my-app/
        chmod -R 0664 /etc/my-app/
        chown -R www-data:www-data /var/www/my-app/
        chmod -R 0664 /var/www/my-app/
        chown -R www-data:www-data /var/log/my-app/
        chmod -R 0664 /var/log/my-app/
        # Set up configuration file
        . /usr/share/debconf/confmodule
        db_input critical db/dsn || true
        db_go
        db_fset db/dsn seen false || true
        db_get db/dsn || true
        DSN=$RET
        DSN=`echo "$DSN" | sed 's/\//\\\\\//g'`;
        sed -i s/{{DSN}}/$DSN/ /etc/my-app/parameters.ini
        # Create directories for temporary files
        CACHE_DIR="/var/www/my-app/templates/cache"
        COMPILED_DIR="/var/www/my-app/templates/compiled"
        if [ ! -d $CACHE_DIR ]
        then
            mkdir -p $CACHE_DIR
            chown -R www-data:www-data $CACHE_DIR
            chmod -R 0664 $CACHE_DIR
        fi
        if [ ! -d $COMPILED_DIR ]
        then
            mkdir -p $COMPILED_DIR
            chown -R www-data:www-data $COMPILED_DIR
            chmod -R 0664 $COMPILED_DIR
        fi
    fi
    

    Bei Bedarf können dieser Datei auch Skripte zum Erstellen einer Projektdatenbank hinzugefügt werden. Mit der Aktualisierung der Datenbank ist die Aufgabe etwas komplizierter. Sie können jedoch versuchen, dies teilweise zuzulassen, indem Sie 2 SQL-Dateien im Projekt speichern: mit einem vollständigen Satz von Befehlen zum Reproduzieren der Struktur / Daten (Erstinstallation) und Änderungen gegenüber der vorherigen Version (Aktualisierung).

    Die Prerm-Datei enthält ein Vorinstallationsskript . In diesem Fall löscht das Skript Verzeichnisse für temporäre Dateien:
    #!/bin/sh
    if [ remove == "$1" -o purge == "$1" ];
    then
        # Remove directories for temporary files
        CACHE_DIR="/var/www/my-app/templates/cache"
        if [ -e $CACHE_DIR ]; then
            rm -rf $CACHE_DIR
        fi
        COMPILED_DIR="/var/www/my-app/templates/compiled"
        if [ -e $COMPILED_DIR ]; then
            rm -rf $COMPILED_DIR
        fi
    fi
    


    Die Vorlagendatei enthält Feldvorlagen für das Dienstprogramm debconf :
    Template: db/dsn
    Type: string
    Default: postgres://user@passwd:localhost/my-app
    Description: Database Source Name. Example: postgres://user@passwd:localhost/my-app
    

    Sie können mehr über den Inhalt des DEBIAN- Verzeichnisses auf opennet oder in der offiziellen Dokumentation lesen .

    Paketerstellungsskripte


    Um nun ein vollständiges Paket auf der Grundlage unseres Projekts zu erstellen, müssen wir die Dateistruktur des Pakets (Dateisystem mit dem Stammverzeichnis im Verzeichnis .structure mit Daten) ausfüllen . Dazu müssen Sie einen kleinen Satz von Skripten erstellen, die die erforderlichen Daten vom Projektdateisystem in das Paketdateisystem kopieren. Zu diesem Zweck habe ich Apache Ant verwendet, wodurch ich die Dateien package.xml und package.properties erhalten habe .

    Die Datei package.properties enthält die Einstellungen zum Erstellen des Pakets:
    package.name=my-app
    package.version=1.0.0
    

    Das Hauptbuildskript ist in der Datei package.xml enthalten:



      
      
      
      
      

      
      
        
        
      


      
      
        
        
      


      
      

        
          
            
            
        

        


        
        
          
            
            
          

        


        
        
          
            
            
          

        


      
        
          
            
            
          

        


        
        
          
            
            
            
            
          

        


      


      
      

        
        
          
        


        
        
          
        


        
        
          
        


        
        
          
        


      




    * This source code was highlighted with Source Code Highlighter.

    Paket montage


    Damit ist die Erstellung des .package- Verzeichnisses abgeschlossen. Jetzt können wir es zusammen mit dem Rest des Projekts an SVN übergeben. Wenn wir ein Paket erstellen müssen (zum Beispiel ein Release / Label zum Testen oder in den Kampf ziehen), reicht es aus, in das Verzeichnis .package zu wechseln und den Befehl auszuführen, mit dem ant -f package.xml buildein neues Deb-Paket für uns im Verzeichnis .package / target erstellt wird !

    Jetzt auch beliebt: