Projet

Général

Profil

GitHotfix23 » Historique » Version 19

Daniel Dehennin, 14/10/2013 16:52

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