Simple Science

Hochmoderne Wissenschaft einfach erklärt

# Computerwissenschaften# Software-Entwicklung

Optimierung der kontinuierlichen Integration mit Bazel

Eine Studie über die Nutzung von Bazel für schnellere CI-Bauten.

― 6 min Lesedauer


Bazel: CI-ProzesseBazel: CI-ProzesseBeschleunigenCI-Baugeschwindigkeit beeinflusst.Studie zeigt, wie Bazel die
Inhaltsverzeichnis

Kontinuierliche Integration (CI) ist eine Methode, die von Softwareentwicklern genutzt wird, um Änderungen an ihren Softwareprojekten häufig zu integrieren. Diese Praxis hilft, Fehler frühzeitig zu erkennen und die Codequalität aufrechtzuerhalten. Allerdings können lange CI-Bauten die Entwicklung verlangsamen, weshalb es wichtig ist, die Build-Zeiten zu optimieren.

Viele Entwickler stehen vor Herausforderungen, wenn ihre CI-Bauten zu lange dauern, oft warten sie auf Rückmeldungen, bevor sie weiterarbeiten können. Es wurden Techniken vorgeschlagen, um die Build-Zeiten zu verbessern, einschliesslich besserer Planung und kluger Auswahl der Tests. Neue Technologien wie Bazel zielen darauf ab, diese Probleme zu lösen, indem sie Funktionen anbieten, die darauf ausgelegt sind, Builds zu beschleunigen. Obwohl Bazel an Beliebtheit gewinnt, gibt es wenig Verständnis darüber, wie effektiv es wirklich ist, insbesondere bei Projekten mit langen Build-Dauern.

Studienübersicht

In unserer Studie haben wir 383 Open-Source-Projekte auf GitHub untersucht, die Bazel als ihr Build-Tool verwenden. Wir wollten herausfinden, wie oft Entwickler die fortgeschrittenen Funktionen von Bazel wie paralleles und inkrementelles Bauen innerhalb beliebter CI-Dienste nutzen. Ausserdem wollten wir diese Ergebnisse mit Projekten vergleichen, die ein anderes Build-Tool, Maven, verwenden.

Um die Leistung zu analysieren, haben wir Tausende von Tests an diesen Bazel-Projekten durchgeführt, um zu sehen, wie viel Zeit wir durch die Nutzung dieser Funktionen einsparen konnten. Dazu gehörte die Untersuchung von Build-Protokollen und die Analyse der letzten Commits verschiedener Projekte, um zu bewerten, wie Bazel in der CI-Umgebung funktionierte.

Bedeutung der Build-Geschwindigkeit

Einen schnellen und effizienten CI-Bauprozess zu haben, ist entscheidend für Entwickler. Je länger ein Build dauert, desto länger müssen die Entwickler auf Rückmeldungen zu ihren Änderungen warten, was den Gesamtfortschritt verlangsamen kann. Idealerweise sollten CI-Bauten schnell abgeschlossen werden, da Studien gezeigt haben, dass viele Entwickler Build-Zeiten von zehn Minuten oder weniger bevorzugen.

Allerdings zeigen Forschungen, dass eine grosse Anzahl von CI-Bauten viel länger dauert als das. Tatsächlich dauern etwa 40 % der Builds mehr als eine halbe Stunde. Da die Softwareentwicklung häufiger wird und auf Praktiken wie kontinuierliche Lieferung angewiesen ist, wird sich das Problem langsamer Builds wahrscheinlich verschärfen.

Traditionelle Lösungen für Build-Probleme

Verschiedene Strategien wurden vorgeschlagen, um das Problem langsamer CI-Bauten anzugehen:

  1. Vorhersage des Build-Ergebnisses: Diese Technik zielt darauf ab, unnötige Builds zu überspringen, indem vorhergesagt wird, welche Commits keinen vollständigen Build benötigen, basierend auf früheren Ergebnissen.

  2. Commit-Batching: Dabei werden mehrere Commits gruppiert, um sie zusammen zu bauen, was Zeit sparen kann.

  3. Test-Optimierungen: Durch Auswahl und Priorisierung der auszuführenden Tests können Entwickler die insgesamt benötigte Testzeit nach einem Build reduzieren.

  4. Quellcode-Optimierung: Refactoring des Codes kann ebenfalls helfen, da das Eliminieren redundanter Elemente zu schnelleren Builds führen kann.

