Si tienes preguntas o necesitas asistencia, consulta Cómo obtener ayuda.
¿Qué es Bazel?
Bazel es una herramienta que automatiza las compilaciones y las pruebas de software. Entre las tareas de compilación compatibles, se incluyen la ejecución de compiladores y vinculadores para producir programas y bibliotecas ejecutables, y el ensamblaje de 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 pequeñas bibliotecas, archivos binarios y pruebas interconectados. Por el contrario, con herramientas como Make, debes describir archivos individuales e invocaciones del compilador. - Compatibilidad con varias plataformas: Se puede usar la misma herramienta y los mismos archivos
BUILDpara compilar software para diferentes arquitecturas e incluso 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. - Reproducibilidad: En los archivos
BUILD, cada biblioteca, prueba y archivo 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. - Escalabilidad: Bazel puede controlar compilaciones grandes. En Google, es común que un archivo binario de servidor tenga 100,000 archivos fuente, y las compilaciones en las que no se cambiaron archivos tardan aproximadamente 200 ms.
¿Por qué Google no usa...?
- Make, Ninja: Estas herramientas brindan un control muy exacto sobre qué comandos se invocan para compilar archivos, pero depende del usuario escribir reglas que sean correctas.
- Los usuarios interactúan con Bazel en un nivel superior. Por ejemplo, Bazel tiene reglas integradas para “prueba de Java”, “archivo binario de C++” y nociones como “plataforma de destino” y “plataforma de host”. Estas reglas se probaron en batalla para que sean infalibles.
- Ant y Maven: Ant y Maven están orientados principalmente a Java, mientras que Bazel controla varios lenguajes. 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 volver a compilarse. 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 lo que hace cada acción. Esto permite un mayor paralelismo y una mejor reproducibilidad.
- Pants, Buck: Ambas herramientas fueron creadas y desarrolladas por ex-Googlers en Twitter y Foursquare, y Facebook, respectivamente. Se modelaron según Bazel, pero sus conjuntos de funciones son diferentes, por lo que no son alternativas viables para nosotros.
¿De dónde surgió Bazel?
Bazel es una variante de la herramienta que Google usa para compilar su software de servidor de forma interna. Se expandió para compilar también otro software, como apps para dispositivos móviles (iOS, Android) que se conectan a nuestros servidores.
¿Reescribiste tu herramienta interna como código abierto? ¿Es una bifurcación?
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 y generados. Esto generó compilaciones lentas y poco confiables, que comenzaron a interferir con la productividad de nuestros desarrolladores y la agilidad de la empresa. Bazel fue una forma de resolver estos problemas.
¿Bazel requiere un clúster de compilación?
De forma predeterminada, Bazel ejecuta operaciones de compilación de forma local. Sin embargo, Bazel también puede conectarse a un clúster de compilación para realizar compilaciones y pruebas aún más rápidas. Consulta nuestra documentación sobre la ejecución y el almacenamiento en caché remotos y el almacenamiento en caché remoto para obtener más detalles.
¿Cómo funciona el proceso de desarrollo de Google?
Para nuestra base de código de servidor, usamos el siguiente flujo de trabajo de desarrollo:
- Todo nuestro código de servidor está en un solo sistema de control de versiones gigantesco.
- Todos compilan su software con Bazel.
- Los diferentes equipos poseen diferentes partes del árbol de origen y ponen sus componentes a disposición como destinos
BUILD. - La ramificación se usa principalmente para administrar versiones, por lo que todos desarrollan su software en la revisión principal.
Bazel es una piedra angular de esta filosofía: dado que Bazel requiere que todas las dependencias se especifiquen por completo, podemos predecir qué programas y pruebas se ven afectados por un cambio y verificarlos 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 sencilla. 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 solo puede volver a compilar los archivos que deben volver a compilarse. Del mismo modo, puede omitir la repetición de pruebas que sabe que no cambiaron.
- Bazel produce resultados determinísticos. Esto elimina la distorsión entre las compilaciones incrementales y limpias, la laptop y el sistema de CI, etcétera.
- Bazel puede compilar diferentes apps 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, compilando ambos con la misma herramienta y aprovechando todos los beneficios mencionados de Bazel.
¿Puedo ver ejemplos?
Sí. Consulta un ejemplo simple o lee el código fuente de Bazel para obtener 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 lenguajes compilados (múltiples)
- Proyectos que se implementan en varias plataformas
- Proyectos que tienen pruebas extensas
¿Dónde puedo ejecutar Bazel?
Bazel se ejecuta en Linux, macOS (OS X) y Windows.
La migración a otras plataformas UNIX debería ser relativamente sencilla, siempre que haya un JDK disponible para la plataforma.
¿Para qué no debo usar Bazel?
- Bazel intenta ser inteligente sobre el almacenamiento en caché. Esto significa que no es adecuado para ejecutar operaciones de compilación cuyos resultados no deben almacenarse en caché. Por ejemplo, no se deben ejecutar los siguientes pasos desde Bazel:
- Un paso de compilación que recupera datos de Internet
- Un paso de prueba que se conecta a la instancia de QA de tu sitio
- Un paso de implementación que cambia la configuración de la nube de tu sitio
- Si tu compilación consta de algunos pasos largos y secuenciales, es posible que Bazel no pueda ayudarte mucho. Obtendrás más velocidad si divides los pasos largos en destinos más pequeños y discretos que Bazel pueda ejecutar en paralelo.
¿Qué tan estable es el conjunto de funciones de Bazel?
Las funciones principales (reglas de C++, Java y shell) tienen un uso extenso dentro de Google, por lo que se prueban minuciosamente y tienen muy poca rotación. Del mismo modo, probamos las 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. Los cambios en las reglas no experimentales serán retrocompatibles. Puedes encontrar una lista más detallada de los estados de compatibilidad de funciones en nuestro documento de asistencia.
¿Qué tan estable es Bazel como archivo binario?
En Google, nos aseguramos de que las fallas de Bazel sean muy raras. Esto también debería aplicarse a nuestra base de código abierto.
¿Cómo puedo comenzar a usar Bazel?
Consulta Comienza a usar Bazel.
¿Docker no resuelve los problemas de reproducibilidad?
Con Docker, puedes crear fácilmente entornos de pruebas con versiones fijas del SO, por ejemplo, Ubuntu 12.04, Fedora 21. Esto resuelve el problema de la reproducibilidad para el 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 aún puede producir resultados impredecibles.
En Google, registramos herramientas en el control de código fuente para la reproducibilidad. De esta manera, podemos verificar los cambios en las herramientas (“actualizar GCC a 4.6.1”) con el mismo mecanismo que los cambios en las bibliotecas base (“corregir la verificación de límites en OpenSSL”).
¿Puedo compilar archivos binarios para la implementación en Docker?
Con Bazel, puedes compilar archivos binarios independientes y vinculados de forma estática en C/C++, y archivos jar independientes para Java. Estos 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 de Java que consume un conjunto de archivos de datos o ejecuta otro programa como subproceso. Es posible empaquetar esos entornos como archivos independientes, de modo 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 sean reproducibles automáticamente?
Para los archivos binarios de Java y C++, sí, siempre que no cambies la cadena de herramientas. Si tienes pasos de compilación que incluyen recetas personalizadas (por ejemplo, ejecutar archivos binarios a través de una secuencia de comandos de shell dentro de una regla), deberás tener un cuidado adicional:
- No uses dependencias que no se hayan declarado. La ejecución en entorno 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 archivos generados. Los archivos ZIP y otros archivos son especialmente propensos a esto.
- Evita conectarte a la red. La ejecución en entorno de pruebas también puede ayudar en este caso.
- 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 archivos binarios de la versión más reciente y revisar nuestra política de versiones.
Uso Eclipse, IntelliJ o XCode. ¿Cómo interactúa Bazel con los IDE?
Para 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 o TravisCI. ¿Cómo interactúa Bazel con los sistemas de CI?
Bazel muestra un código de salida distinto de cero si falla la invocación de compilación o prueba, y esto debería ser suficiente para la integración básica de CI. Dado que Bazel no necesita compilaciones limpias para la corrección, el sistema de CI no debe configurarse para limpiar antes de iniciar una ejecución de compilación o prueba.
Puedes encontrar más detalles sobre los códigos de salida en el Manual del 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 lenguajes 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 de contribución.
¿Por qué no se realiza todo el desarrollo de forma abierta?
Aún debemos refactorizar las interfaces entre el código público en Bazel y nuestras extensiones internas con frecuencia. Esto dificulta mucho el desarrollo de forma abierta.
¿Terminaste de abrir el código fuente de Bazel?
Abrir el código fuente de Bazel es un trabajo en curso. En particular, aún estamos trabajando en la apertura del código fuente de lo siguiente:
- Muchas de nuestras pruebas de integración y unidad (lo que debería facilitar la contribución de parches)
- Integración completa en IDE
Además del código, nos gustaría que, con el tiempo, 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 llegamos 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 brindar asistencia a los desarrolladores externos y colaborar con ellos. Por lo tanto, estamos abriendo el código, aunque parte del desarrollo aún se realiza de forma interna en Google. Avísanos si algo no está claro o no está justificado a medida que hacemos 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 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 probablemente nunca lo estén.
¿Cómo me comunico con el equipo?
Puedes comunicarte con nosotros a través de bazel-discuss@googlegroups.com.
¿Dónde informo los errores?
Abre un problema en GitHub.
¿Qué sucede con la palabra “Blaze” en la base de código?
Este es un nombre interno para la herramienta. Consulta Blaze como Bazel.
¿Por qué otros proyectos de Google (Android, 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 de 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 estadounidense: “BAY-zel”. Rima con “hazel”. IPA: /ˈbeɪzˌəl/