From 6b9cccae9aeda771b655680a09fb371718e44f31 Mon Sep 17 00:00:00 2001 From: Guido Günther Date: Sat, 13 Jul 2013 10:17:15 +0200 Subject: Initial commit --- gbp.pdf | Bin 0 -> 165641 bytes gbp.tex | 492 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 492 insertions(+) create mode 100644 gbp.pdf create mode 100644 gbp.tex diff --git a/gbp.pdf b/gbp.pdf new file mode 100644 index 0000000..ec174a2 Binary files /dev/null and b/gbp.pdf 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 +{ + \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,...\} + \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/ +\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 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/ $\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 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= +\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 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 --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