Questions fréquentes

Pour toute question ou si vous avez besoin d'aide, consultez Obtenir de l'aide.

Qu'est-ce que Bazel ?

Bazel est un outil qui automatise les compilations et les tests des logiciels. Les tâches de compilation prises en charge comprennent l'exécution de compilateurs et de liens pour créer des bibliothèques et des programmes exécutables, et l'assemblage de packages déployables pour Android, iOS et d'autres environnements cibles. Bazel est semblable à d'autres outils comme Make, Ant, Gradle, Buck, Pantalons et Maven.

Quelle est la particularité de Bazel ?

Bazel a été conçu pour s'adapter à la manière dont nous développons le logiciel. Il possède les fonctionnalités suivantes:

  • Compatibilité multilingue: Bazel est compatible avec de nombreux langages et peut être étendu pour prendre en charge des langages de programmation arbitraires.
  • Langage de compilation de haut niveau: les projets sont décrits dans le langage BUILD, un format texte concis qui décrit un projet en tant qu'ensembles de petites bibliothèques interconnectées, de binaires et de tests. À l'inverse, avec des outils comme Make, vous devez décrire des fichiers individuels et des appels de compilateur.
  • Compatibilité multiplate-forme: le même outil et les mêmes fichiers BUILD peuvent être utilisés pour créer des logiciels pour différentes architectures, et même pour différentes plates-formes. Chez Google, nous utilisons Bazel pour créer toutes sortes d'applications, qu'il s'agisse d'applications de serveurs exécutées sur les systèmes de nos centres de données ou d'applications clientes exécutées sur des téléphones mobiles.
  • Reproductibilité: dans les fichiers BUILD, chaque bibliothèque de test et binaire doit spécifier complètement ses dépendances directes. Bazel utilise ces informations de dépendance pour savoir quels éléments doivent être recompilés lorsque vous modifiez un fichier source et quelles tâches peuvent s'exécuter en parallèle. Cela signifie que toutes les compilations sont incrémentielles et produisent toujours le même résultat.
  • Évolutivité: Bazel peut gérer de grands builds. Chez Google, il est fréquent qu'un binaire du serveur ait 100 000 fichiers sources, et les compilations où aucun fichier n'a été modifié prennent environ 200 ms.

Pourquoi Google n'utilise-t-il pas...?

  • Make, Ninja: ces outils offrent un contrôle très précis des commandes appelées à créer des fichiers, mais il appartient à l'utilisateur d'écrire des règles correctes.
    • Les utilisateurs interagissent avec Bazel à un niveau supérieur. Par exemple, Bazel possède des règles intégrées pour les tests "Java" et "C++ binaire", ainsi que des notions telles que "target platform" et "host platform". Ces règles ont été testées pour être infaillibles.
  • Ant et Maven sont principalement destinés à Java, tandis que Bazel gère plusieurs langues. Bazel encourage les subdivisions de codebases dans des blocs réutilisables plus petits et ne peut recompiler que celles qui doivent être recompilées. Cela accélère le développement lorsque vous utilisez des codebases plus volumineux.
  • Gradle: les fichiers de configuration Bazel sont beaucoup plus structurés que ceux de Gradle, ce qui permet à Bazel de comprendre exactement ce que fait chaque action. Cela favorise davantage le parallélisme et améliore la reproductibilité.
  • Pants, Buck: les deux outils ont été créés et développés par d'anciens Googleurs sur Twitter et Foursquare, et Facebook respectivement. Elles ont été modélisées d'après Bazel, mais leurs ensembles de caractéristiques sont différents. Par conséquent, elles ne constituent pas une alternative viable pour nous.

D'où vient Bazel ?

Bazel est la version de l'outil qui permet à Google de créer son logiciel serveur en interne. D'autres logiciels, tels que les applications mobiles (iOS et Android) qui se connectent à nos serveurs, ont également été développés.

Avez-vous réécrit votre outil interne en Open Source ? S'agit-il d'une fourchette ?

Bazel partage la majeure partie de son code avec l'outil interne, et ses règles sont utilisées chaque jour pour des millions de builds.

