Il ne s’agissait à l’origine que d’un aide-mémoire, mais j’ai décidé d’en faire un post de blog pour qu’il puisse servir à d’autres personnes dans la même situation que moi.
J’ai commencé à suivre ces dernières semaines les réunions hebdomadaires animées par John Newbery sur irc. Ces réunions ont pour but d’analyser chaque semaine un pull request (proposition de modification du code) sur Bitcoin Core, et il est demandé aux participants de compiler une version précise de Bitcoin sur Github (une branche, dans le jargon de git) pour pouvoir comparer les changements apportés dans le code et exécuter les tests.
N’étant pas développeur, j’étais vraiment peu à l’aise avec ça. Je pense que je n’étais pas le seul, et John Newbery nous a donné quelques indications sur ses méthodes de travail personnelles, que j’ai essayé de résumer ici sous une forme plus lisible.
L’objectif est d’installer Bitcoin Core dans une VM avec Vagrant, puis de copier en local une branche spécifique, compiler, faire les tests et visualiser les modifications du code.
Cet article vise à partager ce que j’ai appris, mais peut certainement être amélioré. J’envisage notamment de remplacer Virtualbox par Docker, mais je n’évalue pas encore bien le pour et le contre.
Prérequis : Vagrant et Virtualbox
Virtualbox est un logiciel de virtualisation, c’est-à-dire qu’il permet d’émuler un système d’exploitation au sein d’un environnement virtuel sur votre ordinateur.
Vagrant est un autre logiciel qui simplifie la configuration et la gestion des VM (Virtual Machines) de Virtualbox.
Si vous êtes sur Linux Ubuntu, il suffit d’ouvrir un terminal et d’installer ces deux logiciels avec le gestionnaire de packages :
sudo apt install virtualbox && sudo apt install vagrant
Pour Windows et MacOS, suivez les instructions sur leur site respectif.
btc-dev
Le fichier de configuration Vagrant de John Newbery est disponible dans ce repo Github. Il vous suffit donc de cloner ce repo et celui de Bitcoin Core dans un même dossier en local :
git clone https://github.com/jnewbery/btc-dev.git && git clone https://github.com/bitcoin/bitcoin.git
Maintenant, vous n’avez plus qu’à effectuer une ligne de commande dans le dossier btc-dev :
cd btc-dev
vagrant up
La VM va se configurer toute seule, ce qui peut prendre un peu de temps.
Checkout la bonne branche
Maintenant vous pouvez ouvrir un terminal dans votre VM, puis vous rendre dans le dossier bitcoin qui se trouve à la racine.
vagrant ssh
cd /bitcoin
Afin de pouvoir télécharger facilement les branches correspondantes à une pull request précise, nous allons ajouter une ligne dans le fichier .git/config
. Ouvrez ce fichier avec votre éditeur de texte préféré, et localisez la section suivante :
[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/*
url = git@github.com:bitcoin/bitcoin.git
Ajoutez la ligne suivante en bas de cette section :
fetch = +refs/pull/*/head:refs/remotes/origin/pr/*
Désormais, vous pouvez ajouter toutes les pull requests avec git fetch origin
puis git checkout pr/$PR
(en remplaçant $PR
par le numéro de la pull request qui vous intéresse), ou alors télécharger une branche précise et l’ajouter à votre repo en local avec une seule ligne git fetch origin pull/7324/head:pr-7324
. Plus d’info sur ces manipulations dans ce gist.
Compiler
Pour compiler le code de la branche dans laquelle vous vous trouvez, il suffit d’exécuter une à une les commandes suivantes :
./autogen.sh
./configure
(Attention si vous utilisez mon fichier de bootstrap, la commande sera la suivante : ./configure BDB_LIBS="-L${BDB_PREFIX}/lib -ldb_cxx-4.8" BDB_CFLAGS="-I${BDB_PREFIX}/include"
)
make
Lire le code
Vous pouvez identifier les commits relatifs à cette pull request avec git log --oneline upstream/master..
, puis voir les modifications d’un commit à l’autre avec la ligne suivante :
git diff $A..$B
(A étant le commit le plus ancien).
Vous pouvez aussi explorer toutes les modifications par commit avec la commande suivante, mais il faut être vraiment à l’aise avec difftool
, personnellement j’ai encore des difficultés avec ça !
for commit in `git log master..HEAD --oneline | cut -d' ' -f1 | tac`; do git log -1 $commit; git difftool ${commit}{^,} --dir-diff; done
Exécuter les tests
make check
test/functional/test_runner.py
En savoir plus
Si vous êtes intéressé par les aspects techniques du développement de Bitcoin, vous trouverez toutes les informations pour participer au PR Review Club ici.
Il y a certainement des choses inexactes ou qui peuvent être améliorées dans cet article, donc n’hésitez pas à me laisser un commentaire.
[EDIT 25/09/2019] Quelques modifications sur la commandes make
et les tests. J’ai eu des soucis ces derniers temps avec le fichier bootstrap.sh proposé par John Newbery, j’ai donc fait ma propre version, beaucoup plus rudimentaire, mais qui semble marcher pour l’instant : https://github.com/BobleChinois/btc-dev/tree/bootstrap_failed_workaround.