将项目发布到 Homebrew 官方仓库

简介: 最近将 kubecm 推到了官方 homebrew-core 仓库,分享一下经验。

前言

Homebrew 标榜自己是 “macOS(或 Linux)缺失的软件包的管理器”,使用 macOS 作为开发终端的用户,往往绕不过 brew 这个软件包管理工具。确实在 macOS 上没有比 brew 更好用的软件包管理工具了,基本上想用的 CLI 工具,只需一行命令就可一键安装,非常的方便。记得去年博主还写过一篇 《Golang 装逼指南 Ⅱ:在 Homwebrew 上发布 Golang 项目》,当时只是介绍了如何将 Golang 开发的 CLI 工具发布到自建的 homebrew-tap 上。本文则是讲解如何将自己开发的软件,推送到官方的 homebrew-core 仓库中,使用像 brew install kubecm 这样的命令即可完成安装。

Homebrew-core

homebrew-core 中存储着所有官方的安装脚本,而这些安装脚本都是由软件开发者自己提交 PR 合并到仓库中的。同时 homebrew 也提供了查询页面,用户可以在网页 Homebrew Formulae 上查询自己的软件总共被下载安装了多少次,如下:

kubecm

新的项目只需向这个仓库提交 PR 即可。

准备阶段

首先需要在 GitHub 上 fork homebrew-core 项目。

然后在本地找到保存 homebrew-core 的目录:

$ cd $(brew --repository homebrew/core)

新增 remote 地址为 fork 仓库的地址:

$ git remote add <YOUR_USERNAME> https://github.com/<YOUR_USERNAME>/homebrew-core.git

这里的 YOUR_USERNAME 是 GitHub username。

新建分支

这里的操作就和向开源项目提交 PR 一样,新建 branch 并创建安装脚本。

$ git checkout master

更新 master 分支

$ brew update

从最新的 master 分支创建新 branch

$ git checkout -b <YOUR_BRANCH_NAME> origin/master

编写脚本

首先需要使用 brew search <formula> 来查看上游仓库中是否有同名的项目,同时确保你的项目是稳定版且带有 tag(不能只是一个 GitHub repo)。

使用 brew create 创建一个脚本模板,命令如下:

$ brew create https://example.com/foo-0.1.tar.gz

这里的 URL 地址,就是 GitHub Release 页面的 Source code(tar.gz) 的 URL 地址。

打开 Formula/foo.rb 可以看到:

class Foo < Formula
  desc ""
  homepage ""
  url "https://example.com/foo-0.1.tar.gz"
  sha256 "85cc828a96735bdafcf29eb6291ca91bac846579bcef7308536e0c875d6c81d7"
  license ""

  # depends_on "cmake" => :build

  def install
    # ENV.deparallelize
    system "./configure", "--disable-debug",
                          "--disable-dependency-tracking",
                          "--disable-silent-rules",
                          "--prefix=#{prefix}"
    # system "cmake", ".", *std_cmake_args
    system "make", "install"
  end

  test do
    system "false"
  end
end

之后就是完善这个脚本,deschomepagelicense 都请根据项目情况填写。

如果是 Golang 项目,则需要添加 Go 依赖 depends_on "go" => :build,同时在 install 中完善安装脚本,golang 开发的项目一般都是使用 go build 来构建。

注意: 与自建 homebrew-tap 不同,向官方提交 PR,需要使用源码构建,不能只推送构建好的二进制文件!同时必须有 test 部分,否则将无法合并代码。

这里附上一份 kind 的脚本供大家参考:

class Kind < Formula
  desc "Run local Kubernetes cluster in Docker"
  homepage "https://kind.sigs.k8s.io/"
  url "https://github.com/kubernetes-sigs/kind/archive/v0.9.0.tar.gz"
  sha256 "c154289659a7ef30b301a0787ecfa2e08edaada6059bf5acefe9f3be1e026381"
  license "Apache-2.0"
  head "https://github.com/kubernetes-sigs/kind.git"

  bottle do
    cellar :any_skip_relocation
    rebuild 1
    sha256 "e40a2343bf999585fa4fcb1a1e9b801427e921c098fc3f7e3026c071a0e72520" => :big_sur
    sha256 "e5ba99b5f14711e0dcb121a992d74c5ee6c6b0468b27e5200bf796d4987e13c0" => :catalina
    sha256 "d52a780ad6af93a2a7c480a41c5178a461b9966ddc1adb66adde8ff3bce15238" => :mojave
    sha256 "423ea750ae8589d1a199847f746d8e9b5b1f1d81ceff3a9dab2d63f161532588" => :high_sierra
  end

  depends_on "go" => :build

  def install
    system "go", "build", "-o", bin/"kind"
    prefix.install_metafiles

    # Install bash completion
    output = Utils.safe_popen_read("#{bin}/kind", "completion", "bash")
    (bash_completion/"kind").write output

    # Install zsh completion
    output = Utils.safe_popen_read("#{bin}/kind", "completion", "zsh")
    (zsh_completion/"_kind").write output

    # Install fish completion
    output = Utils.safe_popen_read("#{bin}/kind", "completion", "fish")
    (fish_completion/"kind.fish").write output
  end

  test do
    # Should error out as creating a kind cluster requires root
    status_output = shell_output("#{bin}/kind get kubeconfig --name homebrew 2>&1", 1)
    assert_match "failed to list clusters", status_output
  end
