天天看點

将項目釋出到 Homebrew 官方倉庫前言Homebrew-core送出新版本結語

将項目釋出到 Homebrew 官方倉庫前言Homebrew-core送出新版本結語

前言

Homebrew 标榜自己是 “macOS(或 Linux)缺失的軟體包的管理器”,使用 macOS 作為開發終端的使用者,往往繞不過

brew

這個軟體包管理工具。确實在 macOS 上沒有比

brew

更好用的軟體包管理工具了,基本上想用的 CLI 工具,隻需一行指令就可一鍵安裝,非常的友善。記得去年部落客還寫過一篇

《Golang 裝逼指南 Ⅱ:在 Homwebrew 上釋出 Golang 項目》

,當時隻是介紹了如何将 Golang 開發的 CLI 工具釋出到自建的 homebrew-tap 上。本文則是講解如何将自己開發的軟體,推送到官方的

homebrew-core

倉庫中,使用像

brew install kubecm

這樣的指令即可完成安裝。

Homebrew-core

中存儲着所有官方的安裝腳本,而這些安裝腳本都是由軟體開發者自己送出 PR 合并到倉庫中的。同時 homebrew 也提供了查詢頁面,使用者可以在網頁

Homebrew Formulae

上查詢自己的軟體總共被下載下傳安裝了多少次,如下:

将項目釋出到 Homebrew 官方倉庫前言Homebrew-core送出新版本結語

新的項目隻需向這個倉庫送出 PR 即可。

準備階段

首先需要在 GitHub 上 fork

項目。

然後在本地找到儲存 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           

之後就是完善這個腳本,

desc

homepage

license

都請根據項目情況填寫。

如果是 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 并指出需要修改的地方,根據要求修複即可。

将項目釋出到 Homebrew 官方倉庫前言Homebrew-core送出新版本結語

送出新版本

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 中。

将項目釋出到 Homebrew 官方倉庫前言Homebrew-core送出新版本結語

結語

總的來說,這一套流程都比較簡單,筆者也隻是在 GitHub action 的

TOKEN

上浪費了一些時間。使用

brew

不但簡化了安裝步驟,提升了使用者體驗,還可以把諸如

completion

指令生成的自動補全腳本在安裝時就注入到系統中,無需在裝好後再進行其他操作,體驗極佳。

将項目釋出到 Homebrew 官方倉庫前言Homebrew-core送出新版本結語

繼續閱讀