summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuido Günther <agx@sigxcpu.org>2013-07-13 10:17:15 +0200
committerGuido Günther <agx@sigxcpu.org>2013-07-13 10:17:15 +0200
commit6b9cccae9aeda771b655680a09fb371718e44f31 (patch)
tree9acd3adf2bffda60cd2281c75e3c5b391895a3ac
Initial commit
-rw-r--r--gbp.pdfbin0 -> 165641 bytes
-rw-r--r--gbp.tex492
2 files changed, 492 insertions, 0 deletions
diff --git a/gbp.pdf b/gbp.pdf
new file mode 100644
index 0000000..ec174a2
--- /dev/null
+++ b/gbp.pdf
Binary files differ
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