pacchetti-e-repository.rst 16.6 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
**********************
Pacchetti e Repository
**********************

La distribuzione FUSS comprende un repository di pacchetti aggiuntivi
rispetto alla base (Debian), disponibile all'indirizzo
https://archive.fuss.bz.it/ ed ospitato su ``isolda.fuss.bz.it`` nella
directory ``/iso/repo``.

Build dei pacchetti
===================

Nei repository del software sviluppato per FUSS è presente la directory
``debian`` contenente i file necessari per la generazione dei pacchetti
``.deb``.

Setup
-----

Per effettuare build locali dei pacchetti è necessario installare alcuni
strumenti di sviluppo::

23
    # apt install devscripts dput-ng dh-systemd
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

.. note:: Assicurarsi di aver installato anche i Recommends dei
   pacchetti (questo è il comportamento di default di ``apt``, a meno
   che non lo si sia disabilitato manualmente), in particolare nel caso
   di ``dput-ng``.

Inoltre è necessario impostare le variabili di ambiente ``DEBEMAIL`` e
``DEBFULLNAME``, contenenti rispettivamente il nome completo e l'email
dello sviluppatore, che verranno usate per aggiornare alcuni metadati.

Per usare ``dput-ng`` per effettuare gli upload serve configurarlo
creando il file ``~/.dput.d/profiles/fuss-<versione>.json`` contenente::

    {
        "method": "sftp",
        "fqdn": "archive.fuss.bz.it",
        "incoming": "/iso/incoming/<versione>",
        "allow_dcut": false,
        "allowed-distribution": {},
        "codenames": null,
        "post_upload_command": "ssh -S none isolda.fuss.bz.it 'sudo /iso/bin/post-upload'",
        "hooks": [
            "allowed-distribution",
            "checksum",
            "suite-mismatch" 
        ]
    }

dove ``<versione>`` è ``jessie`` per FUSS server e ``stretch`` per FUSS
client.

Assicurarsi inoltre di poter accedere via ssh a ``isolda.fuss.bz.it`` senza
ulteriori opzioni; ad esempio potrebbe essere necessario aggiungere
quanto segue a ``~/.ssh/config``::

    Host isolda.fuss.bz.it
        User root

.. note::  dput-ng usa paramiko per effettuare le connessioni ssh;
   questo implica che le opzioni impostate direttamente in
   ``~/.ssh/config`` vengono lette correttamente, ma non c'è supporto
   per l'uso di ``Include`` per suddividere la configurazione su più
   file.

   Inoltre non verrà salvato il fingerprint dei server, ma verrà chiesto
   ogni volta di verificarlo.

   A luglio 2018 i fingerprint di isolda sono::

       256 SHA256:aLTgA+Trj5iYo0dl0i8Q82aigs3K/dPwDbazrvG95YY root@isolda (ECDSA)
       256 SHA256:7i6j0jXPWRrW6LXDGbR+HWr3AFJi6gGSmdW41uBRJV4 root@isolda (ED25519)
       2048 SHA256:OkP1maDf0pSIGCdq1mph8oI8CTADMrFXfe3aty608SA root@isolda (RSA)

Chroot
''''''

I pacchetti ``.deb`` vanno buildati all'interno della versione di
destinazione in cui andranno installati; il modo più semplice per farlo
è creare una chroot ed installarvi gli strumenti di base per la
generazione di pacchetti::

    # mkdir <versione>_build
    # debootstrap <versione> <versione>_build (<mirror>)
    # chroot <versione>_build
    # apt install debhelper devscripts dpkg-dev

dove ``<versione>`` è al momento (settembre 2018) ``jessie`` per il FUSS
server e ``stretch`` per il FUSS client.

93
94
95
96
In alternativa, vedere la sezione :ref:`cowbuilder` per gestire
automaticamente le chroot, inclusa l'installazione automatica delle
eventuali dipendenze necessarie.

