Projet

Général

Profil

GitHotfix23 » Historique » Version 16

Daniel Dehennin, 18/07/2013 15:27

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