# bazel

Bazel is an open-source build and test tool that automates software builds, runs tests, and supports multiple languages and platforms.

This is one page of public article previews, not the complete archive. Follow Next page to continue. Summaries are not the original full articles.

## Introducing Chainguard OS Packages: Secure ingredients for custom container builds

DevFeed: [Introducing Chainguard OS Packages: Secure ingredients for custom container builds](<https://devfeed.tech/articles/introducing-chainguard-os-packages-secure-ingredients-for-custom-container-builds-13112.md>)

Original publisher: [Read original article](<https://www.chainguard.dev/unchained/introducing-chainguard-os-packages>)

Published: 2026-03-17T00:00:00Z

Content type: article

Language: en

Sources: [Chainguard: Unchained](<https://devfeed.tech/sources/chainguard-unchained.md>)

Topics: [chainguard](<https://devfeed.tech/topics/chainguard.md>), [chainguard os](<https://devfeed.tech/topics/chainguard-os.md>), [container images](<https://devfeed.tech/topics/container-images.md>), [Docker Hardened Images](<https://devfeed.tech/topics/docker-hardened-images.md>), [Vulnerabilities](<https://devfeed.tech/topics/vulnerabilities.md>), [Linux](<https://devfeed.tech/topics/linux.md>), [Automation](<https://devfeed.tech/topics/automation.md>), [Dockerfile](<https://devfeed.tech/topics/dockerfile.md>), [Open Source](<https://devfeed.tech/topics/open-source.md>), [bazel](<https://devfeed.tech/topics/bazel.md>), [chainguard sboms](<https://devfeed.tech/topics/chainguard-sboms.md>), [APK](<https://devfeed.tech/topics/apk.md>)

Tags: [apk](<https://devfeed.tech/tags/apk.md>), [apko](<https://devfeed.tech/tags/apko.md>), [automation](<https://devfeed.tech/tags/automation.md>), [base-images](<https://devfeed.tech/tags/base-images.md>), [bazel](<https://devfeed.tech/tags/bazel.md>), [chainguard](<https://devfeed.tech/tags/chainguard.md>), [chainguard-containers](<https://devfeed.tech/tags/chainguard-containers.md>), [chainguard-libraries](<https://devfeed.tech/tags/chainguard-libraries.md>), [chainguard-os](<https://devfeed.tech/tags/chainguard-os.md>), [chainguard-os-packages](<https://devfeed.tech/tags/chainguard-os-packages.md>), [chainguard-packages](<https://devfeed.tech/tags/chainguard-packages.md>), [chainguard-sboms](<https://devfeed.tech/tags/chainguard-sboms.md>), [container](<https://devfeed.tech/tags/container.md>), [container-images](<https://devfeed.tech/tags/container-images.md>), [cve](<https://devfeed.tech/tags/cve.md>), [dockerfiles](<https://devfeed.tech/tags/dockerfiles.md>), [open-source](<https://devfeed.tech/tags/open-source.md>), [sboms](<https://devfeed.tech/tags/sboms.md>), [secure-software-packages](<https://devfeed.tech/tags/secure-software-packages.md>), [software-packages](<https://devfeed.tech/tags/software-packages.md>), [vulnerabilities](<https://devfeed.tech/tags/vulnerabilities.md>), [zero-cve-packages](<https://devfeed.tech/tags/zero-cve-packages.md>)

### AI overview

Chainguard introduces Chainguard OS Packages, a service providing continuously maintained, enterprise-grade packages and base images for teams that build custom container images. Customers retain control over image composition and build tooling while Chainguard handles package sourcing, rebuilding, vulnerability remediation, and SBOM generation.

### Source excerpt

Chainguard OS Packages are enterprise-grade, zero-CVE packages and base images built and continuously maintained in the Chainguard Factory.

## Automating code deletion with Gemini (and a little Python)

DevFeed: [Automating code deletion with Gemini (and a little Python)](<https://devfeed.tech/articles/automating-code-deletion-with-gemini-and-a-little-python-31143.md>)

Original publisher: [Read original article](<https://technicalwriting.dev/2025/04/gn/index.html>)

Published: 2025-04-29T00:00:00Z

Content type: tutorial

Language: en

Sources: [technicalwriting.dev](<https://devfeed.tech/sources/technicalwriting-dev.md>)

Topics: [Google AI](<https://devfeed.tech/topics/google-ai.md>), [Python](<https://devfeed.tech/topics/python.md>), [API](<https://devfeed.tech/topics/api.md>), [Automation](<https://devfeed.tech/topics/automation.md>), [Code](<https://devfeed.tech/topics/code.md>), [bazel](<https://devfeed.tech/topics/bazel.md>)

Tags: [api](<https://devfeed.tech/tags/api.md>), [automation](<https://devfeed.tech/tags/automation.md>), [bazel](<https://devfeed.tech/tags/bazel.md>), [build](<https://devfeed.tech/tags/build.md>), [code](<https://devfeed.tech/tags/code.md>), [gemini](<https://devfeed.tech/tags/gemini.md>), [genai](<https://devfeed.tech/tags/genai.md>), [gn](<https://devfeed.tech/tags/gn.md>), [python](<https://devfeed.tech/tags/python.md>), [script](<https://devfeed.tech/tags/script.md>)

### AI overview

The article describes a hybrid automation workflow that uses Python for repository-wide file discovery and filtering, then uses the Gemini API to remove documentation-generation features from 235 GN build files after a migration to Bazel.

### Source excerpt

Removing code from over 200 GN build files with Python and the Gemini API.

## Sphinx + Bazel: the good, the bad, and the ugly

DevFeed: [Sphinx + Bazel: the good, the bad, and the ugly](<https://devfeed.tech/articles/sphinx-bazel-the-good-the-bad-and-the-ugly-31141.md>)

Original publisher: [Read original article](<https://technicalwriting.dev/2025/03/context/index.html>)

Published: 2025-03-25T00:00:00Z

Content type: opinion

Language: en

Sources: [technicalwriting.dev](<https://devfeed.tech/sources/technicalwriting-dev.md>)

Topics: [bazel](<https://devfeed.tech/topics/bazel.md>), [Documentation](<https://devfeed.tech/topics/documentation.md>), [Software Engineering](<https://devfeed.tech/topics/software-engineering.md>), [Development](<https://devfeed.tech/topics/development.md>)

Tags: [bazel](<https://devfeed.tech/tags/bazel.md>), [build-system](<https://devfeed.tech/tags/build-system.md>), [documentation](<https://devfeed.tech/tags/documentation.md>), [shell-script](<https://devfeed.tech/tags/shell-script.md>), [software-engineering](<https://devfeed.tech/tags/software-engineering.md>), [sphinx](<https://devfeed.tech/tags/sphinx.md>)

### AI overview

An experienced technical writer discusses the strengths and weaknesses of managing Sphinx documentation projects with Bazel. The article explains how Bazel can orchestrate Sphinx workflows and describes reported maintenance and development-environment benefits, while helping readers decide whether it fits their project.

### Source excerpt

Strengths and weaknesses of orchestrating Sphinx projects with Bazel.

## Orchestrate Sphinx projects with Bazel

DevFeed: [Orchestrate Sphinx projects with Bazel](<https://devfeed.tech/articles/orchestrate-sphinx-projects-with-bazel-31142.md>)

Original publisher: [Read original article](<https://technicalwriting.dev/2025/03/tutorial/index.html>)

Published: 2025-03-25T00:00:00Z

Content type: tutorial

Language: en

Sources: [technicalwriting.dev](<https://devfeed.tech/sources/technicalwriting-dev.md>)

Topics: [bazel](<https://devfeed.tech/topics/bazel.md>), [Tutorial](<https://devfeed.tech/topics/tutorial.md>), [Documentation](<https://devfeed.tech/topics/documentation.md>), [GitHub](<https://devfeed.tech/topics/github.md>), [GitHub Pages](<https://devfeed.tech/topics/github-pages.md>), [Bash](<https://devfeed.tech/topics/bash.md>), [Linux](<https://devfeed.tech/topics/linux.md>), [Extension](<https://devfeed.tech/topics/extension.md>), [Template](<https://devfeed.tech/topics/template.md>)

Tags: [bash](<https://devfeed.tech/tags/bash.md>), [bazel](<https://devfeed.tech/tags/bazel.md>), [build-system](<https://devfeed.tech/tags/build-system.md>), [docs](<https://devfeed.tech/tags/docs.md>), [extension](<https://devfeed.tech/tags/extension.md>), [github](<https://devfeed.tech/tags/github.md>), [github-pages](<https://devfeed.tech/tags/github-pages.md>), [linux](<https://devfeed.tech/tags/linux.md>), [repository](<https://devfeed.tech/tags/repository.md>), [sphinx](<https://devfeed.tech/tags/sphinx.md>), [tutorial](<https://devfeed.tech/tags/tutorial.md>)

### AI overview

An end-to-end tutorial on managing a Sphinx project with Bazel, including setup, documentation builds, local preview, extensions, and deployment to GitHub Pages.

### Source excerpt

An end-to-end tutorial on managing a Sphinx project with Bazel.

## Scaling iOS at Bumble: Part 2/3 -- The Assessment

DevFeed: [Scaling iOS at Bumble: Part 2/3 -- The Assessment](<https://devfeed.tech/articles/scaling-ios-at-bumble-part-2-3-the-assessment-22603.md>)

Original publisher: [Read original article](<https://medium.com/bumble-tech/scaling-ios-at-bumble-239e0fa009f2?source=rss----6353b5325b1a---4>)

Author: Jonathan Crooke

Published: 2024-02-15T13:49:17Z

Content type: article

Language: en

Sources: [Bumble Tech](<https://devfeed.tech/sources/bumble-tech.md>)

Topics: [iOS](<https://devfeed.tech/topics/ios.md>), [Tuist](<https://devfeed.tech/topics/tuist.md>), [swift-package-manager](<https://devfeed.tech/topics/swift-package-manager.md>), [bazel](<https://devfeed.tech/topics/bazel.md>), [toolchain](<https://devfeed.tech/topics/toolchain.md>), [Xcode](<https://devfeed.tech/topics/xcode.md>), [Requirements](<https://devfeed.tech/topics/requirements.md>), [Testing](<https://devfeed.tech/topics/testing.md>)

Tags: [bazel](<https://devfeed.tech/tags/bazel.md>), [ios](<https://devfeed.tech/tags/ios.md>), [ios-app-development](<https://devfeed.tech/tags/ios-app-development.md>), [performance](<https://devfeed.tech/tags/performance.md>), [requirements](<https://devfeed.tech/tags/requirements.md>), [swift](<https://devfeed.tech/tags/swift.md>), [swift-package-manager](<https://devfeed.tech/tags/swift-package-manager.md>), [testing](<https://devfeed.tech/tags/testing.md>), [toolchain](<https://devfeed.tech/tags/toolchain.md>), [tuist](<https://devfeed.tech/tags/tuist.md>), [xcode](<https://devfeed.tech/tags/xcode.md>)

### AI overview

This article recaps Bumble's assessment process for replacing parts of its iOS project and build toolchain. It describes onboarding, proof-of-concept work, full-app conversion, and assessment criteria for Swift Package Manager, Tuist, and Bazel, including blockers, user experience, and performance.

### Source excerpt

Scaling iOS at Bumble: Part 2/3 -- The AssessmentRecap In our previous post we discussed how we came to be investigating project and build toolchain replacement solutions for our iOS codebase at Bumble Inc. We began executing proofs of concept for Swift Package Manager (SPM), Tuist and Bazel. The Process Our investigative process for each tool was performed in roughly the same manner: 1. Onboarding With the exception of some light use of SPM as a third-party dependency manager, no-one on the team was fully fluent with any of the tools. This meant that at first, we needed to learn the basics, which could be achieved by creating a minimum-viable manifest for one of our node modules. This would involve learning the manifest format and core commands for building, testing etc. 2. Medium-sized proof of concept Following on from the initial onboarding, we would then progress to converting parent modules, traversing the tree post-order. At each level we'd cover more of our core requirements and encounter edge-cases. Throughout, we noted learnings, limitations and fixes. 3. Full-app conversion At this stage, since our module tree exhibits a strong level of uniformity, we'd now have gathered enough experience to fully convert the app's child modules, and do so using automated tooling. How we achieved this will be discussed below. Unsurprisingly, the top-level app target was its own challenge, and required considerably handcrafting. We only aimed to achieve a minimum-viable conversion at this stage, and didn't expect tests to pass. That said, we'd usually have a fairly conformant conversion anyway, that would launch successfully to its home screen and usually plenty more. 4. Assessment With a converted app target in hand, we would now have a candidate for assessment. But what did we want to know? Our analysis looked at these areas: Blockers: simple enough, any limitations or issues in the tool's functionality whereby it was unable to serve our basic requirements Subjective user

## Images as Code: The pursuit of declarative image builds

DevFeed: [Images as Code: The pursuit of declarative image builds](<https://devfeed.tech/articles/images-as-code-the-pursuit-of-declarative-image-builds-13101.md>)

Original publisher: [Read original article](<https://www.chainguard.dev/unchained/images-as-code-the-pursuit-of-declarative-image-builds>)

Published: 2024-01-22T00:00:00Z

Content type: article

Language: en

Sources: [Chainguard: Unchained](<https://devfeed.tech/sources/chainguard-unchained.md>)

Topics: [Code](<https://devfeed.tech/topics/code.md>), [chainguard images](<https://devfeed.tech/topics/chainguard-images.md>), [Dockerfile](<https://devfeed.tech/topics/dockerfile.md>), [bazel](<https://devfeed.tech/topics/bazel.md>), [distroless](<https://devfeed.tech/topics/distroless.md>), [Docker](<https://devfeed.tech/topics/docker.md>), [Containers](<https://devfeed.tech/topics/containers.md>), [Kubernetes](<https://devfeed.tech/topics/kubernetes.md>), [Terraform](<https://devfeed.tech/topics/terraform.md>), [Infrastructure as code](<https://devfeed.tech/topics/infrastructure-as-code.md>), [Open Source](<https://devfeed.tech/topics/open-source.md>)

Tags: [apk](<https://devfeed.tech/tags/apk.md>), [apko](<https://devfeed.tech/tags/apko.md>), [bazel](<https://devfeed.tech/tags/bazel.md>), [chainguard](<https://devfeed.tech/tags/chainguard.md>), [chainguard-images](<https://devfeed.tech/tags/chainguard-images.md>), [code](<https://devfeed.tech/tags/code.md>), [container-image](<https://devfeed.tech/tags/container-image.md>), [containers](<https://devfeed.tech/tags/containers.md>), [declarative](<https://devfeed.tech/tags/declarative.md>), [distroless](<https://devfeed.tech/tags/distroless.md>), [docker](<https://devfeed.tech/tags/docker.md>), [infrastructure-as-code](<https://devfeed.tech/tags/infrastructure-as-code.md>), [kubernetes](<https://devfeed.tech/tags/kubernetes.md>), [open-source](<https://devfeed.tech/tags/open-source.md>), [reproducibility](<https://devfeed.tech/tags/reproducibility.md>), [terraform](<https://devfeed.tech/tags/terraform.md>)

### AI overview

The article traces the pursuit of declarative container image builds. It critiques imperative Dockerfile-based builds for making multi-tenant, multi-architecture, and reproducible builds difficult, then discusses Bazel and distroless images as steps toward expressing intended build state. Kubernetes and Terraform are presented as examples of declarative systems, inspiring the idea of "Images as Code."

### Source excerpt

Chainguard's CTO Matt Moore describes the process of creating a declarative container image build for Chainguard Images.

## The haunting of CVE-2022-3474: A ghostly tale of package detection failure

DevFeed: [The haunting of CVE-2022-3474: A ghostly tale of package detection failure](<https://devfeed.tech/articles/the-haunting-of-cve-2022-3474-a-ghostly-tale-of-package-detection-failure-13254.md>)

Original publisher: [Read original article](<https://www.chainguard.dev/unchained/the-haunting-of-cve-2022-3474-a-ghostly-tale-of-package-detection-failure>)

Published: 2023-10-10T00:00:00Z

Content type: article

Language: en

Sources: [Chainguard: Unchained](<https://devfeed.tech/sources/chainguard-unchained.md>)

Topics: [vulnerability](<https://devfeed.tech/topics/vulnerability.md>), [container images](<https://devfeed.tech/topics/container-images.md>), [chainguard images](<https://devfeed.tech/topics/chainguard-images.md>), [vulnerability management](<https://devfeed.tech/topics/vulnerability-management.md>), [bazel](<https://devfeed.tech/topics/bazel.md>), [trivy](<https://devfeed.tech/topics/trivy.md>)

Tags: [bazel](<https://devfeed.tech/tags/bazel.md>), [chainguard-images](<https://devfeed.tech/tags/chainguard-images.md>), [container-images](<https://devfeed.tech/tags/container-images.md>), [cve-2022-3474](<https://devfeed.tech/tags/cve-2022-3474.md>), [false-negative](<https://devfeed.tech/tags/false-negative.md>), [trivy](<https://devfeed.tech/tags/trivy.md>), [vulnerability-management](<https://devfeed.tech/tags/vulnerability-management.md>)

### AI overview

The article explains how scanners can produce false negatives when they fail to identify a package in a container image. Using CVE-2022-3474 in Bazel 5.3.1 as an example, it describes how missing Bazel package metadata prevented Trivy from detecting the vulnerability and presents Chainguard Images' package metadata and SBOMs as a way to improve detection.

### Source excerpt

Explore the risks of scanner false negatives, the pitfalls of missing the Bazel package, and how Chainguard Images ensure accurate vulnerability detection.

## MLIR -- Running and Testing a Lowering

DevFeed: [MLIR -- Running and Testing a Lowering](<https://devfeed.tech/articles/mlir-running-and-testing-a-lowering-40468.md>)

Original publisher: [Read original article](<https://www.jeremykun.com/2023/08/10/mlir-running-and-testing-a-lowering/>)

Published: 2023-08-10T14:36:13Z

Content type: tutorial

Language: en

Sources: [Jeremy Kun](<https://devfeed.tech/sources/jeremy-kun.md>)

Topics: [Compiler](<https://devfeed.tech/topics/compiler.md>), [Testing](<https://devfeed.tech/topics/testing.md>), [Optimization](<https://devfeed.tech/topics/optimization.md>), [bazel](<https://devfeed.tech/topics/bazel.md>), [LLVM](<https://devfeed.tech/topics/llvm.md>)

Tags: [bazel](<https://devfeed.tech/tags/bazel.md>), [c-plus-plus](<https://devfeed.tech/tags/c-plus-plus.md>), [compiler](<https://devfeed.tech/tags/compiler.md>), [compilers](<https://devfeed.tech/tags/compilers.md>), [fhe](<https://devfeed.tech/tags/fhe.md>), [llvm](<https://devfeed.tech/tags/llvm.md>), [mathematics](<https://devfeed.tech/tags/mathematics.md>), [mlir](<https://devfeed.tech/tags/mlir.md>), [optimization](<https://devfeed.tech/tags/optimization.md>), [programming](<https://devfeed.tech/tags/programming.md>), [testing](<https://devfeed.tech/tags/testing.md>), [tiling](<https://devfeed.tech/tags/tiling.md>)

### AI overview

This tutorial introduces MLIR dialects and lowerings, explains how MLIR incrementally transforms programs through intermediate representations, and demonstrates end-to-end testing for a simple lowering.

### Source excerpt

Table of Contents Last time, we covered a Bazel build system setup for an MLIR project. This time we'll give an overview of a simple lowering and show how end-to-end tests work in MLIR. All of the code for this article is contained in this pull request on GitHub, and the commits are nicely organized and quite readable. Two of the central concepts in MLIR are dialects and lowerings. These are the scaffolding within which we can do the truly interesting parts of a compiler--that is, the optimizations and analyses.

## It all started with a commit: Celebrating 6 years of Distroless

DevFeed: [It all started with a commit: Celebrating 6 years of Distroless](<https://devfeed.tech/articles/it-all-started-with-a-commit-celebrating-6-years-of-distroless-13129.md>)

Original publisher: [Read original article](<https://www.chainguard.dev/unchained/it-all-started-with-a-commit-celebrating-6-years-of-distroless>)

Published: 2023-04-12T00:00:00Z

Content type: article

Language: en

Sources: [Chainguard: Unchained](<https://devfeed.tech/sources/chainguard-unchained.md>)

Topics: [distroless](<https://devfeed.tech/topics/distroless.md>), [Containers](<https://devfeed.tech/topics/containers.md>), [supply-chain-security](<https://devfeed.tech/topics/supply-chain-security.md>), [container images](<https://devfeed.tech/topics/container-images.md>), [sigstore](<https://devfeed.tech/topics/sigstore.md>), [chainguard images](<https://devfeed.tech/topics/chainguard-images.md>), [Kubernetes](<https://devfeed.tech/topics/kubernetes.md>), [vulnerability](<https://devfeed.tech/topics/vulnerability.md>), [bazel](<https://devfeed.tech/topics/bazel.md>), [Debian](<https://devfeed.tech/topics/debian.md>), [vulnerability management](<https://devfeed.tech/topics/vulnerability-management.md>), [Go](<https://devfeed.tech/topics/go.md>)

Tags: [bazel](<https://devfeed.tech/tags/bazel.md>), [c-plus-plus](<https://devfeed.tech/tags/c-plus-plus.md>), [chainguard](<https://devfeed.tech/tags/chainguard.md>), [chainguard-images](<https://devfeed.tech/tags/chainguard-images.md>), [containers](<https://devfeed.tech/tags/containers.md>), [debian](<https://devfeed.tech/tags/debian.md>), [digital-signatures](<https://devfeed.tech/tags/digital-signatures.md>), [distroless](<https://devfeed.tech/tags/distroless.md>), [distroless-containers](<https://devfeed.tech/tags/distroless-containers.md>), [go](<https://devfeed.tech/tags/go.md>), [java](<https://devfeed.tech/tags/java.md>), [kubernetes](<https://devfeed.tech/tags/kubernetes.md>), [python](<https://devfeed.tech/tags/python.md>), [release-engineering](<https://devfeed.tech/tags/release-engineering.md>), [sigstore](<https://devfeed.tech/tags/sigstore.md>), [software-supply-chain-security](<https://devfeed.tech/tags/software-supply-chain-security.md>), [verify](<https://devfeed.tech/tags/verify.md>), [vulnerability](<https://devfeed.tech/tags/vulnerability.md>), [vulnerability-management](<https://devfeed.tech/tags/vulnerability-management.md>)

### AI overview

The article commemorates six years of Distroless, describing its goal of creating more secure and efficient container images by removing non-essential components. It covers the Bazel-based build tooling, language runtimes, Kubernetes adoption, vulnerability-management benefits, and later integration with Sigstore for container signing and authenticity verification. It also introduces the subsequent development of Chainguard Images.

### Source excerpt

The goal of Distroless is to provide a more secure and efficient way to package and run software in containers by using only essential components.

## First Annual Bazel-iOS Con 2022

DevFeed: [First Annual Bazel-iOS Con 2022](<https://devfeed.tech/articles/first-annual-bazel-ios-con-2022-15656.md>)

Original publisher: [Read original article](<https://developer.squareup.com/blog/first-annual-bazel-ios-con-2022>)

Author: Jerry Marino

Published: 2022-09-12T07:00:00Z

Content type: news

Language: en

Sources: [Square Corner Blog](<https://devfeed.tech/sources/square-corner-blog-medium.md>), [Square Corner Blog RSS Feed](<https://devfeed.tech/sources/square-corner-blog-rss-feed.md>)

Topics: [bazel](<https://devfeed.tech/topics/bazel.md>), [iOS](<https://devfeed.tech/topics/ios.md>), [Development](<https://devfeed.tech/topics/development.md>), [Open Source](<https://devfeed.tech/topics/open-source.md>)

Tags: [bazel](<https://devfeed.tech/tags/bazel.md>), [conference](<https://devfeed.tech/tags/conference.md>), [development](<https://devfeed.tech/tags/development.md>), [engineering](<https://devfeed.tech/tags/engineering.md>), [event](<https://devfeed.tech/tags/event.md>), [github](<https://devfeed.tech/tags/github.md>), [ios](<https://devfeed.tech/tags/ios.md>), [open-source](<https://devfeed.tech/tags/open-source.md>)

### AI overview

Square announces the first annual Bazel-iOS Con, an open developer conference scheduled for September 29, 2022. The event will feature talks, panels, discussion groups, and breakout sessions about using Bazel for iOS development.

### Source excerpt

Join us at Bazel-IOS Con September 29, 2022

## Getting Square's iOS build ready for Apple Silicon with Bazel

DevFeed: [Getting Square's iOS build ready for Apple Silicon with Bazel](<https://devfeed.tech/articles/getting-square-s-ios-build-ready-for-apple-silicon-with-bazel-15665.md>)

Original publisher: [Read original article](<https://developer.squareup.com/blog/getting-squares-ios-build-ready-for-apple-silicon-with-bazel>)

Author: Jerry Marino

Published: 2022-01-27T20:00:00Z

Content type: tutorial

Language: en

Sources: [Square Corner Blog](<https://devfeed.tech/sources/square-corner-blog-medium.md>), [Square Corner Blog RSS Feed](<https://devfeed.tech/sources/square-corner-blog-rss-feed.md>)

Topics: [bazel](<https://devfeed.tech/topics/bazel.md>), [iOS](<https://devfeed.tech/topics/ios.md>), [build times](<https://devfeed.tech/topics/build-times.md>), [cpu](<https://devfeed.tech/topics/cpu.md>), [Objective-C](<https://devfeed.tech/topics/objective-c.md>), [Swift](<https://devfeed.tech/topics/swift.md>), [Open Source](<https://devfeed.tech/topics/open-source.md>)

Tags: [apple](<https://devfeed.tech/tags/apple.md>), [arm](<https://devfeed.tech/tags/arm.md>), [bazel](<https://devfeed.tech/tags/bazel.md>), [build](<https://devfeed.tech/tags/build.md>), [build-times](<https://devfeed.tech/tags/build-times.md>), [caching](<https://devfeed.tech/tags/caching.md>), [engineering](<https://devfeed.tech/tags/engineering.md>), [ios](<https://devfeed.tech/tags/ios.md>), [objective-c](<https://devfeed.tech/tags/objective-c.md>), [open-source](<https://devfeed.tech/tags/open-source.md>), [simulator](<https://devfeed.tech/tags/simulator.md>), [swift](<https://devfeed.tech/tags/swift.md>), [x86](<https://devfeed.tech/tags/x86.md>)

### AI overview

Square describes adapting its Bazel-based iOS build system for Apple Silicon by building and running iOS applications on the M1 simulator. The article explains the available development paths and why device builds and x86_64 builds under Rosetta 2 were not selected.

### Source excerpt

Building and running iOS builds using the M1 simulator

## Writing a Bazel rule set

DevFeed: [Writing a Bazel rule set](<https://devfeed.tech/articles/writing-a-bazel-rule-set-21771.md>)

Original publisher: [Read original article](<https://enoent.fr/posts/creating-a-blog-with-bazel/04-writing-bazel-rule-set/>)

Author: Marc Plano-Lesay

Published: 2020-05-16T04:55:00Z

Content type: tutorial

Language: en

Sources: [Marc Plano-Lesay](<https://devfeed.tech/sources/marc-plano-lesay.md>)

Topics: [bazel](<https://devfeed.tech/topics/bazel.md>), [Command-line interface](<https://devfeed.tech/topics/cli.md>), [configuration](<https://devfeed.tech/topics/configuration.md>), [Java](<https://devfeed.tech/topics/java.md>), [SVG](<https://devfeed.tech/topics/svg.md>)

Tags: [bazel](<https://devfeed.tech/tags/bazel.md>), [cli](<https://devfeed.tech/tags/cli.md>), [configuration](<https://devfeed.tech/tags/configuration.md>), [java](<https://devfeed.tech/tags/java.md>), [plantuml](<https://devfeed.tech/tags/plantuml.md>), [svg](<https://devfeed.tech/tags/svg.md>)

### AI overview

A tutorial on writing and testing a Bazel rule set to run PlantUML as a command-line tool. It covers PlantUML inputs and outputs, Java JAR execution, configuration files, SVG and PNG generation, and challenges from platform-dependent font rendering and non-hermetic metadata.

### Source excerpt

This post will cover two things: How to run an arbitrary tool with Bazel (in this case, PlantUML, a tool to generate diagrams), by writing a rule set How to test this rule set. It should be mentioned that while I was working on this rule set, it became more and more apparent PlantUML is not a great candidate for this kind of integration, as its output is platform-dependent (the font rendering). Despite that, it's still a simple tool and as such its integration is simple, albeit not perfect (the rendering tests I wrote need to run on the same platform every time). PlantUML usage PlantUML is a tool that takes a text input looking like this: @startuml Alice -> Bob: SYN @enduml And outputs an image looking like this: sequenceDiagram Alice->>Bob: SYN PlantUML sample output PlantUML has multiple way of being invoked (CLI, GUI, as well as a lot of integrations with different tools), but we'll go with the easiest: a one-shot CLI invocation. It takes as inputs: A text file, representing a diagram An optional configuration file, giving control over the output It then outputs a single image file, which can be of different formats (we'll just cover SVG and PNG in this article, but adding support for other formats is trivial). PlantUML ships as a JAR file, which needs to be run with Java. An invocation generating the sample image above would look like that: java -jar plantuml.jar -tpng -p < 'mysource.puml' > 'dir/myoutput.png' Pretty straightforward: run the JAR, with a single option for the image type, pipe the content of the input file and get the output file back. The -p flag is the short form of -pipe, which we're using as using pipes is the only way of properly controlling the output path (without that, PlantUML tries to be smart and places the output next to the input). With a configuration file: java -jar plantuml.jar -tpng -config config.puml -p < 'mysource.puml' > 'dir/myoutput.png' Simple enough, right? Well, not really. PlantUML actually integrates some metadata in th

## Compiling a Kotlin application with Bazel

DevFeed: [Compiling a Kotlin application with Bazel](<https://devfeed.tech/articles/compiling-a-kotlin-application-with-bazel-21769.md>)

Original publisher: [Read original article](<https://enoent.fr/posts/creating-a-blog-with-bazel/02-compiling-a-kotlin-application-with-bazel/>)

Author: Marc Plano-Lesay

Published: 2019-12-08T00:30:00Z

Content type: tutorial

Language: en

Sources: [Marc Plano-Lesay](<https://devfeed.tech/sources/marc-plano-lesay.md>)

Topics: [bazel](<https://devfeed.tech/topics/bazel.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [Dagger](<https://devfeed.tech/topics/dagger.md>), [Maven](<https://devfeed.tech/topics/maven.md>), [Command-line interface](<https://devfeed.tech/topics/cli.md>)

Tags: [annotation-processor](<https://devfeed.tech/tags/annotation-processor.md>), [bazel](<https://devfeed.tech/tags/bazel.md>), [dagger](<https://devfeed.tech/tags/dagger.md>), [dependencies](<https://devfeed.tech/tags/dependencies.md>), [dependency](<https://devfeed.tech/tags/dependency.md>), [how-to](<https://devfeed.tech/tags/how-to.md>), [java](<https://devfeed.tech/tags/java.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>)

### AI overview

A tutorial on compiling a small Kotlin application with Bazel. It explains the Phosphorus application's structure, its image-comparison purpose, Maven dependencies, rules_jvm_external, tests, Dagger's annotation processor, and Kotlin integration.

### Source excerpt

This post will describe how to compile a small application written in Kotlin using Bazel, tests, as well as how to use static analyzers. Phosphorus Phosphorus is the application that this post will cover. It's a small utility that I wrote to check if an image matches a reference. If it doesn't, Phosphorus generates an image highlighting the differences. The goal is to be able to check that something generates an image in a given way, and doesn't change - at least if it's not expected. The actual usage will be covered later in this series. While it's not open-source yet, it's something I intend to do at some point. It's written in Kotlin, as a couple external dependencies ( Clikt and Dagger), as well as a few tests. This is the structure: classDiagram namespace loader { class ImageLoader { <<interface>> } class ImageIoLoader { } } namespace differ { class ImageDiffer { <<interface>> } class ImageDifferImpl { } } namespace data { class Image class DiffResult } class Phosphorus ImageIoLoader ..|> ImageLoader ImageDifferImpl ..|> ImageDiffer Phosphorus --> ImageLoader Phosphorus --> ImageDiffer Phosphorus's class diagram The differ module contains the core logic - comparing two images, and generating a DiffResult. This DiffResult contains both the straightforward result of the comparison (are the two images identical?) and an image highlighting the differences, if any. The loader package is responsible for loading and writing images. Finally, the Phosphorus class orchestrates all that, in addition to processing command line arguments with Clikt. Dependencies Phosphorus has two dependencies: Clikt, and Dagger. Both of them are available as Maven artifacts. In order to pull Maven artifacts, the Bazel team provides a set of rules called rules_jvm_external. The idea is the following: you list a bunch of Maven coordinates and repositories, the rule will fetch all of them (and their transitive dependencies) during the loading phase, and generate Bazel targets corresponding to

## Why Bazel?

DevFeed: [Why Bazel?](<https://devfeed.tech/articles/why-bazel-21770.md>)

Original publisher: [Read original article](<https://enoent.fr/posts/creating-a-blog-with-bazel/03-why-bazel/>)

Author: Marc Plano-Lesay

Published: 2019-11-02T07:00:00Z

Content type: tutorial

Language: en

Sources: [Marc Plano-Lesay](<https://devfeed.tech/sources/marc-plano-lesay.md>)

Topics: [bazel](<https://devfeed.tech/topics/bazel.md>), [Caching](<https://devfeed.tech/topics/caching.md>), [toolchain](<https://devfeed.tech/topics/toolchain.md>), [C++](<https://devfeed.tech/topics/c-plus-plus.md>), [Compiler](<https://devfeed.tech/topics/compiler.md>)

Tags: [bazel](<https://devfeed.tech/tags/bazel.md>), [build-system](<https://devfeed.tech/tags/build-system.md>), [c-plus-plus](<https://devfeed.tech/tags/c-plus-plus.md>), [caching](<https://devfeed.tech/tags/caching.md>), [compiler](<https://devfeed.tech/tags/compiler.md>), [reproducibility](<https://devfeed.tech/tags/reproducibility.md>), [toolchain](<https://devfeed.tech/tags/toolchain.md>)

### AI overview

This tutorial explains what Bazel is, how its hermetic and reproducible build model works, and why the author chose it. It demonstrates C++ library and binary targets, dependency-driven builds, caching, toolchains, and extensibility through Starlark rules.

### Source excerpt

In this post, we'll cover what Bazel is, how to use it, and why I chose to use it. What is Bazel? Bazel is a build-system released by Google in 2015. It actually is derived from the internal build-system Google uses internally for most of its own code-base, called Blaze. Building at scale Bazel has a huge focus on hermetic builds, and reproducibility. Every build step is, from a really broad perspective, defined as a list of inputs, tools, and outputs. This allows for efficient and robust caching (if no inputs nor tools changed, then this target doesn't need to be rebuilt, and this cascades through the whole build graph). Let's see a sample definition of a C++ library, as well as a C++ binary depending on it: BUILD cc_library( name = "my_feature" srcs = [ "feature_impl.cpp", "utils.cpp", ], hdrs = [ "feature.hpp", "utils.hpp", ], ) cc_binary( name = "my_app", srcs = ["main.cpp"], deps = [ ":my_feature", ], ) cc_library and cc_binary are both depending an implicit dependency on a C++ toolchain (I won't enter into any language-specific features in this post, but if you don't tell Bazel to use a specific C++ toolchain, it will try to use your system compiler - which is convenient, but loses a bit of hermeticity and reproducibility). Everything else is pretty obvious here: we defined two different build targets, one of them being a library called my_feature, and the other one a binary called my_app, depending on my_feature. If we build my_app, Bazel will automatically build my_feature first as you would expect, and then proceed to build my_app. If you change the main.cpp and re-build my_app, it will skip the compilation of my_feature entirely, as nothing changed. Bazel's cache handling is really reliable. During the past few months, I've done a lot of diverse things (writing my own rules, compiling a bunch of different languages, depending on third-party libraries and rules...), and never had a single time to run bazel clean. Now I didn't use a lot of other build systems

## Rebuilding a Blog with Hugo and Bazel

DevFeed: [Rebuilding a Blog with Hugo and Bazel](<https://devfeed.tech/articles/a-new-beginning-21768.md>)

Original publisher: [Read original article](<https://enoent.fr/posts/creating-a-blog-with-bazel/01-a-new-beginning/>)

Author: Marc Plano-Lesay

Published: 2019-10-31T10:05:00Z

Content type: article

Language: en

Sources: [Marc Plano-Lesay](<https://devfeed.tech/sources/marc-plano-lesay.md>)

Topics: [bazel](<https://devfeed.tech/topics/bazel.md>), [Hugo](<https://devfeed.tech/topics/hugo.md>), [Deployment](<https://devfeed.tech/topics/deployment.md>), [Markdown](<https://devfeed.tech/topics/markdown.md>), [Docker](<https://devfeed.tech/topics/docker.md>), [HTML](<https://devfeed.tech/topics/html.md>)

Tags: [bazel](<https://devfeed.tech/tags/bazel.md>), [deployment](<https://devfeed.tech/tags/deployment.md>), [docker-image](<https://devfeed.tech/tags/docker-image.md>), [html](<https://devfeed.tech/tags/html.md>), [hugo](<https://devfeed.tech/tags/hugo.md>), [markdown](<https://devfeed.tech/tags/markdown.md>)

### AI overview

The author revives a blog by migrating it from Octopress 2 to Hugo and using Bazel to automate Sass processing, HTML generation, Docker image creation, and testing. Deployment is not yet complete.

### Source excerpt

This blog has been inactive for a long time. I tried to at least post an article yearly, and next thing you know, two years and a half fly by... Halloween seemed like a good time to resurrect it. I wanted to start writing again recently, and faced an issue: this blog was using Octopress 2. Well, Octopress has apparently been dead for even longer than this blog. So I wanted to switch to another static generator. I found Hugo, which is actively maintained and ticked all the boxes I had, so that's what I settled for (sorry for the probable RSS feed mess - while I set up 301 redirects for the old articles, I guess this won't play nicely with any RSS reader. This is actually what prompted this article...) This could have been an hour worth of work - migrating the content (both Hugo and Octopress are using Markdown, so that part was really simple), finding or putting together a nice template, and call it a day. But how fun is that? Instead, I chose to go with the most complex (hence fun, right?) approach possible. And that was by using Bazel to do everything. Sass linting and pre-processing, HTML generation, generating a Docker image, deploying it... and with tests for a lot of things along the way. Today, the deployment part is still missing (I'm working on it), but everything else is pretty much ready. I plan to describe this whole journey soon, although I don't know exactly which form it will take yet - probably a series of small articles covering a specific aspect. In the meantime, welcome back on a brand-new blog!

## Angular Version 8: New Features, Ivy, and Migration Considerations

DevFeed: [Angular Version 8: New Features, Ivy, and Migration Considerations](<https://devfeed.tech/articles/update-to-angular-version-8-now-21347.md>)

Original publisher: [Read original article](<https://juri.dev/blog/2019/06/angular-v8/>)

Published: 2019-06-03T00:00:00Z

Content type: tutorial

Language: en

Sources: [Juri Strumpflohner](<https://devfeed.tech/sources/juri-strumpflohner.md>)

Topics: [Angular](<https://devfeed.tech/topics/angular.md>), [browser](<https://devfeed.tech/topics/browser.md>), [bazel](<https://devfeed.tech/topics/bazel.md>), [Deployment](<https://devfeed.tech/topics/deployment.md>), [Tooling](<https://devfeed.tech/topics/tooling.md>)

Tags: [angular](<https://devfeed.tech/tags/angular.md>), [build](<https://devfeed.tech/tags/build.md>), [build-system](<https://devfeed.tech/tags/build-system.md>), [code-splitting](<https://devfeed.tech/tags/code-splitting.md>), [import](<https://devfeed.tech/tags/import.md>), [parallel](<https://devfeed.tech/tags/parallel.md>), [release](<https://devfeed.tech/tags/release.md>), [tooling](<https://devfeed.tech/tags/tooling.md>), [v8](<https://devfeed.tech/tags/v8.md>)

### AI overview

This tutorial reviews Angular 8's major changes, including differential loading, stabilized builders, automated deployment integrations, web workers, service worker improvements, code splitting, AngularJS integration, and improved IDE support. It explains that Ivy is included but not enabled by default and can be enabled experimentally.

### Source excerpt

Lorem ipsum dolor sit amet