97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
Clone del repository
--------------------

Clonare il repository del progetto desiderato::

    git clone https://work.fuss.bz.it/git/<progetto>


Il branch da buildare per l'upload è ``master``, da aggiornare nel caso
in cui si abbia già un clone locale del repository::

    git checkout master
    git pull

Versionamento
-------------

Per poter pubblicare il pacchetto, è necessario incrementare il numero
115
116
di versione nel file ``debian/changelog``.

Elena Grandi's avatar
Elena Grandi committed
117
118
119
Il numero di versione da dare dipende dal tipo di pacchetto, come
descritto nella sezione :ref:`versionamento` e nelle guide di sviluppo
degli specifici pacchetti, ma nella maggior parte dei casi sarà da
120
121
122
123
124
125
incrementare il patch level (es. da 9.0.5-1 a 9.0.6-1).

.. note:: Nei pacchetti contenenti programmi in python è generalmente
   necessario mantenere aggiornato il numero di versione anche in
   ``setup.py``; come per debsrc sopra questo dovrebbe essere citato nel
   README dei pacchetti.
126
127
128
129

Il programma ``dch``,  permette di automatizzare l'editing del file
``debian/changelog`` che contiene la versione del pacchetto.

130
131
132
* Quando si iniziano a fare modifiche usare il comando ``dch -v
  <nuova_versione>`` per creare una nuova stanza ed aprire il changelog
  nell'editor di default.
133

134
135
  Verrà impostato il numero di versione richiesto e la release speciale
  ``UNRELEASED`` che indica che le modifiche sono ancora in lavorazione.
136

137
138
139
140
  Si può anche usare ``dch`` senza opzioni: in questo modo se l'ultima
  stanza risulta ``UNRELEASED`` il file verrà aperto così com'è, mentre
  se l'ultima stanza riporta una release come ``unstable`` ne viene
  creata una nuova incrementando il numero di versione.
141

142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
  Attenzione che in quest'ultimo caso dch potrebbe non essere in grado
  di indovinare la versione corretta: verificare e nel caso correggere.
  Inoltre, nel caso in cui non si sia elencati tra i Maintainer e
  Uploaders in ``debian/control`` verrà aggiunta una riga ``Non
  Maintainer Upload`` che per noi non è rilevante e va tolta.

  Nel caso in cui più persone facciano modifiche, dch provvederà a
  suddividerle in sezioni intestate con il nome della persona che ha
  effettuato la modifica.

* Descrivere le modifiche effettuate, possibilmente indicando i ticket
  di riferimento da cui nascono le richieste di modifica.

* Man mano che si fanno modifiche, descriverle se necessario nel
  changelog, usando ``dch`` senza opzioni, come descritto sopra.

* Quando si è pronti a pubblicare il pacchetto, modificare ``UNRELEASED``
  con ``unstable`` nella prima riga; questo si può fare anche con il
  comando ``dch -r``.
161

162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
Build
-----

Alcuni pacchetti, come octofussd necessitano della preventiva creazione
del tar dei sorgenti originali, come specificato nel README dei
rispettivi repository; in tal caso prima di eseguire il comando
precedente è necessario eseguire, nella directory principale del
repository::

    debian/rules debsrc

Per eseguire il build del pacchetto, nella directory principale del
repository eseguire::

    dpkg-buildpackage -us -uc

Se la procedura va a buon fine, nella directory superiore si troveranno
i pacchetti ``.deb`` generati, e anche i file ``.changes``, ``.dsc`` e
``.tar.gz`` con il sorgente del pacchetto.

Elena Grandi's avatar
Elena Grandi committed
182
183
184
185
186
187
188
189
190
La procedura potrebbe fallire con un errore contenente::

    Unmet build dependencies: <pacchetto1> <pacchetto2>

in tal caso installare semplicemente i pacchetti e riprovare.
Tali dipendenze sono elencate nel campo ``Build-Depends`` del file
``debian/control``, nel caso ci si voglia assicurare di averle già
installate prima di buildare.

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
Test
----

