Si tienes preguntas o necesitas asistencia, consulta Obtén asistencia.
¿Qué es Bazel?
Bazel es una herramienta que automatiza las compilaciones y pruebas de software. Las tareas de compilación admitidas incluyen ejecutar compiladores y enlazadores para producir programas y bibliotecas ejecutables, y ensamblar paquetes implementables para Android, iOS y otros entornos de destino. Bazel es similar a otras herramientas, como Make, Ant, Gradle, Buck, Pants y Maven.
¿Qué tiene de especial Bazel?
Bazel se diseñó para adaptarse a la forma en que se desarrolla el software en Google. Tiene las siguientes características:
- Compatibilidad con varios lenguajes: Bazel admite muchos lenguajes y se puede extender para admitir lenguajes de programación arbitrarios.
- Lenguaje de compilación de alto nivel: Los proyectos se describen en el lenguaje
BUILD
, un formato de texto conciso que describe un proyecto como conjuntos de bibliotecas, objetos binarios y pruebas pequeñas interconectadas. En cambio, con herramientas como Make, debes describir archivos individuales y llamadas al compilador. - Compatibilidad multiplataforma: Se pueden usar la misma herramienta y los mismos archivos
BUILD
para compilar software para diferentes arquitecturas y hasta para diferentes plataformas. En Google, usamos Bazel para compilar todo, desde aplicaciones de servidor que se ejecutan en sistemas de nuestros centros de datos hasta apps cliente que se ejecutan en teléfonos celulares. - Reproductibilidad: En los archivos
BUILD
, cada biblioteca, prueba y objeto binario debe especificar sus dependencias directas por completo. Bazel usa esta información de dependencia para saber qué se debe volver a compilar cuando realizas cambios en un archivo fuente y qué tareas se pueden ejecutar en paralelo. Esto significa que todas las compilaciones son incrementales y siempre producirán el mismo resultado. - Escalable: Bazel puede controlar compilaciones grandes. En Google, es común que un binario de servidor tenga 100,000 archivos de origen, y las compilaciones en las que no se cambió ningún archivo tardan alrededor de 200 ms.
¿Por qué Google no usa…?
- Make y Ninja: Estas herramientas proporcionan un control muy exacto sobre los comandos que se invocan para compilar archivos, pero depende del usuario escribir reglas correctas.
- Los usuarios interactúan con Bazel en un nivel superior. Por ejemplo, Bazel tiene reglas integradas para “prueba de Java”, “binario de C++” y nociones como “plataforma de destino” y “plataforma de host”. Estas reglas se probaron para garantizar que sean infalibles.
- Ant y Maven: Ant y Maven están orientados principalmente a Java, mientras que Bazel controla varios idiomas. Bazel fomenta la subdivisión de bases de código en unidades reutilizables más pequeñas y puede volver a compilar solo las que necesitan una compilación nueva. Esto acelera el desarrollo cuando se trabaja con bases de código más grandes.
- Gradle: Los archivos de configuración de Bazel están mucho más estructurados que los de Gradle, lo que permite que Bazel comprenda exactamente qué hace cada acción. Esto permite un mayor paralelismo y una mejor reproducibilidad.
- Pants y Buck: Ambas herramientas fueron creadas y desarrolladas por exmiembros del equipo de Google en Twitter, Foursquare y Facebook, respectivamente. Se modelaron a partir de Bazel, pero sus conjuntos de funciones son diferentes, por lo que no son alternativas viables para nosotros.
¿De dónde viene Bazel?
Bazel es una variante de la herramienta que Google usa para compilar su software de servidor de forma interna. También se expandió para compilar otro software, como apps para dispositivos móviles (iOS y Android) que se conectan a nuestros servidores.
¿Volviste a escribir tu herramienta interna como código abierto? ¿Es un tenedor?
Bazel comparte la mayor parte de su código con la herramienta interna, y sus reglas se usan para millones de compilaciones todos los días.
¿Por qué Google creó Bazel?
Hace mucho tiempo, Google compilaba su software con Makefiles grandes generados. Esto generó compilaciones lentas y poco confiables, que comenzaron a interferir en la productividad de nuestros desarrolladores y en la agilidad de la empresa. Bazel era una forma de resolver estos problemas.
¿Bazel requiere un clúster de compilación?
Bazel ejecuta operaciones de compilación de forma local de forma predeterminada. Sin embargo, Bazel también se puede conectar a un clúster de compilación para realizar compilaciones y pruebas aún más rápidas. Consulta nuestra documentación sobre ejecución y almacenamiento en caché remotos y almacenamiento en caché remoto para obtener más detalles.
¿Cómo funciona el proceso de desarrollo de Google?
Para nuestra base de código del servidor, usamos el siguiente flujo de trabajo de desarrollo:
- Todo el código de nuestro servidor se encuentra en un solo sistema de control de versiones gigantesco.
- Todos compilan su software con Bazel.
- Diferentes equipos son propietarios de diferentes partes del árbol de origen y ponen sus componentes a disposición como destinos de
BUILD
. - Las ramificaciones se usan principalmente para administrar las versiones, de modo que todos desarrollen su software en la revisión principal.
Bazel es un pilar de esta filosofía: dado que requiere que todas las dependencias se especifiquen por completo, podemos predecir qué programas y pruebas se ven afectados por un cambio y revisarlos antes de enviarlos.
Puedes encontrar más información sobre el proceso de desarrollo en Google en el blog de herramientas de ingeniería.
¿Por qué abriste Bazel?
La compilación de software debe ser divertida y fácil. Las compilaciones lentas e impredecibles quitan la diversión de la programación.
¿Por qué debería usar Bazel?
- Bazel puede brindarte tiempos de compilación más rápidos porque puede volver a compilar solo los archivos que se deben volver a compilar. Del mismo modo, puede omitir la repetición de pruebas que sabe que no cambiaron.
- Bazel produce resultados deterministas. Esto elimina la distorsión entre compilaciones incrementales y limpias, laptops y sistemas de CI, etcétera.
- Bazel puede compilar diferentes apps de cliente y servidor con la misma herramienta desde el mismo espacio de trabajo. Por ejemplo, puedes cambiar un protocolo cliente-servidor en una sola confirmación y probar que la app para dispositivos móviles actualizada funcione con el servidor actualizado. Para ello, compila ambas con la misma herramienta y aprovecha todos los beneficios de Bazel mencionados anteriormente.
¿Puedo ver ejemplos?
Sí. Consulta un ejemplo sencillo o lee el código fuente de Bazel para ver un ejemplo más complejo.
¿En qué es mejor Bazel?
Bazel se destaca en la compilación y prueba de proyectos con las siguientes propiedades:
- Proyectos con una base de código grande
- Proyectos escritos en (varios) lenguajes compilados
- Proyectos que se implementan en varias plataformas
- Proyectos que tienen pruebas exhaustivas
¿Dónde puedo ejecutar Bazel?
Bazel se ejecuta en Linux, macOS (OS X) y Windows.
La portabilidad a otras plataformas de UNIX debería ser relativamente sencilla, siempre y cuando haya un JDK disponible para la plataforma.
¿Para qué no debería usar Bazel?
- Bazel intenta ser inteligente en cuanto al almacenamiento en caché. Esto significa que no es bueno para ejecutar operaciones de compilación cuyos resultados no se deben almacenar en caché. Por ejemplo, los siguientes pasos no se deben ejecutar desde Bazel:
- Es un paso de compilación que recupera datos de Internet.
- Es un paso de prueba que se conecta a la instancia de QA de tu sitio.
- Es un paso de implementación que cambia la configuración de la nube de tu sitio.
- Si tu compilación consta de algunos pasos secuenciales largos, es posible que Bazel no te ayude mucho. Obtendrás más velocidad si divides los pasos largos en objetivos más pequeños y discretos que Bazel puede ejecutar en paralelo.
¿Qué tan estable es el conjunto de funciones de Bazel?
Las funciones principales (C++, Java y reglas de shell) se usan ampliamente en Google, por lo que se prueban en detalle y tienen muy poca deserción. Del mismo modo, probamos versiones nuevas de Bazel en cientos de miles de destinos todos los días para encontrar regresiones y lanzamos versiones nuevas varias veces al mes.
En resumen, excepto por las funciones marcadas como experimentales, Bazel debería funcionar sin problemas. Los cambios en las reglas no experimentales serán retrocompatibles. Puedes encontrar una lista más detallada de los estados de compatibilidad de las funciones en nuestro documento de asistencia.
¿Qué tan estable es Bazel como objeto binario?
En Google, nos aseguramos de que los errores de Bazel sean muy poco frecuentes. Esto también debería aplicarse a nuestra base de código de código abierto.
¿Cómo puedo comenzar a usar Bazel?
Consulta Cómo comenzar.
¿No resuelve Docker los problemas de reproducibilidad?
Con Docker, puedes crear fácilmente zonas de pruebas con versiones fijas del SO, por ejemplo, Ubuntu 12.04 o Fedora 21. Esto resuelve el problema de reproducibilidad del entorno del sistema, es decir, "¿qué versión de /usr/bin/c++ necesito?".
Docker no aborda la reproducibilidad con respecto a los cambios en el código fuente. Ejecutar Make con un Makefile escrito de forma imperfecta dentro de un contenedor de Docker puede generar resultados impredecibles.
En Google, verificamos las herramientas en el control de código fuente para verificar su reproducibilidad. De esta manera, podemos aprobar los cambios en las herramientas ("actualiza GCC a 4.6.1") con el mismo mecanismo que los cambios en las bibliotecas básicas ("corrige la verificación de límites en OpenSSL").
¿Puedo compilar objetos binarios para la implementación en Docker?
Con Bazel, puedes compilar objetos binarios independientes vinculados de forma estática en C/C++ y archivos JAR independientes para Java. Se ejecutan con pocas dependencias en sistemas UNIX normales y, por lo tanto, deberían ser fáciles de instalar dentro de un contenedor de Docker.
Bazel tiene convenciones para estructurar programas más complejos, por ejemplo, un programa Java que consume un conjunto de archivos de datos o ejecuta otro programa como subproceso. Es posible empaquetar esos entornos como archivos independientes para que se puedan implementar en diferentes sistemas, incluidas las imágenes de Docker.
¿Puedo compilar imágenes de Docker con Bazel?
Sí, puedes usar nuestras reglas de Docker para compilar imágenes de Docker reproducibles.
¿Bazel hará que mis compilaciones se puedan reproducir automáticamente?
En el caso de los objetos binarios de Java y C++, sí, siempre que no cambies la cadena de herramientas. Si tienes pasos de compilación que involucran recetas personalizadas (por ejemplo, ejecutar objetos binarios a través de una secuencia de comandos de shell dentro de una regla), deberás tener cuidado con lo siguiente:
- No uses dependencias que no se hayan declarado. La ejecución en zona de pruebas (–spawn_strategy=sandboxed, solo en Linux) puede ayudar a encontrar dependencias no declaradas.
- Evita almacenar marcas de tiempo y IDs de usuario en los archivos generados. Los archivos ZIP y otros archivos son especialmente propensos a esto.
- Evita conectarte a la red. La ejecución en zona de pruebas también puede ser útil aquí.
- Evita los procesos que usan números aleatorios, en particular, el recorrido del diccionario se aleatoriza en muchos lenguajes de programación.
¿Tienes versiones binarias?
Sí, puedes encontrar los binarios de lanzamiento más recientes y revisar nuestra política de lanzamiento.
Uso Eclipse, IntelliJ o XCode. ¿Cómo interopera Bazel con los IDE?
En el caso de IntelliJ, consulta el complemento IntelliJ con Bazel.
Para XCode, consulta Tulsi.
Para Eclipse, consulta el complemento E4B.
Para otros IDE, consulta la entrada de blog sobre cómo funcionan estos complementos.
Uso Jenkins/CircleCI/TravisCI. ¿Cómo interopera Bazel con los sistemas de CI?
Bazel muestra un código de salida distinto de cero si falla la compilación o la invocación de prueba, y esto debería ser suficiente para la integración básica de CI. Dado que Bazel no necesita compilaciones limpias para que sea correcto, el sistema de CI no debe configurarse para limpiar antes de iniciar una compilación o una ejecución de prueba.
Puedes encontrar más detalles sobre los códigos de salida en el Manual de usuario.
¿Qué funciones futuras podemos esperar en Bazel?
Consulta nuestras Hojas de ruta.
¿Puedo usar Bazel para mi proyecto INSERT LANGUAGE HERE?
Bazel es extensible. Cualquier persona puede agregar compatibilidad con idiomas nuevos. Se admiten muchos lenguajes: consulta la enciclopedia de compilación para obtener una lista de recomendaciones y awesomebazel.com para obtener una lista más completa.
Si deseas desarrollar extensiones o aprender cómo funcionan, consulta la documentación para extender Bazel.
¿Puedo contribuir a la base de código de Bazel?
Consulta nuestros lineamientos para contribuciones.
¿Por qué no se realiza todo el desarrollo de forma pública?
Aún tenemos que refactorizar las interfaces entre el código público en Bazel y nuestras extensiones internas con frecuencia. Esto dificulta el desarrollo en público.
¿Terminaste de hacer que Bazel sea de código abierto?
La versión de código abierto de Bazel está en desarrollo. En particular, seguimos trabajando en el código abierto:
- Muchas de nuestras pruebas de unidades y de integración (lo que debería facilitar la contribución de parches).
- Integración completa en IDE
Más allá del código, nos gustaría que, en algún momento, todas las revisiones de código, el seguimiento de errores y las decisiones de diseño se realicen de forma pública, con la participación de la comunidad de Bazel. Aún no hemos llegado a ese punto, por lo que algunos cambios simplemente aparecerán en el repositorio de Bazel sin una explicación clara. A pesar de esta falta de transparencia, queremos apoyar a los desarrolladores externos y colaborar con ellos. Por lo tanto, abriremos el código, aunque parte del desarrollo aún se realice de forma interna en Google. Avísanos si algo no te parece claro o no está justificado durante la transición a un modelo abierto.
¿Hay partes de Bazel que nunca serán de código abierto?
Sí, parte de la base de código se integra con la tecnología específica de Google o hemos estado buscando una excusa para deshacernos de ella (o es una combinación de ambas). Estas partes de la base de código no están disponibles en GitHub y es probable que nunca lo estén.
¿Cómo me puedo comunicar con el equipo?
Puedes comunicarte con nosotros en bazel-discuss@googlegroups.com.
¿Dónde puedo informar errores?
Abre un problema en GitHub.
¿Qué significa la palabra “Blaze” en la base de código?
Este es un nombre interno para la herramienta. Haz referencia a Bazel como Bazel.
¿Por qué otros proyectos de Google (Android y Chrome) usan otras herramientas de compilación?
Hasta la primera versión (alfa), Bazel no estaba disponible de forma externa, por lo que los proyectos de código abierto, como Chromium y Android, no podían usarlo. Además, la falta original de compatibilidad con Windows era un problema para compilar aplicaciones para Windows, como Chrome. Dado que el proyecto maduró y se volvió más estable, el Proyecto de código abierto de Android está en proceso de migración a Bazel.
¿Cómo se pronuncia “Bazel”?
De la misma manera que “basil” (la hierba) en inglés de EE.UU.: “BAY-zel”. Rima con “hazel”. IPA: /ˈbeɪzˌəl/