Edited at

HomebrewでプライベートなGitHubリポジトリのReleaseページから社内ツールを配布する


背景

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リポジトリに配置する。


hoge.rb

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

やったね :beer:

(補足: 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本体から削除されてしまったようです。悲しい :cry:

https://github.com/Homebrew/brew/pull/5598

一応Strategyの定義をコピペしてFormulaに読み込ませれば使えるようなので、現時点のbrewの最新版v2.1.6で動くコードをGistに貼っておきました。使いたい人はこちらをコピペしてFormulaで読み込ませてご利用下さい。(今後Strategyのインターフェースが変わったりすると、また壊れるかもしれないですが)

Using GitHubPrivateRepositoryReleaseDownloadStrategy removed in brew v2