end

更多内容见官方文档

检测脚本

在脚本完成后,请先进行如下测试,确保测试通过且无任何报错。

$ brew tests
$ brew install --build-from-source <CHANGED_FORMULA>
$ brew test <CHANGED_FORMULA>
$ brew audit --strict <CHANGED_FORMULA>

提交代码

在通过所有测试后,就可以提交代码了,需要对每个更改单独提交 PR,且 commit 有格式要求,一般为 <FORMULA_NAME> <NEW_VERSION>kbecm 0.10.3

$ git add Formula/foo.rb
$ git commit -m 'foo 0.0.1'
$ git push --set-upstream <YOUR_USERNAME> <YOUR_BRANCH_NAME>

在这里提交后,代码就会 push 到之前 fork 的 homebrew/core 项目。

提交 PR

之后就可以在 GitHub 页面操作提交 PR 了。项目维护者的响应还是很及时的,在 PR 通过所有 CI test 后,就会有维护者进行 review 并指出需要修改的地方,根据要求修复即可。

提交 PR

提交新版本

PR 合并成功后,如果要发布新版本,这里推荐两种方式提交新版本。

CLI

brew 提供了十分简单的方式自动创建 PR,命令如下:

$ brew bump-formula-pr --url https://example.com/foo-0.1.tar.gz

更多的信息可以通过 brew bump-formula-pr --help 查看。

GitHub action

这一步也可以在 GitHub action 中自动完成,使用 homebrew-bump-formula 插件。原理其实也是使用了 brew bump-formula-pr,但是这样就无需手动触发,可以集成到 Release 的 CI 中。

name: Bump Homebrew kubecm formula

on:
  push:
    tags: 'v*'

jobs:
  homebrew:
    runs-on: ubuntu-latest

    steps:
      - name: Update Homebrew formula
        uses: dawidd6/action-homebrew-bump-formula@v3
        with:
          # GitHub token, required, not the default one
          token: ${{secrets.TOKEN}}
          # Optional, defaults to homebrew/core
          tap: USER/REPO
          # Formula name, required
          formula: FORMULA
          # Optional, will be determined automatically
          tag: ${{github.ref}}
          # Optional, will be determined automatically
          revision: ${{github.sha}}
          # Optional, if don't want to check for already open PRs
          force: false # true

注意: 这里的 TOKEN 需要在 Personal Access Token 上申请,并手动添加到 repo 的 setting 中。

设置 TOKEN

结语

总的来说,这一套流程都比较简单,笔者也只是在 GitHub action 的 TOKEN 上浪费了一些时间。使用 brew 不但简化了安装步骤,提升了用户体验,还可以把诸如 completion 命令生成的自动补全脚本在安装时就注入到系统中,无需在装好后再进行其他操作,体验极佳。

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
数据安全/隐私保护
SpringSecurity利用@PreAuthorize注解自定义权限校验
利用@PreAuthorize注解自定义权限校验
3448 0
|
12月前
|
敏捷开发 测试技术 持续交付
探索自动化测试:从基础到高级
【10月更文挑战第35天】在软件质量的保证过程中,自动化测试以其高效和可重复性成为不可或缺的一环。本文旨在通过简明的语言和实际案例引导读者了解自动化测试的核心概念、工具选择与应用,以及如何实现从入门到精通的过渡。我们将一起探讨如何将自动化测试策略融入日常开发流程中,提升测试效率,同时确保产品质量。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧。
511 3
|
安全 关系型数据库 数据安全/隐私保护
IAM最佳实践
企业上云最基本的账户权限安全实践
7524 0
|
25天前
|
运维 Ubuntu 关系型数据库
MySQL包安装 -- Debian系列(Apt资源库安装MySQL)
本文介绍了在Debian系列系统(如Ubuntu、Debian 11/12)中通过APT仓库安装MySQL 8.0和8.4版本的完整步骤,涵盖添加官方源、配置国内镜像、安装服务及初始化设置,并验证运行状态,适用于各类Linux运维场景。
287 0
MySQL包安装 -- Debian系列(Apt资源库安装MySQL)
|
8月前
|
人工智能 JavaScript Java
从零开始教你打造一个MCP客户端
Anthropic开源了一套MCP协议,它为连接AI系统与数据源提供了一个通用的、开放的标准,用单一协议取代了碎片化的集成方式。本文教你从零打造一个MCP客户端。
6054 5
|
存储 算法 Unix
【Shell 命令集合 文件管理】Linux 拆分文件 split命令使用教程
【Shell 命令集合 文件管理】Linux 拆分文件 split命令使用教程
512 0
|
算法 Java Go
Go的垃圾回收器
go的垃圾回收器是怎么回收内存的?
206 0
|
算法 图形学
LabVIEW程序框图保存为图像
LabVIEW程序框图保存为图像
246 1
|
SQL 关系型数据库 MySQL
Hive【环境搭建 01】【hive-3.1.2版本 安装配置】【含 mysql-connector-java-5.1.47.jar 网盘资源】【详细】
【4月更文挑战第6天】Hive【环境搭建 01】【hive-3.1.2版本 安装配置】【含 mysql-connector-java-5.1.47.jar 网盘资源】【详细】
1029 1
|
前端开发 JavaScript
如何使用 await-to-js 库优雅的处理 async await 错误
如何使用 await-to-js 库优雅的处理 async await 错误
345 0
下一篇
开通oss服务