Montag, 23. September 2013

CoreMedia 7 Blueprint als Debian/Ubuntu Pakete

Es ist hier Off-Topic, aber es paßt gut in die Zielrichtung Entscheidungsfreiheit bei der Plattformwahl zu bekommen und dennoch einheitlich die benötigten Features zur Verfügung zu haben.
Dies ist ein Thema, das man eben nicht nur mit Tangran adressieren kann, sondern auch z.B. mit dem CoreMedia CMS.
Mehr durch einen Bedienerfehler inspiriert als mit Zielrichtung versehen, habe ich das CoreMedia 7 Blueprint mit Debian Paketbau versehen. Damit kann man - auch wenn es nicht suppported ist - das CoreMedia 7 System auch z.B. mit einem Ubuntu LTS (es sollte ja auch ein Enterprise Linux sein können, damit man bei Bedarf auch kommerziell Support einkaufen kann) einsetzen.
CoreMedia selbst bietet uns ein fertiges Setup zum Bau von RPM-Paketen für die einzelnen Komponenten, das sogar unter Windows ohne weitere Werkzeuge läuft. Das ist eine Meßlatte, die ich nicht unterschreiten wollte. Also war ich auf der Suche nach einer reinen Java-Lösung und stieß auf diese Liste: Maven plugin for building debian package.
Leider werden CoreMedia Workspaces immernoch mit Maven zu fertigen Lösungen zusammengebaut und zwei der Tools auf der Liste lassen sich nicht einfach integrieren oder benötigen wieder externe Werkzeuge auf der Unix-Kommandozeile.
Einzig jdeb brachte schnell erste Ergebnisse.
Wer das Ganze in sein Projekt eingepaßt haben möchte oder einfach den fertigen Patch gegen dan Blueprint in Version 26 haben möchte, möge sich einfach mal melden. Hier folgt jetzt die lesbare aber damit nicht Code-Zeilen-genaue Version.
Was ist zu tun?
Nachdem man in der root-POM jdeb mit Version (hier 1.0.1) bekannt gemacht hat, wendet man sich einzig dem Bereich packages im Workspace zu, wo alles zunächst ganz einfach aussieht.
Mit einer Konfiguration für alle Pakete
  <plugin>
    <artifactId>jdeb</artifactId>
    <groupId>org.vafer</groupId>
    <configuration>
      <deb>[[buildDir]]/${APPLICATION_NAME}_[[version]]_all.[[extension]]</deb>
      <controlDir>${project.build.directory}/deb</controlDir>
      <dataSet>
        <data>
          <type>template</type>
          <paths>
            <path>${INSTALL_ROOT}/${APPLICATION_NAME}</path>
          </paths>
        </data>                  

        <data>
          <src>${project.build.directory}/${APPLICATION_NAME}</src>
          <type>directory</type>
          <excludes>**/*.bat,**/*.exe,**/*.dll</excludes>
          <mapper>
            <type>perm</type>
            <user>${INSTALL_USER}</user>
            <group>${INSTALL_GROUP}</group>
            <prefix>${INSTALL_ROOT}/${APPLICATION_NAME}</prefix>
          </mapper>
        </data>
      </dataSet>
    </configuration>
  </plugin>

entstehen sehr schnell .deb Dateien, wenn man sich vorher eine Dependency auf ein ZIP erzeugt und im ${project.build.directory}/deb auspacken läßt. In dieser Dependency (hier genannt debian-packaging) braucht man mindestens ein control-File und Filtering, damit man nicht für jedes Paket ein eigenes erstellen muß.
  Package: ${APPLICATION_NAME}
  Version: ${project.version}
  Section: httpd
  Priority: optional
  Architecture: all
  Depends: ${APPLICATION_PREFIX}-tomcat-installation
  Maintainer: Main Tainer <maintainer@example.com>
  Description: CoreMedia 7 - ${APPLICATION_PREFIX} ${project.artifactId}
  Homepage: http://www.coremedia.com/

Bis diese Pakete auch nur fast auf dem Niveau der RPM-Pakete sind, ist allerdings noch ein wenig Feinarbeit notwendig.
Die Installation- und Entfernungs-Skripten, die Dateiberechtigungen und die Unterschiede zwischen dem Bereich tools, services und der tomcat-installation bringen dann noch ein wenig Arbeit, die einige Round-Trips erfordert, bis alles an seiner Stelle steht und richtig zusammenspielt.
Man sieht es schon an den data-Template oben, wo der Basis-Pfad des gesamten Paketes noch einmal explizit erwähnt werden muß. Außerdem haben Debian-Pakete andere Aufruf-Parameter für die Skripten, wo z.B. install statt 1 und upgrade statt 2 übergeben wird. Desweiteren verlassen sich die mitgelieferten Skripten von CoreMedia auch fest auf das Vorhandensein von Werkzeugen, die nun einmal nun auf jedem Linux verfügbar sind. Diese mitgelieferten Skripten werden durch Wrapper in den Pakete aufgerufen - außer natürlich dem Skript preinst (preinstall.sh), das beim Wrapper in's leere greifen würde und daher angepaßt werden mußte - in allen drei Varianten, die im Workspace existieren:
  # $1 == 1 --> initial installation
  # $1 == 2 --> upgrade
  SELECTOR=$1


  # Debian
  if [ "a$SELECTOR" = "ainstall" ] ; then
    SELECTOR=1
  fi
  if [ "a$SELECTOR" = "aupgrade" ] ; then
    SELECTOR=2
  fi

  if [ $SELECTOR -eq 1 ] ; then
    # initial installation

Am Ende der ganzen Prozedur kommt noch ein wenig Fleißarbeit: In jedem aber auch jedem Paket - das ist beim CoreMedia Application Maven Plugin letztlich nicht anders - muß nun der Paketbau als Referenz auf die übergreifenden Konfiguration eingefügt werden.
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
      <execution>
        <phase>initialize</phase>
        <goals>
          <goal>unpack</goal>
        </goals>
        <configuration>
          <artifactItems>
            <artifactItem>
              <groupId>${project.groupId}</groupId>
              <artifactId>debian-packaging</artifactId>
              <version>${project.version}</version>
              <type>zip</type>
              <outputDirectory>${project.build.directory}/deb</outputDirectory>
            </artifactItem>
          </artifactItems>
        </configuration>
      </execution>
    </executions>
  </plugin>

  ...
  <plugin>
    <artifactId>jdeb</artifactId>
    <groupId>org.vafer</groupId>
    <executions>
      <execution>
        <phase>package</phase>
        <goals>
          <goal>jdeb</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

Auch hier sind natürlich wieder ein paar Schritte ausgelassen, um den Text hier noch einigermaßen lesbar zu halten.

Keine Kommentare:

Kommentar veröffentlichen