Разработка
Доктор Bazel: как я научился не волноваться и полюбил сборки
Bazel может сделать за вас всю тяжелую работу по созданию и тестированию программного обеспечения, сделав ее быстрой, точной, масштабируемой и гибкой.
Создание программного обеспечения может быть как простым, как выпечка пирога, так и сложным, как ракетостроение. Все зависит от инструментов, которые вы используете. Будучи разработчиком, вы наверняка сталкивались с такими проблемами, как непоследовательные сборки, длительное время сборки и ад зависимостей. Если вы хотите сделать свою жизнь проще, а свое программное обеспечение — лучше, вам стоит попробовать Bazel, идеальный инструмент для сборки, который может справиться с чем угодно — от кексов до космических кораблей.
В этой статье мы познакомим вас с основами Bazel и покажем, как он может помочь вам перестать беспокоиться и полюбить создание приложений.
Что такое Bazel?
Bazel — это бесплатный инструмент с открытым исходным кодом, используемый для автоматизации создания и тестирования программного обеспечения. Google использует инструмент сборки Blaze внутри компании и выпустила порт с открытым исходным кодом под названием Bazel, названный как анаграмма Blaze.
Почему Bazel?
Эта система сборки отлично подходит для разработчиков, которые работают над большими и сложными программными проектами, особенно теми, которые включают в себя несколько языков, платформ, инструментов и сред. И всегда лучше внедрить его раньше, чем переходить на нее позже.
Она похож на другие инструменты сборки, такие как Make, Maven и Gradle, но гораздо более гибкая: ее можно использовать для создания проектов на различных языках программирования, включая Kotlin, Swift, Go и Python. Кроме того, у него есть несколько уникальных особенностей, которые делают ее особенной. Вот некоторые из них:
- Скорость: Bazel создан для того, чтобы быть быстрым и эффективным. Он использует технику, называемую Инкрементальные сборки, то есть перестраивает только те части программного обеспечения, которые изменились с момента последней сборки. Также для ускорения процесса сборки используется кэширование и параллелизм.
- Корректность: Он предназначен для обеспечения корректности сборки и тестирования программного обеспечения. Он использует технику, называемую Герметичные сборки, которая означает, что он изолирует собранную среду от внешних факторов, таких как операционная система, сеть или файловая система. Это гарантирует воспроизводимость и согласованность результатов сборки на разных машинах и платформах. Система настолько умна, что может понять, что вы хотите собрать и протестировать, даже если вы сами этого не знаете.
- Масштабируемость: Bazel разработан для работы с большими и сложными программными проектами. Он использует модульную и иерархическую структуру, которая позволяет разработчикам организовывать код в более мелкие и многократно используемые единицы, называемые пакетами и целями.
Давайте рассмотрим некоторые фундаментальные концепции системы.
Концепции Bazel
Прежде чем начать использовать платформу, необходимо разобраться в его концепциях.
- Рабочая область (Workspace): Рабочее пространство — это корневой каталог вашего проекта. Оно содержит файл с именем
WORKSPACE
(илиWORKSPACE.bazel
), который является конфигурационным файлом для Bazel. Этот файл может определять внешние зависимости, такие как библиотеки или инструменты, и устанавливать настройки всего рабочего пространства. - Сборка (Build): Каждый пакет в вашем рабочем пространстве должен содержать файл
BUILD
(илиBUILD.bazel
), который является неотъемлемой частью Bazel и описывает процесс создания исполняемого программного обеспечения из исходного кода путем определения целей, зависимостей и правил. Эти файлы определяют, что и как должно собираться. - Библиотека (Library): Библиотеки — это многократно используемые единицы кода, которые можно совместно использовать для нескольких целей.
- Ярлык (Label): Ярлыки — это уникальные имена, присваиваемые целям и пакетам. Метка состоит из пути цели в рабочей области и ее имени. Например,
//project_android:app
ссылается на цель с именемapp
в каталогеproject_android
рабочего пространства. - Бинарник (Binary): Бинарная цель в Bazel представляет собой исполняемую программу. Это может быть отдельное приложение, скрипт или любой другой исполняемый артефакт. Бинарные цели определяются в файлах
BUILD
и могут зависеть от библиотек и других целей. - Правило (Rule): Правила — это инструкции, которые указывают Bazel, как собрать или протестировать цель. Правило может содержать одну или несколько команд, которые являются фактическими командами, выполняемыми платформой для выполнения действий по сборке или тестированию. Вы можете использовать встроенные правила или создавать свои собственные. Ознакомьтесь с полным руководством по правилам для конкретного языка.
Концепции в действии
Предположим, у нас есть приложение для Python Flask и приложение для Android, которое использует некий API из этого приложения, и мы хотим использовать Bazel для сборки обоих приложений.
Simple project structure:👇🏻 - WORKSPACE - project_python - BUILD - server.py - … - project_android - BUILD - AndroidManifest.xml - src/ - …
Во-первых, мы должны иметь наш файл WORKSPACE
в корне проекта. Он может быть пустым, чтобы просто определить точку входа в Bazel.
Во-вторых, нам нужно создать файл BUILD
для каждого из пакетов.
# project_python/BUILD.bazel load("@bazel_tools//tools/build_defs/python/rules:python_binary.bzl", "python_binary") python_binary( name = "server", srcs = ["server.py"], deps = [ "@pip//:flask", ], )
Мы загружаем python_binary из правил Python и используем его для создания нашего сервера.
То же самое для Android:
# project_android/BUILD.bazel load("@rules_android//android:rules.bzl", "android_binary") android_binary( name = "app", resource_files = glob(["res/**/*"]), manifest = "AndroidManifest.xml", resource_files = glob(["res/**/*"]), )
Сборка целей
С помощью команды bazel build <target>
вы можете собрать свои пакеты.
bazel build //project_python:server bazel build //project_android:app
Или с помощью команды bazel build //...
, которая рекурсивно собирает все цели в текущем рабочем пространстве. Сюда входят цели во всех подкаталогах, а также цели, которые объявлены как зависимости от других целей.
Использование Bazel в вашей системе CI/CD
Если вы сделали этот шаг в мир Bazel, поздравляем! Вы уже приняли разумное решение, теперь продолжайте плыть по течению на волне правильных решений и позвольте CI/CD трубопроводу стать ветром под вашими Bazel-крыльями. Ваша кодовая база и ваша команда будут вам благодарны!
Чтобы использовать Bazel в своих рабочих процессах Codemagic, вам сначала нужно установить Bazel на машину сборки. После этого можно запускать сценарий сборки. Ниже приведен пример добавления этих шагов в раздел «scripts» конфигурационного файла codemagic.yaml
.
scripts: ... - name: Install Bazel script: | HOMEBREW_NO_AUTO_UPDATE=1 brew install bazel - name: Build all targets in workspace script: bazel build //...
Заключение
Bazel — это инструмент, который может изменить ваш мир. Он может сделать за вас всю тяжелую работу по созданию и тестированию программного обеспечения, сделав ее быстрой, точной, масштабируемой и гибкой. Так что перестаньте беспокоиться о создании приложений, вы только что узнали, как использовать Bazel. Счастливого программирования!