Projet

Général

Profil

GitHotfix23 » Historique » Version 7

Daniel Dehennin, 06/06/2013 17:23

1 1 Daniel Dehennin
h1. Application d’un hotfix à passer en stable 2.3
2 1 Daniel Dehennin
3 1 Daniel Dehennin
h2. Prérequis
4 1 Daniel Dehennin
5 1 Daniel Dehennin
* Le paquet est à distribuer dans eole-2.3-updates
6 5 Daniel Dehennin
* « *@$DEV_NAME@* » : le prénom et nom du développeur qui fait la correction
7 1 Daniel Dehennin
* « *@$ISSUE@* » : numéro de la demande redmine
8 1 Daniel Dehennin
* « *@$PAQUET@* » : le nom du paquet (et du dépôt git)
9 1 Daniel Dehennin
* « *@$SRC@* » : la branche source 
10 1 Daniel Dehennin
* « *@$PKG@* » : la branche de packaging
11 1 Daniel Dehennin
* « *@$COMMIT_ID@* » : l’identifiant du commit de la branche 2.3 depuis lequel on fait le correctif
12 6 Daniel Dehennin
* « *@$PROD_VERSION@* » : numéro de version du paquet diffusé
13 1 Daniel Dehennin
* « *@$NEW_VERSION@* » : nouveau numéro de version comprenant le correctif
14 1 Daniel Dehennin
15 1 Daniel Dehennin
h2. Déterminer la version à corriger
16 1 Daniel Dehennin
17 1 Daniel Dehennin
<pre>
18 1 Daniel Dehennin
root@server:~# dpkg -l $PAQUET
19 1 Daniel Dehennin
ii $PAQUET ${PROD_VERSION} <arch> <description>
20 1 Daniel Dehennin
</pre>
21 1 Daniel Dehennin
22 1 Daniel Dehennin
La version est ${PROD_VERSION}.
23 1 Daniel Dehennin
24 1 Daniel Dehennin
h2. Déterminer le commit de la branche source
25 1 Daniel Dehennin
26 1 Daniel Dehennin
Le source qui a servi à la compilation du paquet debian est accessible par le tag « *@debian/${PROD_VERSION}@* ».
27 1 Daniel Dehennin
28 1 Daniel Dehennin
Ce tag pointe sur un commit de la branche de packaging « *@$PKG@* ».
29 1 Daniel Dehennin
30 1 Daniel Dehennin
À partir de ce tag, il faut déterminer, en remontant l’historique, le premier commit de la branch source, c’est à dire le premier commit présent dans les deux branches.
31 1 Daniel Dehennin
32 1 Daniel Dehennin
Cela peut être fait à la main en parcourant le log de « *@debian/${PROD_VERSION}@* » :
33 1 Daniel Dehennin
34 1 Daniel Dehennin
<pre>
35 1 Daniel Dehennin
moi@work:~/src/$PAQUET (master)$ git log debian/${PROD_VERSION}
36 1 Daniel Dehennin
</pre>
37 1 Daniel Dehennin
38 1 Daniel Dehennin
Il est possible de le faire de façon programmatique en déterminant quelle est la base de fusion entre le tag et la branche source avec la commande « *@git merge-base@* » :
39 1 Daniel Dehennin
40 1 Daniel Dehennin
<pre>
41 1 Daniel Dehennin
moi@work:~/src/$PAQUET (master)$ git merge-base debian/${PROD_VERSION} $SRC
42 1 Daniel Dehennin
$COMMIT_ID
43 1 Daniel Dehennin
</pre>
44 1 Daniel Dehennin
45 1 Daniel Dehennin
L’identifiant du commit est noté « *@$COMMIT_ID@* ».
46 1 Daniel Dehennin
47 1 Daniel Dehennin
h2. Créer une branche pour le hotfix
48 1 Daniel Dehennin
49 1 Daniel Dehennin
Il faut créer une nouvelle branche basée sur « *@$COMMIT_ID@* » afin de n’appliquer que la correction, nous lui donnons un nom en rapport avec une demande, par exemple avec la demande № « *@$ISSUE@* » :
50 1 Daniel Dehennin
51 1 Daniel Dehennin
<pre>
52 1 Daniel Dehennin
moi@work:~/src/$PAQUET (master)$ git checkout -b hotfix/$ISSUE $COMMIT_ID
53 1 Daniel Dehennin
moi@work:~/src/$PAQUET (hotfix/$ISSUE)$
54 1 Daniel Dehennin
</pre>
55 1 Daniel Dehennin
56 1 Daniel Dehennin
h2. Corriger le bug
57 1 Daniel Dehennin
58 1 Daniel Dehennin
Et ne rien faire d’autre que corriger le bug afin de limiter au maximum les problèmes.
59 1 Daniel Dehennin
60 1 Daniel Dehennin
Normalement il ne devrait y avoir qu’un seul commit.
61 1 Daniel Dehennin
62 1 Daniel Dehennin
À voir au cas par cas, si une partie de la correction est à intégrer ailleurs alors cela peut-être fait en plusieurs commits.
63 1 Daniel Dehennin
64 1 Daniel Dehennin
h2. Créer une branche pour empaqueter le correctif
65 1 Daniel Dehennin
66 1 Daniel Dehennin
Il faut créer une nouvelle branche basée sur le paquet à corriger (représenté par le tag « *@debian/${PROD_VERSION}@* ») :
67 1 Daniel Dehennin
68 1 Daniel Dehennin
<pre>
69 1 Daniel Dehennin
moi@work:~/src/$PAQUET (master)$ git checkout -b pkg/hotfix/$ISSUE debian/${PROD_VERSION}
70 1 Daniel Dehennin
moi@work:~/src/$PAQUET (pkg/hotfix/$ISSUE)$
71 1 Daniel Dehennin
</pre>
72 1 Daniel Dehennin
73 1 Daniel Dehennin
h2. Intégrer le correctif
74 1 Daniel Dehennin
75 1 Daniel Dehennin
<pre>
76 1 Daniel Dehennin
moi@work:~/src/$PAQUET (pkg/hotfix/$ISSUE)$ git merge --no-ff hotfix/$ISSUE
77 1 Daniel Dehennin
</pre>
78 1 Daniel Dehennin
79 1 Daniel Dehennin
h2. Mettre à jour debian/changelog
80 1 Daniel Dehennin
81 1 Daniel Dehennin
Cela peut-être fait en ajoutant une entrée à la main ou via l’utilitaire « *@dch@* » fourni par le paquet debian « *@devscripts@* ».
82 1 Daniel Dehennin
83 1 Daniel Dehennin
Nous allons détailler étape par étape afin de vérifier avant de publier une bêtise ;-)
84 1 Daniel Dehennin
85 1 Daniel Dehennin
h3. Déterminer le nouveau numéro de version
86 1 Daniel Dehennin
87 1 Daniel Dehennin
* Si le précédent numéro n’était pas celui d’un correctif, ajouter le suffix « *@+1@* », par exemple, si « *@PROD_VERSION=2.3-eole76@* », cela donne: « *@2.3-eole76+1@* »
88 1 Daniel Dehennin
* Sinon, incrémenter le chiffre après le « *@+@* », par exemple, si « *@PROD_VERSION=2.3-eole76+2@* », cela donne: « *@2.3-eole76+3@* »
89 1 Daniel Dehennin
90 1 Daniel Dehennin
La nouvelle version est notée « *@$NEW_VERSION@* ».
91 1 Daniel Dehennin
92 1 Daniel Dehennin
h3. Vérifier les informations de log
93 1 Daniel Dehennin
94 1 Daniel Dehennin
Il ne devrait y avoir qu’un commit de différence entre « *@$COMMIT_ID@* » et la branche de hotfix « *@hotfix/$ISSUE@* », (sauf cas exceptionnel), nous utilisons un format court utilisable comme ligne de
95 1 Daniel Dehennin
« *@debian/changelog@* » :
96 1 Daniel Dehennin
97 1 Daniel Dehennin
<pre>
98 1 Daniel Dehennin
moi@work:~/src/$PAQUET (pkg/hotfix/$ISSUE)$ git log --format='[%h] %s' ${COMMIT_ID}..hotfix/$ISSUE
99 1 Daniel Dehennin
</pre>
100 1 Daniel Dehennin
101 1 Daniel Dehennin
h3. Modifier debian/changelog
102 1 Daniel Dehennin
103 1 Daniel Dehennin
De façon automatique avec l’utilitaire « *@dch@* », il s’agit d’utiliser correctement les informations recueillies jusqu’à présent :
104 1 Daniel Dehennin
105 1 Daniel Dehennin
<pre>
106 1 Daniel Dehennin
moi@work:~/src/$PAQUET (pkg/hotfix/$ISSUE)$ dch --no-auto-nmu --multimaint --multimaint-merge \
107 1 Daniel Dehennin
    --distribution=eole-2.3-updates \
