UUGRN:Buildsystem

Aus UUGRN

Ein wichtiger Bestandteil der UUGRN-Infrastruktur ist das Buildsystem. Hier werden alle Aspekte der FreeBSD Systempflege verwaltet, zum Beispiel Update von Source und Ports, Bau von Userlands und Packages.

Hauptkomponenten[Bearbeiten]

Das Buildsystem für FreeBSD 9.x existiert im Jail fbsd9. Dieses Jail ist aktuell auf top3offline beheimatet, könnte aber insgesamt auf jedem anderen FreeBSD 9.x-System laufen.

Verzeichnisse[Bearbeiten]

Auf (nahezu) allen Jail existiert ein Verzeichnis /freebsd. Dieses ist überall read-only gemountet, lediglich in fbsd9 ist es read-write verfügbar, da es hier maintaint wird.

Hier existiert /freebsd/upstream welches vor allem src/ und ports/ enthält, welche täglich durch svn und portsnap aktualisiert werden

Images[Bearbeiten]

Basierend auf dem aktuellen Stand von upstream/src und upstream/ports werden täglich (nightly-Builds) entsprechende tarballs erzeugt. Diese sollten tagesaktuell sein, die "buildworld"-Images werden nur bei Bedarf neu erzeugt.

Vanilla
Das vanilla-Image ist das unverfälsche Ergebnis von "make buildworld installworld distribution" ohne irgendwelche weiteren Anpassungen.
UUGRN
Das uugrn-Image basiert auf dem vanilla-Image und wird durch zahlreiche Schritte für den Betrieb bei UUGRN optimiert, zB /freebsd, Zeitzone, DNS, Mail, cron, periodic, …. Das UUGRN-Image ist das Basis-Image für UUGRN-Jails, jedoch ohne Zusatzsoftware.
Verzeichnisbaum
/freebsd/upstream/images/
├── 9.1-RELEASE
│   ├── FreeBSD-9.1-RELEASE-amd64-image-vanilla.tar
│   ├── FreeBSD-9.1-RELEASE-amd64-image-vanilla.tar.sha256
│   ├── FreeBSD-9.1-RELEASE-src.tar
│   └── FreeBSD-9.1-RELEASE-src.tar.sha256
├── ports.tar
└── ports.tar.sha256
/freebsd/uugrn/nightly/images/
├── FreeBSD-9.1-RELEASE-amd64-image-uugrn.tar
└── FreeBSD-9.1-RELEASE-amd64-image-uugrn.tar.sha256


Nightly-Builds[Bearbeiten]

# ===============================================
# NIGHTLY Build
# 
# 1)    update sources (svn up)                 tarball
# 2)    update ports (portsnap)                 tarball
# 3)    build vanilla-image                     tarball
# 4)    customize/build jail-image              tarball
# 5)    customize/build uugrn-image             tarball
# 6)    checksum, upload to FTP
# 7)    pre-fetch distfiles of active ports
# ===============================================


Package-Build[Bearbeiten]

Neben den täglichen Updates basierend auf /usr/src existiert auch ein eigener Mechanismus zum Bau von vorkompilierten Packages, basierend auf /usr/ports.

Jeder Build findet in einem eigenen chroot-Verzeichnis statt. Ein solches chroot wird in mehren Stufen erzeugt, ausgehend von den Upstream-Images (/usr/src, /usr/ports und "world", dem Ergebnis von "make buildworld distribution" auf /usr/src).

Die Vorgehensweise umfasst grob:

/build/tools/new_build.sh[Bearbeiten]

  • Neuen Build erzeugen unter Verwendung
    • des vanilla-Images, also dem aktuellen Userland-Image aus den nightly-Builds
    • des ports-Images, also dem tagesaktuellen Stand von /usr/ports (portsnap)
    • des src-Images, also dem tagesaktuellen Stand von /usr/src (subversion)
  • Build-chroot anlegen
  • Images reinkopieren
  • Build-Scripte und Dateien nach chroot/build/ kopieren
  • run.sh-Script anlegen, über das man eine shell im chroot/ bekommt (/build/tools/new_build.sh)