Trotz dieser Strategien können traditionelle Build-Systeme Schwierigkeiten mit der Korrektheit haben. Die meisten vorhandenen Tools haben nicht die erforderlichen Informationen, um ein genaues Build-Abhängigkeitsdiagramm zu erstellen, was zu möglichen Fehlern bei parallelen und inkrementellen Builds führen kann.

Neue Build-Technologien

In letzter Zeit haben artefaktbasierte Build-Systeme wie Bazel Aufmerksamkeit für ihr Potenzial gewonnen, die Build-Leistung zu optimieren und gleichzeitig die Genauigkeit zu wahren. Als Open-Source-Tool von Google veröffentlicht, ermöglicht Bazel Entwicklern, die Artefakte und deren Abhängigkeiten in den Build-Dateien zu beschreiben. Diese Methode hilft, ein präzises Abhängigkeitsdiagramm zu erstellen, das für zuverlässige parallele und inkrementelle Builds entscheidend ist.

Bazel kann Abhängigkeiten effizient handhaben und führt eine Caching von Build-Ergebnissen durch, was zukünftige Builds beschleunigt. Diese Funktion ermöglicht es Entwicklern, Build-Ergebnisse über separate Maschinen hinweg zu teilen, was die Leistung weiter steigert.

Forschungsfragen

Diese Studie zielt darauf ab, mehrere wichtige Fragen zur Verwendung von Bazel innerhalb von CI-Bauten zu beantworten:

  1. Wie nutzen Entwickler die parallelen und inkrementellen Build-Funktionen von Bazel in ihren Projekten?
  2. Welchen Einfluss hat die parallele Build-Funktion von Bazel auf die Gesamt-Performance der Builds?
  3. Wie effektiv ist die inkrementelle Build-Funktion von Bazel bei der Reduzierung der Build-Zeiten?

Durch die Beantwortung dieser Fragen hoffen wir, Einblicke zu geben, wie Entwickler Bazel besser nutzen können und seine potenziellen Vorteile verstehen.

Studienmethodik

Um Antworten auf diese Fragen zu erhalten, haben wir eine umfassende Methodik entwickelt:

  1. Datensammlung: Wir haben Daten über Bazel- und Maven-Projekte von GitHub mithilfe ihrer Such-API gesammelt. Wir identifizierten insgesamt 383 Bazel-Projekte und 4.727 Maven-Projekte, um ihre Build-Prozesse zu analysieren.

  2. CI-Konfigurationsanalyse: Wir haben die CI-Konfigurationen sowohl für Bazel- als auch für Maven-Projekte untersucht, um zu sehen, wie sie CI-Dienste implementiert haben.

  3. Leistungsexperimente: Wir haben Tausende von Experimenten an den gesammelten Projekten durchgeführt, um den Einfluss von parallelen und inkrementellen Builds auf die Build-Zeiten zu messen.

  4. Vergleich: Während der Studie haben wir die Ergebnisse der Bazel-Projekte mit denen der Maven-Projekte verglichen, um die Unterschiede in der Leistung und der Nutzung der Funktionen besser zu verstehen.

Ergebnisse

Nutzung von Bazel in CI-Bauten

Aus unserer Analyse ergab sich, dass ein erheblicher Prozentsatz der Bazel-Projekte CI-Dienste angenommen hat, aber die Funktionen von Bazel nicht vollständig genutzt wurden. Tatsächlich nutzten 31,23 % der Bazel-Projekte Bazel nicht in ihrer CI-Konfiguration. Selbst unter denen, die Bazel verwendeten, waren viele auf zusätzliche Tools angewiesen, um seine Funktion zu erleichtern. Nur 44,08 % der Projekte machten Gebrauch von Bazels Caching für inkrementelle Builds.

Einfluss von parallelen Builds

Als wir die Leistungssteigerungen durch parallele Builds betrachteten, fanden wir heraus, dass diese die Build-Geschwindigkeiten erheblich verbessern konnten, insbesondere bei längeren Builds. Zum Beispiel lagen die Geschwindigkeitssteigerungen zwischen 2,00x und 12,80x, abhängig vom Grad der verwendeten Parallelität. Kürzere Builds hingegen zeigten bei niedrigeren Parallelitätsniveaus kaum Verbesserungen, und selbst bei maximaler Parallelität konnten mehrere Projekte nicht vollständig von der parallelen Ausführung profitieren.

Vorteile inkrementeller Builds

