%\documentclass[draft]{beamer}
\documentclass[compress]{beamer}
\mode<presentation>
{
  \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 <agx@sigxcpu.org>}
}

\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,...\}
  \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=weirdsourcdir/
}
\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/<version>
\item<4-> Debian tag: debian/<debian-version>
\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 package importieren}
\begin{frame}[fragile]
\frametitle{Importieren I}
\begin{itemize}
	\item ...aus Dateisystem
{\small
\begin{verbatim}
	gbp import-dsc python-dateutil_1.4.1-1.dsc
\end{verbatim}}
	\item ...von URL
{\small
\begin{verbatim}
	gbp import-dsc --download http://....dsc
\end{verbatim}}
	\item  ...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 ...alle alten Versionen auf einen Rutsch:
{\small
\begin{verbatim}
        gbp import-dscs *.dsc
\end{verbatim}}
        \item ...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
        # ... rewind and repeat, oder 
        # git commit, reset, amand
\pause
        # Dann
        gbp dch ---release ---auto
        gbp buildpackage ---git-tag
\end{semiverbatim}}
\end{frame}

\section{Der spannende Teil...}
\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}
\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/<release> $\rightarrow$ upstream/<release>
\item Backports: backports/<release>
\item Security Updates: security/<release>
\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 dh --with quilt, patchsys-quilt, source format 3.0 (quilt)
\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}
	git checkout master; 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=<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 <agx@sigxcpu.org>
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/<release>
  \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 naming patterns
\item Sign tags
\item Use pristine-tar
\item Build commands (e.g.  pbuilder)
\item Source Tree exportieren (ähnlich svn-buildpackage)
\item Tarball Kompression
\item Import Filter
\item Hooks
\end{itemize}
\pause
\begin{verbatim}
gbp <command> --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