Tramite ``dpkg -i <nomefile>.deb`` si puo' installare e testare il
pacchetto. Si ricorda che ``dpkg`` non risolve le dipendenze, quindi darà un
errore nel caso si sia aggiunta una nuova dipendenza.

Per installare le dipendenze mancanti si può usare il comando::

    apt -f install

Un altro comando utile è ``dpkg -c <nomefile>.deb`` per verificare i
file presenti nel pacchetto.

Commit e push
-------------

Eseguire il commit su git di tutte le modifiche apportate, indicando se
possibile nel commit log il numero di ticket associato alla modifica,
con la dicitura "refs #NUMERO".

Un metodo veloce è eseguire::

    git commit -a -m "<modifiche effettuate>. refs #NumeroTicket" 

e successivamente eseguire il push con::

    git push

Upload
------

Per uploadare il pacchetto buildato con ``dput-ng`` è sufficiente usare
il comando::

    dput fuss-<versione> nomepacchetto_versione_arch.changes

Nel caso si voglia procedere manualmente invece si possono copiare i
file generati su ``isolda`` nella directory ``/iso/incoming/<versione>``
ed aggiornare il repository con il comando::

    # /iso/bin/post-upload

Verificare poi che in ``/iso/incoming/<versione>`` non siano rimasti
file spuri, e nel caso cancellarli a mano.

237
238
.. _cowbuilder:

239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
Build dei pacchetti con cowbuilder
==================================

cowbuilder e pbuilder sono degli strumenti per gestire delle chroot
all'interno delle quali effettuare build di pacchetti in un ambiente
pulito e abbastanza isolato dal sistema base.

Buildare pacchetti all'interno di un sistema isolato è utile per evitare
influenze da parte del proprio sistema (con librerie ed altre dipendenze
già installate, magari in versioni non standard), ma è anche comodo nel
caso si vogliano generare pacchetti per distribuzioni diverse da quelle
in uso (ad esempio buildare per jessie o stretch su un sistema buster)

Setup
-----

255
256
Oltre a quanto indicato nelle istruzioni di setup generale, installare
cowbuilder e pbuilder::
257

258
   # apt install pbuilder cowbuilder
259

260
261
Quindi creare le chroot base per le distribuzioni attualmente (agosto
2018) in uso stretch e jessie::
262

263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
   # cowbuilder --create --distribution stretch --debootstrap debootstrap \
     --basepath /var/cache/pbuilder/base-fuss-stretch.cow
   # cowbuilder --create --distribution jessie --debootstrap debootstrap \
     --basepath /var/cache/pbuilder/base-fuss-jessie.cow

Aggiungere i repository di backports e fuss alle chroot base appena
create: fare login nella chroot::

   # cowbuilder --login --save-after-login \
     --basepath /var/cache/pbuilder/base-fuss-stretch.cow