Pourquoi Google a-t-il créé Bazel ?

Il y a longtemps, Google a créé son logiciel à l'aide de fichiers Makemake générés de manière volumineuse. En raison de leur lenteur et de leur fiabilité, les modèles ont commencé à interférer avec la productivité de nos développeurs et l'agilité de l'entreprise. Bazel a permis de résoudre ces problèmes.

Bazel nécessite-t-il un cluster de compilation ?

Par défaut, Bazel exécute les opérations de compilation en local. Toutefois, Bazel peut également se connecter à un cluster de compilation pour accélérer les compilations et les tests. Pour en savoir plus, consultez notre documentation sur l'exécution et la mise en cache à distance et la mise en cache à distance.

Comment fonctionne le processus de développement Google ?

Pour le code base de notre serveur, nous utilisons le workflow de développement suivant:

  • L'ensemble du code de notre serveur se trouve dans un seul système de contrôle des versions géant.
  • Tout le monde développe son logiciel avec Bazel.
  • Les différentes équipes possèdent différentes parties de l'arborescence source et mettent leurs composants à disposition en tant que cibles BUILD.
  • Le branchement est principalement utilisé pour gérer les releases, de sorte que tout le monde développe son logiciel lors de la révision principale.

Bazel est la base de cette philosophie. Étant donné qu'il requiert la spécification complète de toutes les dépendances, nous pouvons prédire les programmes et les tests concernés par une modification, puis les examiner avant de les soumettre.

Pour en savoir plus sur le processus de développement chez Google, consultez le blog sur les outils eng.

Pourquoi avez-vous ouvert Bazel ?

Créer un logiciel devrait être simple et amusant. Les développements lents et imprévisibles vous permettent de vous amuser pendant la programmation.

Pourquoi utiliser Bazel ?

  • Bazel peut vous permettre d'accélérer le temps de compilation, car il ne peut recompiler que les fichiers à recompiler. De même, il peut ignorer les tests qui n'ont pas changé depuis le début.
  • Bazel produit des résultats déterministes. Cela permet d'éliminer les décalages entre les versions incrémentielles et propres, les ordinateurs portables et les systèmes CI, etc.
  • Bazel peut créer différentes applications clientes et serveur à l'aide du même outil, à partir du même espace de travail. Par exemple, vous pouvez modifier le protocole client/serveur dans un seul commit et tester que l'application mobile mise à jour fonctionne avec le serveur à jour, en créant les deux à l'aide du même outil, récoltant ainsi tous les avantages mentionnés ci-dessus.

Puis-je afficher des exemples ?

Oui. voir un exemple simple ou lire le code source de Bazel pour un exemple plus complexe.

Quel est le meilleur de Bazel ?

Bazel brille dans la construction et le test de projets à l'aide des propriétés suivantes:

  • Projets avec codebase volumineux
  • Projets écrits dans plusieurs langages compilés
  • Projets à déployer sur plusieurs plates-formes
  • Projets comportant des tests complets

Où puis-je exécuter Bazel ?

Bazel s'exécute sous Linux, macOS (OS X) et Windows.

Le transfert vers d'autres plates-formes UNIX doit être relativement simple, à condition qu'un JDK soit disponible pour la plate-forme.

À quoi ne sert pas Bazel ?

  • Bazel essaie intelligemment de mettre en cache les images. Cela signifie qu'elle n'est pas adaptée aux opérations de compilation dont les résultats ne doivent pas être mis en cache. Par exemple, les étapes suivantes ne doivent pas être exécutées à partir de Bazel :
    • Étape de compilation qui récupère des données sur Internet.
    • Étape de test qui se connecte à l'instance de contrôle qualité de votre site.
    • Étape de déploiement modifiant la configuration cloud de votre site.
  • Si votre compilation comporte plusieurs longues étapes séquentielles, Bazel risque de ne pas pouvoir vous aider beaucoup. Vous obtiendrez plus de vitesse en décomposant les longues étapes en cibles plus petites et discrètes que Bazel peut exécuter en parallèle.