Beispiel-Terminalausgabe von /build/tools/new_build.sh
[root@fbsd9 /build]# tools/new_build.sh
2013-08-24 00:48:22: 1) set up /build/20130824004822/
/build/20130824004822
2013-08-24 00:48:22: 2) set up /build/20130824004822//root/
2013-08-24 00:48:22:    --> create /build/20130824004822/
2013-08-24 00:48:22:    --> populate /build/20130824004822//root/ from /freebsd/upstream/images/9.1-RELEASE/FreeBSD-9.1-RELEASE-amd64-image-vanilla.tar
2013-08-24 00:48:29:    --> populate /usr/src/ from /freebsd/upstream/images/9.1-RELEASE/FreeBSD-9.1-RELEASE-src.tar
2013-08-24 00:48:56:    --> populate /usr/ports/ from /freebsd/upstream/images/ports.tar
/usr/ports
/usr/ports/packages
/usr/ports/distfiles
2013-08-24 00:49:24:    --> populate chroot/root/
/build/files/.vimrc -> /build/20130824004822//root//root/.vimrc
2013-08-24 00:49:24:    --> populate chroot/build/
/build
/build/files/build.sh -> /build/20130824004822//root//build/build.sh
/build/files/var_db_ports.tar -> /build/20130824004822//root//build/var_db_ports.tar
2013-08-24 00:49:24:    --> populate /var/db/ports
2013-08-24 00:49:24:    --> populate chroot/etc/
/etc/resolv.conf -> /build/20130824004822//root//etc/resolv.conf
/etc/make.conf -> /build/20130824004822//root//etc/make.conf
2013-08-24 00:49:24: 3) create /build/20130824004822//run.sh

/build/YYYYMMDDHHMMSS/run.sh[Bearbeiten]

  • mounten von /dev
  • starten einer Shell (csh)
Terminalausgabe run.sh
[root@fbsd9 /build]# /build/20130824004822/run.sh
root@fbsd9:/ # 
root@fbsd9:/ # pkg_info 
pkg_info: no packages installed

/build/build.sh[Bearbeiten]

  • manuelle Ausführung von /build/build.sh
    • bootstrappen von portuppgrade und Abhängigkeiten
    • Bau von essenziellen Packages in den gewünschen Versionen (db46, sqlite3, apache24, mysql55, perl5.14)
    • (Neu) Bau von allen anderen Packages, ca 50-100 Packages werden derzeit explizit gebaut was mit Abhängigkeiten ca 800 Packages ergibt

Sofern der Build ohne erkennbare Fehler durchgelaufen ist, werden alle Packages nach /freebsd/uugrn/dev/ kopiert, wo sie für halb- und vollautomatische QA-Prozesse zur Verfügung stehen.

Außerdem wird dieser Build in Form eines Images eingefroren und unter /freebsd/uugrn/dev/images/ abgelegt, zum Beispiel /freebsd/uugrn/dev/images/FreeBSD-9.1-RELEASE-amd64-image-build-20130824004822.tar . Dieses Build-Image wird dann im Rahmen des QA-Prozesses untersucht. Sollte es hier keine Auffälligkeiten geben, werden die enthaltenen Ports und Packages und Images aus diesem Build in den QA-Pool übernommen um weitere Prüfungen vorzunehmen.


Port-Auswahl für den Buildprozess[Bearbeiten]

Die hier aufgelisteten Ports sind teilweise voneinander abhängig.

Auszug aus /build/build.sh
SHELLS="lang/perl5.14 shells/bash shells/bash-completion shells/zsh shells/ksh93"
TOOLS="archivers/zip archivers/unzip sysutils/tree sysutils/cmdwatch sysutils/cpdup ports-mgmt/pkg_cutleaves ports-mgmt/portaudit databases/mysql55-client databases/mysqltuner ports-mgmt/portupgrade sysutils/screen sysutils/tmux graphics/ImageMagick graphics/graphviz graphics/GraphicsMagick databases/sqlite3 "
GNU="sysutils/coreutils textproc/gsed lang/gawk archivers/gtar misc/findutils misc/gnuls "
SEC="security/gnupg1 security/pinentry-curses security/sudo security/stunnel sysutils/pwgen "  
NET="ftp/curl ftp/wget net/rsync security/nmap net-im/climm irc/muh irc/znc "
SERVICES="security/xinetd security/oidentd net/hidentd net-mgmt/nagios-plugins databases/mysql55-server irc/inspircd ftp/vsftpd  "
MAIL="mail/fetchmail mail/procmail mail/dovecot2 mail/mutt mail/mailman"