Die inkrementellen Build-Funktionen von Bazel zeigten ebenfalls vielversprechende Ergebnisse. Bei längeren Builds wurden mediane Geschwindigkeitssteigerungen von 4,22x und 4,71x bei Verwendung unterschiedlicher Caching-Strategien beobachtet. Bei kürzeren Build-Dauern waren die Vorteile jedoch viel weniger ausgeprägt, was darauf hinweist, dass inkrementelle Builds für grössere Projekte wertvoller sind.

Fazit

Zusammenfassend zeigt unsere Studie sowohl das Potenzial als auch die Herausforderungen der Nutzung von Bazel in kontinuierlichen Integrationsumgebungen auf. Während Bazel leistungsstarke Funktionen zur Beschleunigung der Build-Zeiten bietet, nutzen viele Entwickler diese Möglichkeiten nicht vollständig, insbesondere in CI-Setups. Durch diese Forschung wollen wir nicht nur Licht auf die aktuelle Nutzung von Bazel werfen, sondern auch die umfassendere Anwendung moderner Build-Technologien fördern.

Da Entwickler bestrebt sind, ihre CI-Prozesse zu verbessern, ist es entscheidend, die Effektivität von Tools wie Bazel zu verstehen. Indem wir hervorheben, wie Entwickler Bazel effektiver nutzen können, hoffen wir, zukünftige Verbesserungen der Build-Performance in Softwareprojekten zu leiten.

Zukünftige Arbeiten

Zukünftige Forschungen könnten weitere Aspekte von Bazels Fähigkeiten untersuchen, insbesondere in unterschiedlichen Projektumgebungen. Die Untersuchung der Gründe für die begrenzte Nutzung bestimmter Funktionen könnte ebenfalls Möglichkeiten zur Verbesserung bieten. Zusätzlich könnte das Studium, wie unterschiedliche Arten von Projekten auf die Funktionen von Bazel reagieren, wertvolle Einblicke für die Entwicklergemeinschaft liefern.

In der fortwährenden Entwicklung der Praktiken in der Softwareentwicklung ist das Verständnis und die Nutzung leistungsstarker Tools wie Bazel entscheidend, um Effizienz und Qualität in der Software-Auslieferung zu gewährleisten.

Originalquelle

Titel: Does Using Bazel Help Speed Up Continuous Integration Builds?

Zusammenfassung: A long continuous integration (CI) build forces developers to wait for CI feedback before starting subsequent development activities, leading to time wasted. In addition to a variety of build scheduling and test selection heuristics studied in the past, new artifact-based build technologies like Bazel have built-in support for advanced performance optimizations such as parallel build and incremental build (caching of build results). However, little is known about the extent to which new build technologies like Bazel deliver on their promised benefits, especially for long-build duration projects. In this study, we collected 383 Bazel projects from GitHub, then studied their parallel and incremental build usage of Bazel in 4 popular CI services, and compared the results with Maven projects. We conducted 3,500 experiments on 383 Bazel projects and analyzed the build logs of a subset of 70 buildable projects to evaluate the performance impact of Bazel's parallel builds. Additionally, we performed 102,232 experiments on the 70 buildable projects' last 100 commits to evaluate Bazel's incremental build performance. Our results show that 31.23% of Bazel projects adopt a CI service but do not use Bazel in the CI service, while for those who do use Bazel in CI, 27.76% of them use other tools to facilitate Bazel's execution. Compared to sequential builds, the median speedups for long-build duration projects are 2.00x, 3.84x, 7.36x, and 12.80x, at parallelism degrees 2, 4, 8, and 16, respectively, even though, compared to a clean build, applying incremental build achieves a median speedup of 4.22x (with a build system tool-independent CI cache) and 4.71x (with a build system tool-specific cache) for long-build duration projects. Our results provide guidance for developers to improve the usage of Bazel in their projects.

Autoren: Shenyu Zheng, Bram Adams, Ahmed E. Hassan

Letzte Aktualisierung: 2024-05-01 00:00:00

Sprache: English

Quell-URL: https://arxiv.org/abs/2405.00796

Quell-PDF: https://arxiv.org/pdf/2405.00796

Lizenz: https://creativecommons.org/licenses/by/4.0/

Änderungen: Diese Zusammenfassung wurde mit Unterstützung von AI erstellt und kann Ungenauigkeiten enthalten. Genaue Informationen entnehmen Sie bitte den hier verlinkten Originaldokumenten.

Vielen Dank an arxiv für die Nutzung seiner Open-Access-Interoperabilität.

Mehr von den Autoren

Ähnliche Artikel