From 6b9cccae9aeda771b655680a09fb371718e44f31 Mon Sep 17 00:00:00 2001
From: Guido Günther <agx@sigxcpu.org>
Date: Sat, 13 Jul 2013 10:17:15 +0200
Subject: Initial commit

---
 gbp.tex | 492 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 492 insertions(+)
 create mode 100644 gbp.tex

(limited to 'gbp.tex')

diff --git a/gbp.tex b/gbp.tex
new file mode 100644
index 0000000..2cd3a24
--- /dev/null
+++ b/gbp.tex
@@ -0,0 +1,492 @@
+%\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
-- 
cgit v1.2.3

