Interne Paketverwaltung mit Composer und Satis per Jenkins Skript

Di, 28.04.2015 - 14:19 -- Daniel Espendiller

Über den Composer und der Paketverwaltung Packagist lassen sich bekanntlich externe PHP Libraries mit deren Abhängigkeiten in Projekten einbinden. Will man hier nicht öffentlichen Quelltext ausrollen, so muss eine interne Infrastruktur her. Mit Satis kann man hier recht einfach private Repositories in seinen Entwicklungsprozess einbinden. Zwar kann man auch über einen Zweig repositories ein gleichen Effekt erreichen, dies ist aber recht langsam, da in jedem Branch nach möglichen composer.json Datei gesucht wird. Die Arbeit kann man besser Satis regelmäßig durchführen lassen.

Jenkins Job für Satis

Satis durchsucht sämtliche repositories und erzeugt einen entsprechende statische .json und paar HTML Ausgaben, welche dann auf einen Webserver hochgeladen werden müssen. Somit sind alle Pakete und Versionen zentral über eine Adresse erreichbar und nicht jeder Composer Client muss sich selber um deren Aufbau kümmern. Als Beispiel simples Jenkins:

#initial jenkins job
#curl -sS https://getcomposer.org/installer | php
#php composer.phar create-project composer/satis --stability=dev --keep-vcs
 
statis=$(cat <<EOF
{
    "name": "Satis",
    "homepage": "http://satis.example.org",
    "repositories": [
        { "type": "vcs", "url": "git@foo.de:user/bar.git" },
        { "type": "vcs", "url": "git@foo.de:user/bar2.git" }
    ],
    "require-all": true
}
EOF
)
 
echo "$statis" > satis.json
 
php satis/bin/satis --skip-errors build satis.json build
 
rsync --delete --chmod=ug=rwX -axv build/ user@myserver:/var/www/satis/htdocs/

Branch-Alias

Normal wird der Version-String eines Paketes über den Branch-Namen erzeugt. So wird aus master dev-master. Mittels branch-alias können wir dieses aber per composer.json im Repository überschreiben.

{
    "extra": {
        "branch-alias": {
            "dev-master": "1.0.x-dev"
        }
    }
}

Satis in composer.json einbinden

Am Ende noch eine Zeile mit der HTTP-Adresse in die composer.json und per require kann jetzt jedes interne Paket eingebunden werden.

{
   "repositories":[
      {
         "type":"composer",
         "url":"http://satis.example.org/"
      }
   ]
}