ed effettuare le modifiche a ``/etc/apt/sources.list`` e l'aggiunta
della chiave (sostituendo ``<mirror>`` con un mirror debian opportuno,
ad esempio quello già presente in ``/etc/apt/sources.list``::

   # echo 'deb <mirror> stretch-backports main' >> /etc/apt/sources.list
   # echo 'deb http://archive.fuss.bz.it/ stretch main contrib' \
     >> /etc/apt/sources.list
Elena Grandi's avatar
Elena Grandi committed
281
   # apt install gnupg
282
283
   # apt-key add - # incollare i contenuti di
                   # https://archive.fuss.bz.it/apt.key seguiti da ctrl-d
Elena Grandi's avatar
Elena Grandi committed
284
285
   # apt remove gnupg
   # apt autoremove
286
287
288
   # apt update
   # exit

Elena Grandi's avatar
Elena Grandi committed
289
290
291
292
293
294
295
296
.. note::

   nella chroot minimale da stretch in poi non è presente gnupg, che è
   necessario per l'uso di apt-key add: lo installiamo per l'operazione
   e rimuoviamo subito dopo per essere certi che l'immagine sia sempre
   minimale e continuare ad accorgersi di eventuali dipendenze non
   esplicitate nei pacchetti che generiamo.

297
298
Ripetere la stessa cosa per la chroot ``jessie``.

299

300
301
Nel caso in cui le chroot siano state create da un po' di tempo è
opportuno aggiornarle, coi seguenti comandi::
302

303
304
   # cowbuilder --update --basepath /var/cache/pbuilder/base-fuss-stretch.cow/
   # cowbuilder --update --basepath /var/cache/pbuilder/base-fuss-jessie.cow/
305
306
307
308

Build
-----

309
310
311
312
313
314
Una volta clonato o aggiornato il repository del pacchetto, aggiornata
la versione come sopra, e se necessario genererato la tarball sorgente
con ``debian/rules debsrc`` si può quindi usare ``pdebuild`` per
eseguire la build del pacchetto all'interno di una chroot opportuna
(sostituendo ``stretch`` con ``jessie`` nel caso del fuss server)::

315
   $ DIST=stretch pdebuild --use-pdebuild-internal --pbuilder cowbuilder -- --basepath /var/cache/pbuilder/base-fuss-stretch.cow/
316
317
318
319
320
321
322
323
324
325
326
327

``pdebuild`` provvederà autonomamente ad installare le dipendenze
necessarie all'interno della chroot e ad effettuare la build.

Generalmente, l'infrastruttura di build [#infrastruttura]_ è in grado di
capire dal numero di versione ed altri indizi se sia necessario o meno
includere la tarball ``.orig`` tra ciò che va uploadato.
Nel caso in cui però si stia effettuando un backport questo non è
automatico: per il primo backport di una certa versione upstream è
necessario prevedere l'inclusione della tarball sorgente con l'opzione
``--debbuildopts "-sa"``, ovvero::

328
   $ DIST=stretch pdebuild --buildresult ../build/ --use-pdebuild-internal --pbuilder cowbuilder --debbuildopts "-sa" -- --basepath /var/cache/pbuilder/base-fuss-stretch.cow/
329
330
331
332
333
334
335
336
337
338
339

A questo punto si può procedere con test, commit+push ed upload come nel
caso generale.

.. [#infrastruttura] In particolare, l'inclusione o meno della tarball sorgente è
   decisa ed effettuata da ``dpkg-genchanges``, richiamato da
   ``dpkg-buildpackage`` al quale ``pdebuild`` passa le opzioni
   specificate con il parametro ``--debbuildopts``.

   Generalmente questo avviene in automatico, senza bisogno di
   preoccuparsi di chi faccia cosa.
340

Elena Grandi's avatar
Elena Grandi committed
341
342
.. _versionamento:

Elena Grandi's avatar
Elena Grandi committed
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
Policy di versionamento
=======================

Software sviluppato per FUSS
----------------------------

Per i pacchetti sviluppati specificatamente per FUSS possono esserci
policy specifiche indicate nella relativa guida sviluppatori e/o nei
README dei progetti.

In generale, lo schema usato prevede che la major version corrisponda
alla versione di fuss per cui è rilasciato il pacchetto (che a sua volta
corrisponde alla versione di debian su cui è basta).
Un pacchetto per FUSS 8 avrà quindi versione tipo 8.X.Y, uno per FUSS 9
9.X.Y eccetera.

I pacchetti possono essere nativi o meno: nel primo caso il numero di
versione è del tipo 9.X.Y sia per il pacchetto che in ``setup.py``,
mentre nel secondo si aggiunge un numero di revisione, es. 9.X.Y-Z;
quest'ultimo va incrementato quando la nuova versione presenta modifiche
nella pacchettizzazione (ovvero nella directory debian), ma non nel
codice.

I pacchetti nativi devono anche avere ``3.0 (native)`` nel file
``debian/source/format``, mentre i pacchetti non-nativi devono avere
``3.0 (quilt)`` e per buildarli è necessario generare una tarball
sorgente (``<nome>_<9.X.Z>.orig.tar.gz``), ad esempio tramite
``debsrc``.

Rebuild di pacchetti di debian
------------------------------

Per i pacchetti presi da debian e ribuildati da noi seguiamo una
convenzione simile a quella usata dai backports_ aggiungendo ``~fussN-X``
al numero di versione, dove N è la versione di FUSS per la quale stiamo
preparando il pacchetto e X la revisione del backport.

.. _backports: https://backports.debian.org/

Se si fa una rebuild di un pacchetto che ad esempio ha versione 1.2.3-4
la nostra versione sarà 1.2.3-4~fuss9+1 (+2 per una rebuild successiva
con modifiche alla sola pacchettizzazione, eccetera).

386
387
Configurazione del repository
=============================
Elena Grandi's avatar
Elena Grandi committed
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

Il file ``/iso/repo/conf/distributions`` definisce le distribuzioni
utilizzate nel repository, con snippet di configurazione come::

    Origin: FUSS
    Label: FUSS
    Suite: jessie
    Codename: jessie
    Version: 8.0
    Architectures: i386 amd64 source
    Components: main contrib
    Description: FUSS 8.0
    SignWith: C00D47EF47AA6DE72DFE1033229CF7A871C7C823

inoltre nello stesso file sono definite le versioni precedenti e future
della distribuzione. Al momento attuale la configurazione riguarda fino
alla versione 10 di Debian (codename ``buster``).

Le varie distribuzioni sono raggiungibili da apt usando, in
``/etc/apt/sources.list``::

    deb http://archive.fuss.bz.it CODENAME_DISTRIBUZIONE main contrib

e la chiave con la quale viene firmato il repository si può installare
su una macchina debian o derivate eseguendo, da root::

   # wget -qO - https://archive.fuss.bz.it/apt.key | apt-key add -

Aggiunta di nuova distribuzione e/o nuovo repository
----------------------------------------------------

Oltre al file ``/iso/repo/conf/distributions`` per indicare la nuova
distribuzione e/o nuovo repository, è necessario:

* Creare una cartella per lo spool di incoming dei pacchetti in
  ``/iso/incoming/<nuova distribuzione>``
* Aggiungere la descrizione e il path relativo al punto precedente nel
  file ``/iso/repo/conf/incoming``
* Aggiungere allo script ``/iso/bin/post-upload`` l'esecuzione del
  processing del nuovo path di incoming. In questo script vanno tolte
  quelle non più usate quando è certo che non ci saranno più nuovi
  pacchetti per una specifica distribuzione.
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

Pacchetti particolari
=====================

coova-chilli
------------

Il pacchetto coova-chilli presente su archive.fuss.bz.it è generato da
un nostro repository https://work.fuss.bz.it/git/coova-chilli copia del
repository upstream https://github.com/coova/coova-chilli.git alla quale
abbiamo aggiunto alcune modifiche di pacchettizzazione.

In particolare, per la release 1.4 è presente un branch ``1.4-patched``
con dei bugfix alla pacchettizzazione che sono stati nel frattempo
`accettati upstream <https://github.com/coova/coova-chilli/pull/333>`_
per le versioni successive.

Per effettuare nuove build della versione 1.4 è quindi necessario usare
il branch ``1.4-patched``, mergiandovi eventuali modifiche upstream
desiderate; usando ``git-buildpackage`` si dovrà usare::

   $ gbp buildpackage --git-debian-branch=1.4-patched [--git-pbuilder]

Per versioni successive si possono invece usare i tag pubblicati da
upstream.

Altri branch presenti sul nostro repository contengono la
pacchettizzazione per versioni precedenti di FUSS, di utilità solo
storica.