From 9ccbe17baf1cdc0658d3c110cabcbcebd8abc7ac Mon Sep 17 00:00:00 2001 From: Michael Kriese Date: Wed, 8 Apr 2026 14:31:23 +0200 Subject: [PATCH 1/2] feat(cli): add buf support --- docs/custom-registries.md | 14 ++++++++ src/cli/install-tool/index.ts | 2 ++ src/cli/tools/buf.ts | 66 +++++++++++++++++++++++++++++++++++ src/cli/tools/index.ts | 1 + test/Dockerfile.distro | 3 ++ test/latest/Dockerfile | 5 ++- test/latest/Dockerfile.arm64 | 3 ++ 7 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 src/cli/tools/buf.ts diff --git a/docs/custom-registries.md b/docs/custom-registries.md index 559b027ddd..2aba45aad6 100644 --- a/docs/custom-registries.md +++ b/docs/custom-registries.md @@ -57,6 +57,20 @@ https://github.com/bazelbuild/bazelisk/releases/download/v1.19.0/bazelisk-linux- https://github.com/bazelbuild/bazelisk/releases/download/v1.19.0/bazelisk-linux-arm64 ``` +## `buf` + +Buf releases are downloaded from: + +- `https://github.com/bufbuild/buf/releases` + +Samples: + +```txt +https://github.com/bufbuild/buf/releases/download/v1.67.0/buf-Linux-x84_64.tar.gz +https://github.com/bufbuild/buf/releases/download/v1.67.0/buf-Linux-aarch64.tar.gz +https://github.com/bufbuild/buf/releases/download/v1.67.0/sha256.txt +``` + ## `bun` Bun releases are downloaded from: diff --git a/src/cli/install-tool/index.ts b/src/cli/install-tool/index.ts index 792ab37b00..d49fe3e1f1 100644 --- a/src/cli/install-tool/index.ts +++ b/src/cli/install-tool/index.ts @@ -9,6 +9,7 @@ import { } from '../services/index.ts'; import { ApkoInstallService } from '../tools/apko.ts'; import { BazeliskInstallService } from '../tools/bazelisk.ts'; +import { BufInstallService } from '../tools/buf.ts'; import { BunInstallService } from '../tools/bun.ts'; import { DartInstallService } from '../tools/dart/index.ts'; import { DenoInstallService } from '../tools/deno.ts'; @@ -132,6 +133,7 @@ async function prepareInstallContainer(): Promise { container.bind(INSTALL_TOOL_TOKEN).to(BazeliskInstallService); container.bind(INSTALL_TOOL_TOKEN).to(BuildxInstallService); container.bind(INSTALL_TOOL_TOKEN).to(BunInstallService); + container.bind(INSTALL_TOOL_TOKEN).to(BufInstallService); container.bind(INSTALL_TOOL_TOKEN).to(CabalInstallService); container.bind(INSTALL_TOOL_TOKEN).to(CocoapodsInstallService); container.bind(INSTALL_TOOL_TOKEN).to(ConanInstallService); diff --git a/src/cli/tools/buf.ts b/src/cli/tools/buf.ts new file mode 100644 index 0000000000..61b61d15a6 --- /dev/null +++ b/src/cli/tools/buf.ts @@ -0,0 +1,66 @@ +import fs from 'node:fs/promises'; +import { join } from 'node:path'; +import { injectFromHierarchy, injectable } from 'inversify'; +import { BaseInstallService } from '../install-tool/base-install.service.ts'; + +@injectable() +@injectFromHierarchy() +export class BufInstallService extends BaseInstallService { + readonly name = 'buf'; + + private get ghArch(): string { + switch (this.envSvc.arch) { + case 'arm64': + return 'aarch64'; + case 'amd64': + return 'x86_64'; + } + } + + override async install(version: string): Promise { + /** + * @example + * @see {@href https://github.com/bufbuild/buf/releases/tag/v1.67.0} + */ + const baseUrl = `https://github.com/bufbuild/buf/releases/download/v${version}/`; + + const filename = `buf_linux_${this.ghArch}.tar.gz`; + + const checksumFile = await this.http.download({ + url: `${baseUrl}sha256.txt`, + }); + const expectedChecksum = (await fs.readFile(checksumFile, 'utf-8')) + .split('\n') + .find((l) => l.includes(filename)) + ?.split(' ')[0]; + + const file = await this.http.download({ + url: `${baseUrl}${filename}`, + checksumType: 'sha256', + expectedChecksum, + }); + + await this.pathSvc.ensureToolPath(this.name); + + const path = join( + await this.pathSvc.createVersionedToolPath(this.name, version), + 'bin', + ); + await fs.mkdir(path); + await this.compress.extract({ + file, + cwd: path, + strip: 1, + files: ['bin/buf'], + }); + } + + override async link(version: string): Promise { + const src = join(this.pathSvc.versionedToolPath(this.name, version), 'bin'); + await this.shellwrapper({ srcDir: src }); + } + + override async test(_version: string): Promise { + await this._spawn(this.name, ['--version']); + } +} diff --git a/src/cli/tools/index.ts b/src/cli/tools/index.ts index 76725c520f..aa63208879 100644 --- a/src/cli/tools/index.ts +++ b/src/cli/tools/index.ts @@ -4,6 +4,7 @@ export const NoPrepareTools = [ 'apko', 'bazelisk', 'bower', + 'buf', 'buildx', 'bun', 'bundler', diff --git a/test/Dockerfile.distro b/test/Dockerfile.distro index 8461d68358..7abe358a36 100644 --- a/test/Dockerfile.distro +++ b/test/Dockerfile.distro @@ -46,6 +46,9 @@ FROM build AS test # renovate: datasource=github-releases packageName=bazelbuild/bazelisk RUN install-tool bazelisk v1.28.1 +# renovate: datasource=github-releases packageName=bufbuild/buf +RUN install-tool buf v1.67.0 + # renovate: datasource=npm RUN install-tool bun 1.3.11 diff --git a/test/latest/Dockerfile b/test/latest/Dockerfile index c160c5c911..ecc90067a7 100644 --- a/test/latest/Dockerfile +++ b/test/latest/Dockerfile @@ -212,13 +212,16 @@ RUN prepare-tool all RUN set -ex; [ -d /usr/local/erlang ] && echo "works" || exit 1; #-------------------------------------- -# test: bazelisk, bun, deno, devbox, helmfile, kustomize, skopeo, tofu, vendir +# test: bazelisk, buf, bun, deno, devbox, helmfile, kustomize, skopeo, tofu, vendir #-------------------------------------- FROM base AS teste # renovate: datasource=github-releases packageName=bazelbuild/bazelisk RUN install-tool bazelisk v1.28.1 +# renovate: datasource=github-releases packageName=bufbuild/buf +RUN install-tool buf v1.67.0 + # renovate: datasource=npm RUN install-tool bun 1.3.11 diff --git a/test/latest/Dockerfile.arm64 b/test/latest/Dockerfile.arm64 index a7c466dc25..68017c5bc7 100644 --- a/test/latest/Dockerfile.arm64 +++ b/test/latest/Dockerfile.arm64 @@ -173,6 +173,9 @@ RUN install-tool vendir v0.45.2 #-------------------------------------- FROM base AS test-others +# renovate: datasource=github-releases packageName=bufbuild/buf +RUN install-tool buf v1.67.0 + # renovate: datasource=github-releases packageName=kubernetes/kubernetes RUN install-tool kubectl v1.35.3 From 244e77c87621259acf1d567e855e7f059bf44172 Mon Sep 17 00:00:00 2001 From: Michael Kriese Date: Wed, 8 Apr 2026 16:12:59 +0200 Subject: [PATCH 2/2] fix: wrong ufi --- src/cli/tools/buf.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cli/tools/buf.ts b/src/cli/tools/buf.ts index 61b61d15a6..ca950aa88a 100644 --- a/src/cli/tools/buf.ts +++ b/src/cli/tools/buf.ts @@ -24,7 +24,7 @@ export class BufInstallService extends BaseInstallService { */ const baseUrl = `https://github.com/bufbuild/buf/releases/download/v${version}/`; - const filename = `buf_linux_${this.ghArch}.tar.gz`; + const filename = `buf-Linux-${this.ghArch}.tar.gz`; const checksumFile = await this.http.download({ url: `${baseUrl}sha256.txt`,