EDITORS="editors/vim-lite sysutils/vimpager editors/emacs-nox11 editors/nano" 
APPS="irc/irssi irc/irssi-scripts news/slrn misc/mc news/tin www/lynx www/w3m www/links "
DEVEL="devel/git devel/subversion "
WEB="www/apache24 www/lighttpd devel/otrs"
PHP="lang/php5 archivers/php5-bz2 archivers/php5-zip archivers/php5-zlib converters/php5-iconv converters/php5-iconv converters/php5-mbstring databases/php5-mysql databases/php5-mysqli databases/php5-pdo databases/php5-pdo_mysql databases/php5-pdo_odbc databases/php5-pdo_sqlite databases/php5-propel databases/php5-sqlite3 devel/php5-dav devel/php5-gettext devel/php5-json devel/php5-readline ftp/php5-curl ftp/php5-ftp graphics/php5-exif graphics/php5-ffmpeg graphics/php5-gd mail/php5-imap math/php5-bcmath math/php5-gmp misc/php5-calendar net/php5-soap net/php5-sockets net/php5-xmlrpc security/php5-filter security/php5-hash security/php5-mcrypt security/php5-openssl sysutils/php5-fileinfo sysutils/php5-posix textproc/php5-simplexml textproc/php5-xml textproc/php5-xmlreader textproc/php5-xmlwriter textproc/php5-xsl www/php5-session www/php5-tidy lang/php5-extensions " 
FUN="misc/figlet misc/figlet-fonts"

PRE="databases/db46 databases/sqlite3 www/apache24 databases/mysql55-server lang/perl5.14"
ALL="${SHELLS} ${TOOLS} ${GNU} ${MAIL} ${SEC} ${NET} ${SERVICES} ${EDITORS} ${APPS} ${DEVEL} ${WEB} ${PHP} ${FUN}" 

Zusätzlich zu den hier aufgelisteten Ports werden auch alle Abhängigkeiten als Package gebaut.

Jail Prototypen bei UUGRN[Bearbeiten]

Aufbau der verschiedenen Jail-Prototypen, ausgehend vom "reinen FreeBSD" ("vanilla"):

vanilla
basiert auf aktuellem /usr/src und make buildworld installworld distribution
uugrn
basiert auf vanilla und enthält darüber hinaus nur Anpassungen für den Jail-Betrieb bei UUGRN und keine Packages.
small
basiert auf uugrn und darüber hinaus die Packages bash coreutils sudo gsed findutils nano screen portupgrade pkg_cutleaves portaudit plus alle Abhängigkeiten.
medium
basiert auf small und darüber hinaus auf den Packages vim-lite emacs mc gnupg mutt slrn tin irssi lynx w3m wget rsync procmail figlet fetchmail plus alle Abhängigkeiten.
large
basiert auf medium und darüber hinaus auf den Packages links rar unrar zip zsh gawk ksh93 pwgen unix2dos muh climm graphviz ImageMagick dovecot2 apache24 php5 php5-extensions plus alle Abhängigkeiten.
webstatic
basiert auf uugrn und enthält ansonsten nur das Package apache24 plus alle Abhängigkeiten.
webphp
basiert auf webstatic und darüber hinaus die Packages php5 php5-extensions ImageMagick plus alle Abhängigkeiten

Dies so erzeugten Images werden basierend auf dem automatisch gebauten "vanilla" und "uugrn"-Image mit den aktuellen Packages versorgt und als Image abgelegt unter /freebsd/uugrn/qa/images/. Dabei ist zu beachten, dass der Package-Bau Prozess nicht automatisiert und täglich abläuft sondern manuell. Das Ergebnis dieses Prozesses ist eine Sammlung von Packages, die für das jeweilige Userland-Release, z.B. 9.1-RELEASE gebaut wurden.

Die Images werden täglich für "QA" neu gebaut.

QA-Prozess[Bearbeiten]

Packages[Bearbeiten]

Für den Package-Build Prozess findet eine formale, automatische Qualitätssicherung statt.

Hier wird etwa untersucht, ob essenzielle Bibliotheken fehlen, und alle Paketabhängigkeiten exakt passen oder ob es Abweichungen zwischen den Packages und den installierten Dateien gibt (checksummen), passiert wenn Packages unerkannte Konflikte haben und Dateien mit verschiedenem Inhalt überschrieben werden.

Die erfolgreich geprüften Packages landen dann im "QA"-Pool.

Falls die Packages fehlerhaft sind, müssen die Fehler korrigiert werden und in einem neuen Build erneut gebaut werden. "Durchgefallene" Packages werden nicht weiter verwendet und werden gelöscht.

Images[Bearbeiten]

Basierend auf dem nightly-Build des uugrn-Images und den Packages im QA-Pool werden täglich und automatisiert die jeweiligen aufeinander aufbauenden Images erzeugt.

Ein manueller Rollout dieser Images in temporäre Jails soll Gewissheit schaffen, dass die so gebauten Images insich konsistent sind. Das findet halbautomatisch statt.

Abschluss der Prüfung[Bearbeiten]

Sofern alle Images für "tauglich" befunden sind, werden die Images und auch die verwendeten Packages in den LIVE-Pool (/freebsd/uugrn/live/) kopiert. Außerdem werden alle Images und Packages auf ftp.uugrn.org hochgeladen und können von dort für den Bau eigener (Sub)Jails verwendet werden.