背景
GoでCLIツールを書いてると、ビルド済みのバイナリをどうやって配布するのか問題がある。
一番手軽なのはGitHubのReleaseページにリリース物を添付ファイルとしてアップロードしておいて、curlのワンライナーでダウンロードしてもらうという方法。
でも、privateなリポジトリだとこの方法はGitHubの認証を超えられなくて使えない。
社内向けのツールなどprivateなリポジトリに置いたものも配布したいので、これなんとかならんかなぁと思って試行錯誤した結果、以前curl+jqでダウンロードするワンライナーを編み出した。
privateなGitHub Releaseページのリリース物をcurl+jqでダウンロードするワンライナー
でも、ワンライナーがすごい長いので、配布の敷居を下げるためにHomebrewのオレオレなbrew tapで配布できないかなぁと思って、さらに改良を加えた結果、brewのダウンロード処理をカスタマイズしてインストールすることに成功した。
これはみんなに有用だろうと思い、brew本体に機能追加のプルリクエストを送り、先日めでたくマージされた。
New feature: Allow download from private GitHub repository
この機能は現在stableブランチにも入り、みんな使えるようになっているので、使い方を説明しておこうと思う。
使い方
そもそもの前提として、publicなリポジトリで独自のbrew tapを作って自作ツールを配布する方法は以前書いたので、publicな場合の方法を知らない場合は、以下を参照。タイトルにGolangって入ってるけど、別にGolangじゃなくても使える。
Golangで書いたCLIツールのビルド済みバイナリをbrew tapでインストールできるようにする
privateなGitHubリポジトリからダウンロードしたい場合は、ダウンロードurlの末尾にオプション指定として :using => GitHubPrivateRepositoryReleaseDownloadStrategy
というダウンロード方法の指定を書く。
以下では yourcompany
というOrgの hoge
というツールを配布する想定で説明する。
このツールは https://github.com/yourcompany/hoge
というprivateなGitHubリポジトリのReleaseページにビルド済みのバイナリがアップロードされている。
このツールをbrewでダウンロードしてインストールするには、
以下のような Formula用の hoge.rb
を作成し、これを https://github.com/yourcompany/homebrew-tap
というプライベートなGitHubリポジトリに配置する。
require "formula"
class Hoge < Formula
homepage "https://github.com/yourcompany/hoge"
url "https://github.com/yourcompany/hoge/releases/download/v0.1.0/hoge_v0.1.0_darwin_amd64.tar.gz", :using => GitHubPrivateRepositoryReleaseDownloadStrategy
sha256 "6de411ff3e4b1658a413dd6181fcXXXXXXXXXXXXXXXXXXXX"
head "https://github.com/yourcompany/hoge.git"
version "0.1.0"
def install
bin.install "hoge"
end
end
このようなprivateな独自brew tapを使う場合は、 brew tap
コマンドに リポジトリパスをgitプロトコルで指定すると、gitの認証でprivateなtapも使えるようになる。
$ brew tap yourcompany/tap git@github.com:yourcompany/homebrew-tap.git
実際にhogeをインストールするには、 https://github.com/yourcompany/hoge
からリリース物をダウンロードする必要がある。というわけで、このリポジトリにアクセス可能なGitHubのパーソナルアクセストークンを HOMEBREW_GITHUB_API_TOKEN
という環境変数でexportしておく必要がある。
$ export HOMEBREW_GITHUB_API_TOKEN=xxx
この状態で、brew installすると、hogeがインストールできる。
$ brew install hoge
やったね
(補足: brew tapをgitプロトコルではなくhttpsでAPIトークンで認証する場合は https://$HOMEBREW_GITHUB_API_TOKEN@github.com/yourcompany/homebrew-tap.git
とすることもできる)
まとめ
HomebrewでプライベートなGitHubリポジトリのReleaseページからダウンロードしてきてbrew installできるようになった。これで、社内ツールが配布し放題ですね。
追記:2019/07/05
残念ながらGitHubPrivateRepositoryReleaseDownloadStrategyは、あんまり使われてないからか(?)、Homebrewのv2系でbrew本体から削除されてしまったようです。悲しい
https://github.com/Homebrew/brew/pull/5598
一応Strategyの定義をコピペしてFormulaに読み込ませれば使えるようなので、現時点のbrewの最新版v2.1.6で動くコードをGistに貼っておきました。使いたい人はこちらをコピペしてFormulaで読み込ませてご利用下さい。(今後Strategyのインターフェースが変わったりすると、また壊れるかもしれないですが)
Using GitHubPrivateRepositoryReleaseDownloadStrategy removed in brew v2