summaryrefslogtreecommitdiff
path: root/gbp.tex
blob: 7e33b5c86d91f91c4a4d05cecbbce6a62a76d70d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
%\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,\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/<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 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, amand
\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/<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 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=<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 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 <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