%\documentclass[draft]{beamer} \documentclass[compress]{beamer} \mode { \usetheme{Warsaw} \setbeamertemplate{footline}{} \setbeamertemplate{headline}{} } \usepackage{pgfpages} \usepackage[english]{babel} \usepackage[utf8]{inputenc} \usepackage{times} \usepackage[T1]{fontenc} \title{Debian Pakete bauen mit Git} \subtitle{Eine kurze Einführung} \author[Guido Günther] { Guido Günther {\it } } \date[HE0]{Hackin' Erpel 0, Erpel} % Voraussetzung: ein bischen Git Wissen % * Branches, Merges, Tags \begin{document} \section*{Einfrührung} \begin{frame} \titlepage \end{frame} \begin{frame} \frametitle{''Routineaufgaben'' beim Debian Paketbau} \tableofcontents \end{frame} \begin{frame} \frametitle{Die Akteure} \begin{itemize} \item {\it dh} - erledigt Standardtasks automatisch, flexibel bei Besonderheiten \item {\it git} - kann Upstream speichern, Merges und Cherry-Picks \item {\it gbp} - Schnittstelle zwischen Debian Paketierung und Git \item {\it pbuilder,cowbuilder} - Bauen in einer sauberen Umgebung mit minimalen Abhängigkeiten \item ({\it pristine-tar} - Reproduzieren des exakten Upstream Tarballs) \end{itemize} \end{frame} \section{Neues Debian Paket erstellen} % Ein Debian Source Paket besteht aus Upstream Tarball und Debian Modifikationen % Es erzeugt eiun oder mehrere biinary Pakete % arch all und any \begin{frame}[fragile] \frametitle{Upstream Tarball importieren} \begin{itemize} \item Leeres Git Repository erstellen \begin{verbatim} git init python-dateutil cd $_ \end{verbatim} \item Tarball importieren \begin{verbatim} gbp import-orig \ ../python-dateutil_1.4.1.orig.tar.gz \end{verbatim} \end{itemize} \end{frame} \begin{frame} \frametitle{debian/ erstellen} Das gehört zur Paketierung: \begin{itemize} \item {\it rules}: Bauanleitung um Binär-Paket zu bauen \item {\it control}: Meta-Informationen \item {\it changelog}: Historie \item {\it copyright}: Lizenz-Information \item {\it \{pre,post\}\{inst,rm\}}: Maintainer-Skripte \item Unterstützer: watch, gbp.conf, Dateien für dh\_*-Helfer \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{Debhelper} Nimmt einem die ganze Arbeit in {\it debian/rules} ab: \begin{itemize} \item Bauen ({\it dh\_auto\_*}) \item Integration in das System \begin{itemize} \item Dateien installieren, Verzeichnisse anlegen \item Init-Skripte \item Manpages \item Shared Libraries \item Menu Dateien \item Icons \item Logrotate \item MD5 Prüfsummen \end{itemize} \end{itemize} \begin{itemize} \item dh\_*: $\rightarrow$ debian/\{install,dirs,docs,\ldots \} \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{Debhelper} debian/rules: \begin{semiverbatim} #!/usr/bin/make -f \%: dh $@ \pause\alert<2>{ override_dh\_auto\_make: ./autogen.sh dh\_auto\_make override\_dh\_install: dh\_install ---sourcedir=weirdsourcedir/ } \end{semiverbatim} \end{frame} \begin{frame}[fragile] \frametitle{dh-make} Erstellt ein Gerüst für {\it debian/}: \begin{itemize} \item dh\_make \begin{verbatim} dh_make -p python-dateutil_1.4.1 \end{verbatim} \item Aber: *.ex *.EX \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{Das erste Mal bauen} \begin{verbatim} git add debian git commit -m"Add Debian packaging" gbp buildpackage \end{verbatim} \end{frame} \section{Neue Upstream Version importieren} \begin{frame}[fragile] \frametitle{Tarball importieren} \begin{itemize} % was passiert % pristine-tar \item Entweder wie oben \item Oder Import from upstream URL: {\small \begin{verbatim} gbp import-orig --uscan \end{verbatim}} \end{itemize} \pause Importiert Upstream Sourcen auf {\it upstream} Branch, Debian Paketierung erfolgt auf {\it master}. \end{frame} \begin{frame}[fragile] \frametitle{Wie sieht das Repository aus?} {\tiny \begin{block}{Commits, Tags, Branches} \begin{semiverbatim} * 23667ff (HEAD, \alert<2>{master}) Bump standards version * eef58a9 Merge commit 'upstream/1.5' |\\ | * 46ca33a (tag: \alert<3>{upstream/1.5}, \alert<1>{upstream}) Imported Upstream version 1.5 * | 23396fc Document changes and release 1.4.1-2 * | e181ff2 Remove comment * | 539f202 (tag: \alert<4>{debian/1.4.1-1}) Imported Debian patch 1.4.1-1 |/ * 4e5dda0 (tag: \alert<3>{upstream/1.4.1}) Imported Upstream version 1.4.1 \end{semiverbatim} \end{block} } \begin{itemize} \item<1-> Upstream branch: upstream \item<2-> Debian branch: master \item<3-> Upstream tag: upstream/ \item<4-> Debian tag: debian/ \item<5-> Das sind die Defaults. \item<6-> Patches: patch-queue/master \item<7-> Binary delta: pristine-tar \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{Changelog aktualisieren} Changelog Schreiben ist mühsam, wir haben ja schon eine Git Commit-Historie: % Erklären was hier genau passiert (commits seit letzter Upstream Version) % Snapshot Versionsnummer \begin{verbatim} gbp dch --snapshot --auto gbp dch --release --auto \end{verbatim} % Dazu später mehr \end{frame} \section{Ein bestehendes Debian Paket importieren} \begin{frame}[fragile] \frametitle{Importieren I} \begin{itemize} \item \ldots aus Dateisystem {\small \begin{verbatim} gbp import-dsc python-dateutil_1.4.1-1.dsc \end{verbatim}} \item \ldots von URL {\small \begin{verbatim} gbp import-dsc --download http://....dsc \end{verbatim}} \item \ldots via apt {\small \begin{verbatim} gbp import-dsc --download python-dateutil \end{verbatim}} \pause \item geht auch inkrementell % z.B. für NMUs, Sponsoring \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{Importing II} \begin{itemize} \item \ldots alle alten Versionen auf einen Rutsch: {\small \begin{verbatim} gbp import-dscs *.dsc \end{verbatim}} \item \ldots oder von snapshotes.debian.org: {\small \begin{verbatim} gbp import-dscs --debsnap \ python-dateutil \end{verbatim}} \end{itemize} \end{frame} \section{Ändern, bauen, testen, ändern, bauen, testen} \begin{frame}[fragile] \frametitle{Typischer Ablauf} {\small \begin{semiverbatim} gbp dch ---snapshot ---auto gbp buildpackage ---git-ignore-new \pause # \ldots rewind and repeat, oder # git commit, reset, amend \pause # Dann gbp dch ---release ---auto gbp buildpackage ---git-tag \end{semiverbatim}} \end{frame} \section{Der spannende Teil\ldots } \begin{frame}[fragile] \frametitle{Reproduzierbar bauen} \begin{itemize} \item pbuilder/cowbuilder erzeugen ein Chroot in dem Pakete gebaut werden können \begin{verbatim} git-pbuilder create # einmalig \end{verbatim} \pause \item ...das kann {\it gbp buildpackage} benutzen: \begin{verbatim} gbp buildpackage --git-pbuilder \end{verbatim} \pause \item ...oder für eine andere Release \begin{verbatim} DIST=wheezy git-pbuilder create # einmalig gbp buildpackage --git-pbuilder \ --git-dist=wheezy \end{verbatim} \pause \item Aktualisieren \begin{verbatim} git-pbuilder update \end{verbatim} \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{CI eines Paketes mit Jenkins} Warum? \pause \begin{itemize} \item Unit-Tests regelmässig ausführen \item Testbarer Snapshot für User immer verfügbar \item CPU-Leistung/Plattenplatz von Build-Slaves Nutzen \item Builds und Tests für verschiedene Architekturen \pause \begin{itemize} \item Jenkins Git Plugin \item /u/s/d/git-buildpackage/example/jenkins-scratchbuilder \end{itemize} \pause \item TODO: Jenkins Job Template \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{Mehrere Branches für unterschiedliche Releases} Sid, \pause Experimental, \pause Stable Point Releases, \pause Backports, \pause Security Upadates, ... - Wie sieht das Layout in Git aus? \pause {\it Empfehlung:} \begin{itemize} \item debian/ $\rightarrow$ upstream/ \item Backports: backports/ \item Security Updates: security/ \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{Quilt Patches} \begin{itemize} \item Patches: \textit{debian/patches/*.\{patch,diff\}} \item Apply: debian/patches/series \item Source format 3.0 (quilt) ist sehr verbreitet \end{itemize} \pause \begin{itemize} \item Patches importieren: {\small \begin{verbatim} gbp pq import \end{verbatim}} % Beispiel mit Branch \item Patches exportieren: {\small \begin{verbatim} gbp pq export \end{verbatim}} \item Patches aktualisieren: {\small \begin{verbatim} gbp pq rebase \end{verbatim}} \item Patch-queue Branch loswerden: {\small \begin{verbatim} gbp pq drop \end{verbatim}} \pause \end{itemize} Einfaches Patch System - Alternativen: TopGit, TNT \end{frame} \begin{frame}[fragile] \frametitle{Remote Repositories} Remote repositories erzeugen und Upstream und Debian Branch dort hin pushen: \small{ \begin{verbatim} gbp create-remote-repo \ --remote-url-pattern= \end{verbatim}} \end{frame} \begin{frame}[fragile] \frametitle{Git-buildpackage Hooks} {\it git-buildpackage} kann durch Hooks erweitert werden: \begin{itemize} \item postbuild: --git-postbuild z.B. um Lintian aufzurufen: \begin{verbatim} --git-postbuild='lintian $GBP_CHANGES_FILE' \end{verbatim} \item posttag: --git-posttag z.B. {\it /u/s/d/git-buildpackage/examples/gbp-posttag-push} \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{Changelogs im Detail} \begin{itemize} \item {\it gbp dch} findet neue Upstream Versionen automatisch \item Snapshots verwenden bis zur Release \item Tags in Commit Messages vermeiden doppelte Buchführung \begin{itemize} \item Git-Dch: \{Ignore, Full, Topic\} \item Closes: \item Thanks: \end{itemize} \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{More on gbp dch} Commit-Message: {\tiny \begin{verbatim} commit a7fe7c4678a48072c11bb57fd1f99ca7b8118158 Author: Guido Günther Date: Thu Jan 28 19:03:33 2010 +0100 Add basic bash completion for git-buildpackage Thanks: Siegfried-Angel Gevatter Closes: #567313 \end{verbatim}} debian/changelog: {\tiny \begin{verbatim} * [a7fe7c4] Add basic bash completion for git-buildpackage (Closes: #567313) - thanks to Siegfried-Angel Gevatter \end{verbatim}} \note{explain: tags: Closes, Thanks, (Git-Dch), commitid} \end{frame} \begin{frame} \frametitle{cl2vcs} Changelogs mit Historie verknüpfen: \begin{itemize} \item --id-length: Changelog entry $\leftrightarrow$ Commit \item Über den Vcs-Git: link in {\it debian/control} finden wir das Debian Git Repo \pause \item $\rightarrow$ Also kann man die Histories browsen ohne zu clonen: \end{itemize} \url{https://honk.sigxcpu.org/cl2vcs/?pkg=libvirt} \note<2>{also show JS example} \end{frame} \begin{frame}[fragile] \frametitle{Upstream benutzt git} \begin{itemize} \item Upstream clonen und Debian Paketierbranch einführen: \begin{itemize} \item --upstream-branch=master \item --debian-branch=debian/ \item --upstream-tag='v\%(version)s' \end{itemize} \item Wenn man den Upstream Tarball 1:1 verwenden will: {\it --upstream-vcs-tag} \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{Konfiguration} \begin{itemize} \item $/etc/git$-$buildpackage/gbp.conf$ \item \textasciitilde/.gbp.conf \item ($<$repo$>$/.git/gbp.conf) \item $<$repo$>$/debian/gbp.conf \end{itemize} \pause \begin{itemize} \item Tag- and branch Namensmuster festlegen \item Tags signieren \item pristine-tar benutzen \item Build Kommands (z.B. git-pbuilder) \item Source Tree exportieren (ähnlich svn-buildpackage) \item Tarball Kompression \item Import Filter \item Hooks \end{itemize} \pause \begin{verbatim} gbp --help \end{verbatim} shows the current defaults.\\ \end{frame} % Warum machen wir das mit git: % upstream sourcen unter versionskontrolle ist super \begin{frame} \frametitle {git-buildpackage} \begin{itemize} \item Wiki:\\ \url{https://honk.sigxcpu.org/piki/projects/git-buildpackage/} \item Manual:\\ \url{http://honk.sigxcpu.org/projects/git-buildpackage/manual-html/gbp.html} \end{itemize} \pause \vskip0pt plus.5fill \begin{itemize} \item Thanks: git, devscripts, pristine-tar, contributors and bug reporters \item Fragen? Kommentare? \end{itemize} \end{frame} \end{document} %% LocalWords: make debian fragile Tarball verbatim uscan Git %% LocalWords: Commit