108 1 Daniel Dehennin
    -v $NEW_VERSION -- \
109 1 Daniel Dehennin
    $(git log --format='[%h] %s' ${COMMIT_ID}..hotfix/$ISSUE)
110 1 Daniel Dehennin
</pre>
111 1 Daniel Dehennin
112 1 Daniel Dehennin
h3. Commit
113 1 Daniel Dehennin
114 1 Daniel Dehennin
<pre>
115 1 Daniel Dehennin
moi@work:~/src/$PAQUET (pkg/hotfix/$ISSUE)$ git add debian/changelog
116 1 Daniel Dehennin
moi@work:~/src/$PAQUET (pkg/hotfix/$ISSUE)$ git commit \
117 2 Daniel Dehennin
    -m "Nouveau paquet compilé par $DEV_NAME: $PAQUET ($NEW_VERSION) eole-2.3-updates depuis pkg/hotfix/$ISSUE"
118 1 Daniel Dehennin
</pre>
119 1 Daniel Dehennin
120 1 Daniel Dehennin
h2. Compiler le paquet à la main sur les serveurs de build
121 1 Daniel Dehennin
122 1 Daniel Dehennin
Demander à Joël Cuissinat ou Daniel Dehennin ;-)
123 1 Daniel Dehennin
124 1 Daniel Dehennin
Cela permet de faire une validation en plus.
125 1 Daniel Dehennin
126 1 Daniel Dehennin
<pre>
127 1 Daniel Dehennin
moi@work:~/src/$PAQUET ($SRC)$ git archive --prefix=${PAQUET}-2.3/ \
128 1 Daniel Dehennin
    -o ${PAQUET}-2.3.tar.gz \
