Upgrade to Pro — share decks privately, control downloads, hide ads and more …

IPSit

fraosug
March 17, 2013

 IPSit

fraosug

March 17, 2013
Tweet

More Decks by fraosug

Other Decks in Technology

Transcript

  1. IPSit IPS packaging as easy as 1 2 3 http://ipsit.de

    Michael Keller, minesworld-technologies http://minesworld-technologies.com FRAOSUG-Treffen am 18.10.2011
  2. Eigene Pakete erstellen weil • Pakete und Repositories sind “packaged

    Use Cases” pre-build Pakete haben evtl. anderen Use- Case, z.B. kein LDAP support • Unabhängigkeit von Maintainer (Bug & Security-Fixes) • Kontrolle 㱻 Qualität
  3. Bestandteile eines IPS Pakets set name=pkg.fmri value=pkg://openindiana.org/SUNWless@436,5.11-0.133:20100914T030448Z set name=pkg.renamed value=true

    set name=org.opensolaris.consolidation value=sfw set name=variant.arch value=i386 set name=variant.opensolaris.zone value=global value=nonglobal set name=pkg.fmri value=pkg://opensolaris.org/SUNWless@436,5.11-0.133:20100216T083353Z set name=org.opensolaris.consolidation value=sfw set name=variant.opensolaris.zone value=global value=nonglobal set name=pkg.renamed value=true set name=variant.arch value=sparc value=i386 depend fmri=text/[email protected] type=require depend fmri=consolidation/sfw/sfw-incorporation type=require depend fmri=text/[email protected] type=require depend fmri=system/[email protected] type=require Manifest File content
  4. Bestandteile eines IPS Pakets set name=pkg.fmri value=pkg://openindiana.org/SUNWless@436,5.11-0.133:20100914T030448Z set name=pkg.renamed value=true

    set name=org.opensolaris.consolidation value=sfw set name=variant.arch value=i386 set name=variant.opensolaris.zone value=global value=nonglobal set name=pkg.fmri value=pkg://opensolaris.org/SUNWless@436,5.11-0.133:20100216T083353Z set name=org.opensolaris.consolidation value=sfw set name=variant.opensolaris.zone value=global value=nonglobal set name=pkg.renamed value=true set name=variant.arch value=sparc value=i386 depend fmri=text/[email protected] type=require depend fmri=consolidation/sfw/sfw-incorporation type=require depend fmri=text/[email protected] type=require depend fmri=system/[email protected] type=require .... dir group=sys mode=0755 owner=root path=usr dir group=sys mode=0755 owner=root path=usr dir group=bin mode=0755 owner=root path=usr/bin dir group=bin mode=0755 owner=root path=usr/bin dir group=sys mode=0755 owner=root path=usr/share dir group=sys mode=0755 owner=root path=usr/share dir group=bin mode=0755 owner=root path=usr/share/man dir group=bin mode=0755 owner=root path=usr/share/man dir group=bin mode=0755 owner=root path=usr/share/man/man1 dir group=bin mode=0755 owner=root path=usr/share/man/man1 file 9eea10d4dd0a150a5036749e397a0701aa14446c chash=acf14bd54db80ff124ff9d0a785c7271fddcce88 elfarch=i386 elfbits=32 elfhash=cab688670a904578ed17ff33ba08d3061d697c6f group=bin mode=0555 owner=root path=usr/bin/less pkg.csize=70503 pkg.size=152644 file 7612fa8ddcb00cc83985db2e5af377f6897cbbcd chash=a8cd3d19959ea92d50a9248641eb9c45a36f66d5 elfarch=i386 elfbits=32 elfhash=4cd08722aa8f5fa82cdfd4f35e04a1f0b7eaf753 group=bin mode=0555 owner=root path=usr/bin/lessecho pkg.csize=3373 pkg.size=7292 file 8a10ad3e89d98127b7ec71e5ce0311acbf4b76f4 chash=164015c066a17838ab1e942cbfa7b3cc66d425c4 group=bin mode=0444 owner=root path=usr/share/man/man1/lessecho.1 pkg.csize=817 pkg.size=1680 file 92d9b6e6de6dd4de4535e144379d063f2b8e50a9 chash=f35ab39ff242a0691f0c787783921c80db70aab3 elfarch=sparc elfbits=32 elfhash=4ef5be4cf18f129569c4efb1af35934838147c15 group=bin mode=0555 owner=root path=usr/bin/less pkg.csize=75958 Manifest
  5. Bestandteile eines IPS Pakets set name=pkg.fmri value=pkg://openindiana.org/SUNWless@436,5.11-0.133:20100914T030448Z set name=pkg.renamed value=true

    set name=org.opensolaris.consolidation value=sfw set name=variant.arch value=i386 set name=variant.opensolaris.zone value=global value=nonglobal set name=pkg.fmri value=pkg://opensolaris.org/SUNWless@436,5.11-0.133:20100216T083353Z set name=org.opensolaris.consolidation value=sfw set name=variant.opensolaris.zone value=global value=nonglobal set name=pkg.renamed value=true set name=variant.arch value=sparc value=i386 depend fmri=text/[email protected] type=require depend fmri=consolidation/sfw/sfw-incorporation type=require depend fmri=text/[email protected] type=require depend fmri=system/[email protected] type=require .... dir group=sys mode=0755 owner=root path=usr dir group=sys mode=0755 owner=root path=usr dir group=bin mode=0755 owner=root path=usr/bin dir group=bin mode=0755 owner=root path=usr/bin dir group=sys mode=0755 owner=root path=usr/share dir group=sys mode=0755 owner=root path=usr/share dir group=bin mode=0755 owner=root path=usr/share/man dir group=bin mode=0755 owner=root path=usr/share/man dir group=bin mode=0755 owner=root path=usr/share/man/man1 dir group=bin mode=0755 owner=root path=usr/share/man/man1 file 9eea10d4dd0a150a5036749e397a0701aa14446c chash=acf14bd54db80ff124ff9d0a785c7271fddcce88 elfarch=i386 elfbits=32 elfhash=cab688670a904578ed17ff33ba08d3061d697c6f group=bin mode=0555 owner=root path=usr/bin/less pkg.csize=70503 pkg.size=152644 file 7612fa8ddcb00cc83985db2e5af377f6897cbbcd chash=a8cd3d19959ea92d50a9248641eb9c45a36f66d5 elfarch=i386 elfbits=32 elfhash=4cd08722aa8f5fa82cdfd4f35e04a1f0b7eaf753 group=bin mode=0555 owner=root path=usr/bin/lessecho pkg.csize=3373 pkg.size=7292 file 8a10ad3e89d98127b7ec71e5ce0311acbf4b76f4 chash=164015c066a17838ab1e942cbfa7b3cc66d425c4 group=bin mode=0444 owner=root path=usr/share/man/man1/lessecho.1 pkg.csize=817 pkg.size=1680 file 92d9b6e6de6dd4de4535e144379d063f2b8e50a9 chash=f35ab39ff242a0691f0c787783921c80db70aab3 elfarch=sparc elfbits=32 elfhash=4ef5be4cf18f129569c4efb1af35934838147c15 group=bin mode=0555 owner=root path=usr/bin/less pkg.csize=75958 Header: Metadaten wie Version, Beschreibung Files: welche Dateien wo wie angelegt werden.
  6. Erstellung eines IPS Paketes pkgsend manifest pkg.depotd build host Repository/Depot

    package manifest files Manifest-Header wird gesendet…
  7. Erstellung eines IPS Paketes pkgsend manifest pkg.depotd build host Repository/Depot

    package manifest files content Inhalt der Dateien wird gesendet…
  8. Erstellung eines IPS Paketes pkgsend manifest pkg.depotd build host Repository/Depot

    package manifest files content files content Wenn komplett angekommen
  9. Erstellung eines IPS Paketes pkgsend manifest pkg.depotd build host Repository/Depot

    package manifest files content package files … pkg.depotd signalisiert “OK” …
  10. Erstellung eines IPS Paketes pkgsend manifest pkg.depotd build host Repository/Depot

    package manifest files content package files Neues Paket im Repository.
  11. pkgsend ⊕ ist im OS enthalten ⊕ relativ einfache Bedienung

    ( Manifest 1:1 übernommen) ⊙ packaging
  12. Pkgtools ⊕ relativ einfache Beschreibungssprache (Manifest wird daraus erstellt) ⊕

    kurze Einarbeitungszeit ⊙ packaging ⊝ Extra Download
  13. pkgbuild ⊕ build & packaging ⊕ Bestandteil des DesktopCBE ⊕

    spec Files werden auch von anderen Unixes verwendet ⊕ spec Files 㱺 “mächtig” ⊝ spec Files 㱺 nicht einfach ⊝ Schwer auffindbare Dokumentation ⊝ Extra Download, kein IPS-Paket
  14. Kriterien: ⊕ Einfache Bedienung Manifest Header ⊕ Kontrolle über Inhalt

    Integration in Build Ablauf ⊕ Bestehende Scripts Optimum ?
  15. ⊕ Einfache Bedienung ⊕ Kontrolle über Inhalt ⊕ Bestehende Scripts

    ⊝ pkgsend ⊝ Pkgtools ⊝ pgkbuild Optimum ?
  16. PKG="mynamespace/example" VERSION=1.0 MANIFEST=" set name=pkg.name value=\"my first package\" set name=pkg.description

    value=\"example package build with IPSit\" " ./configure make pfexec make install
  17. PKG="mynamespace/example" VERSION=1.0 MANIFEST=" [...] " ./configure make pfexec $IPSIT snapshot

    install pfexec make install echo "$MANIFEST" | \ pfexec $IPSIT package install $PKG@$VERSION -
  18. PKG="mynamespace/example" VERSION=1.0 MANIFEST=" [...] " ./configure make pfexec $IPSIT snapshot

    install pfexec make install echo "$MANIFEST" | \ pfexec $IPSIT package install $PKG@$VERSION - alle neuen Files seit snapshot “install” benutzen
  19. PKG="mynamespace/example" VERSION=1.0 MANIFEST=" [...] " ./configure make pfexec $IPSIT snapshot

    install pfexec make install echo "$MANIFEST" | \ pfexec $IPSIT package install $PKG@$VERSION - welches Paket erstellt werden soll
  20. PKG="mynamespace/example" VERSION=1.0 MANIFEST=" [...] " ./configure make pfexec $IPSIT snapshot

    install pfexec make install echo "$MANIFEST" | \ pfexec $IPSIT package install $PKG@$VERSION - - 㱺 Manifest header von Standard In einlesen
  21. Environment variables • starten immer mit IPSIT_ • nicht besonders

    viele • die meisten sollten ausserhalb der Scripts gesetzt werden
  22. IPSit “externe” Kommandos: depot/create depot/start PUBLISHER=admin-hero DEPOT_ROOT=/repositories/$PUBLISHER export IPSIT_REPOSITORY=http://localhost:10000 DEPOT_URI=\

    `pfexec $IPSIT depot/create -s $PUBLISHER $DEPOT_ROOT` pfexec $IPSIT depot/start $DEPOT_URI erzeugt zusätzlich eine Service instance !
  23. Package dependencies • Pakete benötigen andere Pakete. Definition im Manifest

    z.B.: depend pkg:/runtime/gcc4 type=require • müssen meistens bereits vor configure oder make installiert sein
  24. PKG="mynamespace/example" VERSION=1.0 MANIFEST=" set name=pkg.name value=\"my first package\" set name=pkg.description

    value=\"example package build with IPSit\" depend pkg:/runtime/gcc4 type=require " echo "$MANIFEST" | \ pfexec $IPSIT install-dependencies - ./configure
  25. ZFS rollback • immer gleicher Zustand vor dem build •

    Problem: Pakete müssen auch deinstalliert werden da evtl. Services enthalten sein können
  26. pfexec $IPSIT snapshot install pfexec make install echo "$MANIFEST" |

    \ pfexec $IPSIT package install $PKG@$VERSION - pfexec $IPSIT rollback --destroy install
  27. So weit, so gut • erstellen des Scripts via Copy

    & Paste kostet keine Zeit • Zeit kostet z.B. die Einstellungen für configure herauszubekommen oder File Layout zu scripten • nervig: Script führt alles immer aus
  28. PKG="mynamespace/example" VERSION=1.0 MANIFEST=" [...] " echo "$MANIFEST" | pfexec $IPSIT

    install-dependencies - ./configure make pfexec $IPSIT snapshot install pfexec make install echo "$MANIFEST" | pfexec $IPSIT package install $PKG@$VERSION - pfexec $IPSIT rollback --destroy install
  29. PKG="mynamespace/example" VERSION=1.0 MANIFEST=" [...] " echo "$MANIFEST" | pfexec $IPSIT

    install-dependencies - ./configure make pfexec $IPSIT snapshot install pfexec make install echo "$MANIFEST" | pfexec $IPSIT package install $PKG@$VERSION - pfexec $IPSIT rollback --destroy install
  30. PKG="mynamespace/example" VERSION=1.0 MANIFEST=" [...] " echo "$MANIFEST" | pfexec $IPSIT

    install-dependencies - ./configure make pfexec $IPSIT snapshot install pfexec make install echo "$MANIFEST" | pfexec $IPSIT package install $PKG@$VERSION - pfexec $IPSIT rollback --destroy install prepare build install package cleanup
  31. ACTIONS="prepare,build,install,package,cleanup" RANGE=$1 if $IPSIT should prepare $ACTIONS $RANGE; then echo

    "$MANIFEST" | pfexec $IPSIT install-dependencies - fi if $IPSIT should build $ACTIONS $RANGE; then ./configure make fi
  32. Aufruf des Scripts ohne Parameter 㱺 alles ausführen ./build.sh ./build.sh

    -package 㱺 prepare, build, install ./build.sh build-package 㱺 build, install ./build.sh package- 㱺 package, cleanup oder starten_ab-stoppen_vor
  33. Neue IPSit version und nichts funktioniert mehr?? Desktop CBE (

    /opt/dtbld/bin/env.sh ) löscht alle “unnötigen” Environment variables… Automatischer Scriptabruch wenn $IPSIT nicht definiert ist
  34. Neue IPSit version und nichts funktioniert mehr?? Desktop CBE (

    /opt/dtbld/bin/env.sh ) löscht alle “unnötigen” Environment variables… Automatischer Scriptabruch if [ -z "$IPSIT" ]; then exit 1; fi
  35. Neue IPSit version Desktop CBE ( /opt/dtbld/bin/env.sh ) löscht alle

    “unnötigen” Environment variables… export IPSIT_PROTOCOL=1.0 im Script angeben welche IPSit Protocol Version verwendet wird (1.0 ist default): Automatischer Scriptabruch if [ -z "$IPSIT" ]; then exit 1; fi
  36. Neue IPSit version Desktop CBE ( /opt/dtbld/bin/env.sh ) löscht alle

    “unnötigen” Environment variables… export IPSIT_PROTOCOL=1.0 im Script angeben welche IPSit Protocol Version verwendet wird (1.0 ist default): Automatischer Scriptabruch if [ -z "$IPSIT" ]; then exit 1; fi
  37. Automatischer Scriptabbruch IPSIT_PROTOCOL im Script setzen Desktop CBE ( /opt/dtbld/bin/env.sh

    ) . `$IPSIT /usr/bin/false \ create-env 1.0 /opt/dtbld/bin/env.sh` && \ $IPSIT unlink-env if [ $? -ne 0 ]; then exit 1; fi
  38. Automatischer Scriptabbruch IPSIT_PROTOCOL im Script setzen Desktop CBE ( /opt/dtbld/bin/env.sh

    ) . `$IPSIT /usr/bin/false \ create-env 1.0 /opt/dtbld/bin/env.sh` && \ $IPSIT unlink-env if [ $? -ne 0 ]; then exit 1; fi oder #!/bin/bash -e /usr/bin/false als erster Parameter wird immer ignoriert
  39. Automatischer Scriptabbruch IPSIT_PROTOCOL im Script setzen Desktop CBE ( /opt/dtbld/bin/env.sh

    ) . `$IPSIT /usr/bin/false \ create-env 1.0 /opt/dtbld/bin/env.sh` && \ $IPSIT unlink-env if [ $? -ne 0 ]; then exit 1; fi create-env gibt path zu temporärem File zurück
  40. Automatischer Scriptabbruch IPSIT_PROTOCOL im Script setzen Desktop CBE ( /opt/dtbld/bin/env.sh

    ) . `$IPSIT /usr/bin/false \ create-env 1.0 /opt/dtbld/bin/env.sh` && \ $IPSIT unlink-env if [ $? -ne 0 ]; then exit 1; fi das neue Environment wird in temporärem File übernommen aber IPSIT_* Variablen auch!
  41. Automatischer Scriptabbruch IPSIT_PROTOCOL im Script setzen Desktop CBE ( /opt/dtbld/bin/env.sh

    ) . `$IPSIT /usr/bin/false \ create-env --env DOWNLOADS 1.0 \ /opt/dtbld/bin/env.sh` && \ $IPSIT unlink-env if [ $? -ne 0 ]; then exit 1; fi mit --env können eigene Variablen übernommen werden, PREFIX* geht auch
  42. Automatischer Scriptabbruch IPSIT_PROTOCOL im Script setzen Desktop CBE ( /opt/dtbld/bin/env.sh

    ) Aufräumen . `$IPSIT /usr/bin/false \ create-env --env DOWNLOADS 1.0 \ /opt/dtbld/bin/env.sh` && \ $IPSIT unlink-env if [ $? -ne 0 ]; then exit 1; fi PID der Shell 㱺 Dateiname der temporären Datei…
  43. IPSit Commands Build in: help snapshot package rollback create-env unlink-env

    install-dependencies refresh should absdir “External”: tools/testenv package/changesetdiff package/getchangeset manifest/changesetentry manifest/direntry manifest/fmrientry depot/create depot/start depot/stop depot/available …
  44. $IPSIT tools/testenv \ "SOURCE = downloads directory" \ "PREF_I =

    install prefix e.g /opt/mynamespace" \ "PREF_S = storage prefix e.g /mycompany" if [ $? -ne 0 ]; then exit 1; fi tools/testenv • Variablen testen • Variablen dokumentieren • macht Scripts “shareable”
  45. IPSit Commands Build in: help snapshot package rollback create-env unlink-env

    install-dependencies refresh should absdir “External”: tools/testenv package/changesetdiff package/getchangeset manifest/changesetentry manifest/direntry manifest/fmrientry depot/create depot/start depot/stop depot/available …
  46. dev-build repository source cont-build repository source dist-build source repository VCS

    test-zone(s) source source source source source source Real-World Usage
  47. dev-build repository source cont-build repository source dist-build source repository VCS

    test-zone(s) source source source source source Eine Source Änderung… source ❸
  48. dev-build repository source cont-build repository source dist-build source repository VCS

    test-zone(s) source source source source source Einchecken in VCS source ❸
  49. dev-build repository source cont-build repository source dist-build source repository VCS

    test-zone(s) source source source source source Update aus VCS source ❸ ❸ ❸ ❸
  50. dev-build repository source cont-build repository source dist-build source repository VCS

    test-zone(s) source source source source source In der Realität: alle Pakete Neu! source
  51. Master-Buildscript müsste: • das jeweilige VCS “sprechen” um Updates zu

    erkennen • Inhalt des Repositories abfragen können
  52. pkg.opensolaris_changeset CHANGESET=9 PKG="mynamespace/example" VERSION=1.0 if ( ! $IPSIT package/changesetdiff $PKG

    \ "$CHANGESET" ); then exit 0; fi MANIFEST=" `$IPSIT manifest/changesetentry $CHANGESET` [ ... ] "
  53. pkg.opensolaris_changeset CHANGESET=10 PKG="mynamespace/example" VERSION=1.0 if ( ! $IPSIT package/changesetdiff $PKG

    \ "$CHANGESET" ); then exit 0; fi MANIFEST=" `$IPSIT manifest/changesetentry $CHANGESET` [ ... ] " bei jeder Änderung die neues Paket erfordert ändern
  54. pkg.opensolaris_changeset CHANGESET=10 PKG="mynamespace/example" VERSION=1.0 if ( ! $IPSIT package/changesetdiff $PKG

    \ "$CHANGESET" ); then exit 0; fi MANIFEST=" `$IPSIT manifest/changesetentry $CHANGESET` [ ... ] " wenn Paket mit gleichem CHANGESET vorhanden Script beenden
  55. pkg.opensolaris_changeset CHANGESET=10 PKG="mynamespace/example" VERSION=1.0 if ( ! $IPSIT package/changesetdiff $PKG

    \ "$CHANGESET" ); then exit 0; fi MANIFEST=" `$IPSIT manifest/changesetentry $CHANGESET` [ ... ] " Wert via “shortcut” in Manifest aufnehmen
  56. pkg.opensolaris_changeset • keine “mehrfach-builds” im Repository • evtl. massive Zeitersparniss

    bei run des Master-Buildscripts • völlig VCS unabhängig Resultat:
  57. IPSit Commands Build in: help snapshot package rollback create-env unlink-env

    install-dependencies refresh should absdir “External”: tools/testenv package/changesetdiff package/getchangeset manifest/changesetentry manifest/direntry manifest/fmrientry depot/create depot/start depot/stop depot/available …
  58. Lizenzen & Preise • OpenSource (keine Spendenannahme etc): Kostenlos •

    OpenSource (Spendenannahme etc.) , nicht kommerzielle private Nutzung: Gegenwert von 5 BigMacs™ • kommerzielle Nutzung: pro Benutzer der ein Buildscript startet 50 € (max. Staffelpreis inkl. MwSt.)
  59. Lizenzen & Preise • immer das Recht den Source-Code zu

    ändern sowie IPSit als Package zu hosten • kein Recht den Source-Code oder geänderten Source-Code als Files oder Package an Third- Parties weiterzugeben
  60. IPSit ⊕ super einfache Paketerstellung ⊕ umfassende Dokumentation ⊕ schnelle

    Einarbeitung dank Shell-Scripts ⊕ Baukasten-Prinzip: benutzen was man braucht ⊕ bei “Problemen” gibt es meistens etwas in IPSit ⊕ Support von komplexen Build-Szenarios ⊕ Scripts “shareable” ⊕ faire Lizenzen und Preise ⊕ als IPS Paket installierbar