Projet

Général

Profil

GitHotfix23 » Historique » Version 15

Daniel Dehennin, 19/06/2013 11:23

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