Dans quelle mesure l'ensemble de caractéristiques de Bazel est-il stable ?

Les fonctionnalités principales (C++, Java et règles d'interface système) sont utilisées en grande partie par Google. Elles sont donc testées de manière approfondie et ont peu de perte d'utilisateurs. De même, nous testons chaque jour de nouvelles versions de Bazel sur des centaines de milliers de cibles afin d'identifier des régressions, et nous publions de nouvelles versions plusieurs fois par mois.

Pour résumer, à l'exception des fonctionnalités marquées comme expérimentales, Bazel doit fonctionner sans problème. Les modifications apportées aux règles non expérimentales seront rétrocompatibles. Vous trouverez une liste plus détaillée des états de compatibilité des fonctionnalités dans notre document d'assistance.

Dans quelle mesure le code Bazel est-il stable ?

Chez Google, nous nous assurons que les plantages de Bazel sont très rares. Cela devrait également s'appliquer à notre codebase Open Source.

Comment commencer à utiliser Bazel ?

Pour en savoir plus, consultez le guide de démarrage.

Docker ne résout-il pas les problèmes de reproductibilité ?

Avec Docker, vous pouvez facilement créer des bacs à sable avec des versions d'OS fixes, par exemple Ubuntu 12.04, Fedora 21. Cela résout le problème de reproductibilité pour l'environnement système, à savoir, "de quelle version de /usr/bin/c++ ai-je besoin ?"

Docker ne traite pas les problèmes de reproductibilité liés aux modifications du code source. L'exécution de la fonctionnalité Makemake avec un fichier Makefile mal écrit dans un conteneur Docker peut générer des résultats imprévisibles.

Google vérifie les outils dans le contrôle des sources à des fins de reproductibilité. De cette manière, nous pouvons examiner les modifications apportées aux outils ("mettre à jour GCC vers la version 4.6.1") avec le même mécanisme que les modifications des bibliothèques de base ("vérifier les limites dans OpenSSL").

Puis-je créer des binaires pour le déploiement sur Docker ?

Bazel vous permet de créer des fichiers binaires autonomes associés de manière statique en C/C++, et des fichiers JAR autonomes pour Java. Ils s'exécutent avec peu de dépendances sur les systèmes UNIX normaux. Ils doivent donc être faciles à installer dans un conteneur Docker.

Bazel définit des conventions pour structurer des programmes plus complexes, par exemple un programme Java qui utilise un ensemble de fichiers de données ou exécute un autre programme en tant que sous-processus. Il est possible d'empaqueter des environnements de ce type en tant qu'archives autonomes afin de les déployer sur différents systèmes, y compris sur des images Docker.

Puis-je créer des images Docker à l'aide de Bazel ?

Oui, vous pouvez créer des images Docker reproductibles à l'aide de nos règles Docker.

Bazel va-t-il reproduire automatiquement mes builds ?

Pour les fichiers binaires Java et C++, oui, à condition de ne pas modifier la chaîne d'outils. Si vous avez des étapes de compilation qui impliquent des recettes personnalisées (par exemple, si vous exécutez des binaires via un script shell dans une règle), vous devrez prendre une précaution particulière:

  • N'utilisez pas les dépendances qui n'ont pas été déclarées. L'exécution en bac à sable (–spawn_strategy=sandboxed, uniquement sur Linux) peut vous aider à trouver des dépendances non déclarées.
  • Évitez de stocker des horodatages et des User-ID dans des fichiers générés. Les fichiers ZIP et les autres archives sont particulièrement vulnérables.
  • Évitez de vous connecter au réseau. L'exécution en bac à sable peut également être utile.
  • Évitez les processus qui utilisent des nombres aléatoires, en particulier la traversée de dictionnaire qui est randomisée dans de nombreux langages de programmation.

Disposez-vous d'une version binaire ?

Oui, vous pouvez consulter les dernières binaires de publication et consulter nos règles relatives aux versions

J'utilise Eclipse/IntelliJ/XCode. Comment Bazel interagit-il avec les IDE ?

Pour IntelliJ, consultez le plug-in IntelliJ avec Bazel.

Pour XCode, consultez Tulsi.

Pour Eclipse, consultez le plug-in E4B.

Pour les autres IDE, consultez l'article de blog sur le fonctionnement de ces plug-ins.

J'utilise Jenkins/CircleCI/TravisCI. Comment Bazel interagit-il avec les systèmes CI ?

Bazel renvoie un code de sortie différent de zéro si l'appel de compilation ou de test échoue, ce qui devrait suffire pour l'intégration CI de base. Étant donné que Bazel n'a pas besoin de builds propres pour garantir l'exactitude, le système CI ne doit pas être configuré pour nettoyer avant de démarrer une exécution de compilation ou de test.

Vous trouverez de plus amples informations sur les codes de sortie dans le manuel de l'utilisateur.

Quelles sont les futures fonctionnalités de Bazel ?

Consultez nos feuilles de route.

Puis-je utiliser Bazel pour mon projet intitulé "INSERT LANGUAGE HERE" ?

Bazel est extensible. Tout le monde peut ajouter de nouvelles langues De nombreuses langues sont acceptées, consultez l'encyclopédie de compilation pour obtenir une liste de recommandations et la page awesomebazel.com pour obtenir une liste plus complète.

Si vous souhaitez développer des extensions ou en savoir plus sur leur fonctionnement, consultez la documentation sur l'extension de Bazel.

Puis-je contribuer au code base de Bazel ?

Consultez nos consignes concernant les contributions.

Pourquoi l'ensemble des activités de développement n'est-il pas ouvert ?

Nous devons souvent refactoriser les interfaces entre le code public de Bazel et nos extensions internes. Il est donc difficile de bien le développer.

Êtes-vous prêt à utiliser Open Source Bazel ?

Bazel Open Source est en cours de développement. Plus particulièrement, nous travaillons encore sur l'Open Source:

  • Un grand nombre de nos tests unitaires et d'intégration (qui devraient faciliter la contribution des correctifs).
  • Intégration complète de l'IDE.

Au-delà du code, nous aimerions que tous les examens de code, le suivi des bugs et les décisions de conception se déroulent publiquement, en impliquant la communauté Bazel. Cette fonctionnalité n'est pas encore là. Certaines modifications apparaissent simplement dans le dépôt Bazel, sans explication claire. Malgré ce manque de transparence, nous souhaitons soutenir les développeurs externes et collaborer. Par conséquent, nous ouvrons le code, même si une partie du développement est encore en cours pour Google. N'hésitez pas à nous faire part de toute question inexacte ou injustifiée lors de la transition vers un modèle ouvert.

Existe-t-il des éléments de Bazel qui ne seront jamais Open Source ?

Oui, une partie du code repose sur une technologie spécifique à Google, ou nous cherchons à nous débarrasser de ces codes (ou une combinaison des deux). Ces éléments de la base de code ne sont jamais disponibles sur GitHub et ne le seront probablement jamais.

Comment puis-je contacter l'équipe ?

Vous pouvez nous contacter à l'adresse bazel-discussion@googlegroups.com.

Où signaler les bugs ?

Signalez un problème sur GitHub.

Que se passe-t-il avec le mot "Blaze" dans le codebase ?

Nom interne de l'outil. Veuillez appeler Bazel en tant que Bazel.

Pourquoi d'autres projets Google (Android, Chrome) utilisent-ils d'autres outils de compilation ?

Jusqu'à la première version (alpha) où Bazel était indisponible, les projets Open Source tels que Chromium et Android ne pouvaient pas l'utiliser. Par ailleurs, l'absence initiale de compatibilité Windows posait un problème lors de la création d'applications Windows, telles que Chrome. Depuis que le projet est devenu mature et plus stable, le projet Open Source Android est en cours de migration vers Bazel.

Comment prononce-t-on "bazel" ?

De la même manière que "basil" (l'herbe) en anglais américain : "BAY-zel". Ce mot rime avec "marteau". IPA: /ˈbeửzˌљl/