129 1 Daniel Dehennin
    pkg/hotfix/$ISSUE
130 7 Daniel Dehennin
moi@work:~/src/$PAQUET ($SRC)$ ssh eole@lucid32 mkdir tmp/$PAQUET/
131 7 Daniel Dehennin
moi@work:~/src/$PAQUET ($SRC)$ scp ${PAQUET}-2.3.tar.gz eole@lucid32:tmp/$PAQUET/
132 1 Daniel Dehennin
moi@work:~/src/$PAQUET ($SRC)$ ssh eole@lucid32
133 7 Daniel Dehennin
eole@lucid32:~$ cd tmp/$PAQUET/ && tar -xzvf ${PAQUET}-2.3.tar.gz
134 7 Daniel Dehennin
eole@lucid32:~/tmp/$PAQUET$ cd ${PAQUET}-2.3
135 7 Daniel Dehennin
eole@lucid32:~/tmp/$PAQUET/${PAQUET}-2.3$ dpkg-buildpackage -rfakeroot
136 1 Daniel Dehennin
</pre>
137 1 Daniel Dehennin
138 1 Daniel Dehennin
h2. Publier le paquet sur le dépôt debian
139 1 Daniel Dehennin
140 1 Daniel Dehennin
Demander à Joël Cuissinat ou Daniel Dehennin ;-)
141 1 Daniel Dehennin
142 1 Daniel Dehennin
Ils le feront directement depuis le serveur de build
143 1 Daniel Dehennin
144 1 Daniel Dehennin
<pre>
145 1 Daniel Dehennin
eole@lucid32:~/tmp/${PAQUET}-2.3$ dput eole ../${PAQUET}_2.3*.changes
146 1 Daniel Dehennin
</pre>
147 1 Daniel Dehennin
148 1 Daniel Dehennin
h2. Faire tester le correctif présent sur *@test-eoleng.ac-dijon.fr@*
149 1 Daniel Dehennin
150 1 Daniel Dehennin
Même si le paquet compilé est publié, il n’est pas lâché dans la nature directement, il y a un sas de sécurité avec *@test-eoleng.ac-dijon.fr@*.
151 1 Daniel Dehennin
152 1 Daniel Dehennin
Une fois que l’utilisateur confirme que la chose est bien corrigée, le paquet sera envoyé sur les dépôts de production.
153 1 Daniel Dehennin
154 1 Daniel Dehennin
h2. Éviter les régressions
155 1 Daniel Dehennin
156 1 Daniel Dehennin
Il ne faut pas oublier d’intégrer les modifications à la branche $SRC afin que le prochain paquet aie lui aussi le correctif
157 1 Daniel Dehennin
158 1 Daniel Dehennin
h3. Intégrer à « *@$SRC@* »
159 1 Daniel Dehennin
160 1 Daniel Dehennin
<pre>
161 1 Daniel Dehennin
moi@work:~/src/$PAQUET (pkg/hotfix/$ISSUE)$ git checkout $SRC
162 1 Daniel Dehennin
moi@work:~/src/$PAQUET ($SRC)$ git merge --no-ff hotfix/$ISSUE
163 1 Daniel Dehennin
</pre>
164 1 Daniel Dehennin
165 1 Daniel Dehennin
h3. Publier le tag du nouveau paquet
166 1 Daniel Dehennin
167 1 Daniel Dehennin
Afin de garder une trace et de permettre une possible correction sur le paquet corrigé, il faut publier une référence qui sera utilisable dans la phase 2 de cette documentation « *@Déterminer le commit
168 1 Daniel Dehennin
de la branche source@* ».
169 1 Daniel Dehennin
170 1 Daniel Dehennin
Pour cela nous créons un tag signé par GPG :
171 1 Daniel Dehennin
172 1 Daniel Dehennin
<pre>
173 1 Daniel Dehennin
moi@work:~/src/$PAQUET ($SRC)$ git tag -s \
174 1 Daniel Dehennin
    -m "Debian release $NEW_VERSION" \
175 1 Daniel Dehennin
    debian/$NEW_VERSION \
176 1 Daniel Dehennin
    pkg/hotfix/$ISSUE
177 1 Daniel Dehennin
</pre>
178 1 Daniel Dehennin
179 1 Daniel Dehennin
Et on le publie sur le dépôt git central :
180 1 Daniel Dehennin
181 1 Daniel Dehennin
<pre>
182 1 Daniel Dehennin
moi@work:~/src/$PAQUET ($SRC)$ git push dev-eole debian/$NEW_VERSION
183 1 Daniel Dehennin
</pre>
184 1 Daniel Dehennin
185 1 Daniel Dehennin
h2. Nettoyage
186 1 Daniel Dehennin
187 1 Daniel Dehennin
On peut maintenant :
188 1 Daniel Dehennin
189 1 Daniel Dehennin
* Supprimer la branche « *@hotfix/$ISSUE@* » car elle est intégrée à « *@$SRC@* » ;
190 1 Daniel Dehennin
* Supprimer la branche « *@pkg/hotfix/$ISSUE@* » car le prochain paquet intégrera le correctif via la branche « *@$SRC@* ».