Blog

Tapリポジトリを社内に作り自作ツールをHomebrewで配布する

この記事は、ニフティグループ Advent Calendar 2024 10日目の記事です。

CLIツールを社内にプライベートtapリポジトリを作成し、社内に配布しました。

意外と記事がなかったのでその方法をご紹介します。

アプリケーションのリリースに使っているのはGoReleaserです。

きっかけ

ニフティ株式会社では現在Oneloginを使っています。

AWSのIAM RoleにAssumeRoleする際は以下のOneloginが提供しているツールを使っている社員がほとんどです。

https://github.com/onelogin/onelogin-python-aws-assume-role

このツールはjava版もあるのですが、どちらにせよランタイムのインストールが必要です。

また比較的頻繁に更新されているわけではないため、バージョンによっては依存ライブラリの問題でセットアップが失敗するなどの問題がありました。

そこで、これをGoで作り直すことでシングルバイナリかつセットアップ不要にしつつ、brewで配布することでMacやWSL環境への導入をより簡単にしようと決めました。

サードパーティ製の他のツールを使うという手段もありましたが、私自身がインフラ管理者ではない(全社向けの選定権がない)ことや、現在使っているツールからの移行モチベーションを上げるため設定ファイルを流用することが重要だったこと、インナーソース化することでより柔軟に開発者自身が必要な機能を追加していけることを重視し、自作することに優位性があると判断しました。

Tapリポジトリの作成

バイナリを配布するためのtapリポジトリを作成します。

このリポジトリの名前は homebrew-<repo> の形式である必要があります。

https://docs.brew.sh/Taps#repository-naming-conventions-and-assumptions

プライベートなtapリポジトリを作成する場合、GitHubのトークンを使ってダウンロードURLを作る必要があります。

以下のGistが非常に参考になるため、これを使います。

https://gist.github.com/ZPascal/b21c652b811872b3f56db9d54d61d6c6

GitHubPrivateRepositoryDownloadStrategy というクラスがダウンロード戦略となります。

指示通り、tapリポジトリのlib/配下に配置します。

アプリケーションの作成

今回はHomebrewで配布する部分がメインなので、ここではGoReleaserの設定について紹介します。

GoReleaserは簡単に複数のOSやCPUアーキテクチャ向けにBuildしたり、パブリッシュすることができるツールです。

https://github.com/goreleaser/goreleaser

このツールを使ってGitHub Actionsでリリースしています。

アプリケーションリポジトリからtapリポジトリにpushしてPRを作成する必要があるため、PrivateAccessTokenが必要になります。

ダウンロード戦略として先ほど作成したGitHubPrivateRepositoryDownloadStrategy を使うよう指定します。

.goreleaser.yaml

workflow

このWorkflowが実行されるとreleasesが作成され、tapリポジトリにPRが作成されます。

一部変更していますが、以下のようなファイルが生成されます。

GoReleaserを使わなくてもこのようなファイルがあれば配布すること自体は可能です。

onelogin.rb

brew installする

まずローカルからプライベートリポジトリにアクセスするためにPrivateAccessTokenを作成し、 HOMEBREW_GITHUB_API_TOKEN という環境変数に指定します。

tapリポジトリを指定し、インストールします。

このとき、リポジトリ名の homebrew- 部分は省略することができます。

Brewfileには以下のように記載します。

これでプライベートのtapリポジトリでバイナリを配布することができました。

まとめ

ここまでプライベートのtapリポジトリを作成し、配布する方法を紹介してきました。

企業内で独自のソフトウェアを配布したいことはそれなりに多いんじゃないかと思っています。

特に以下はかなりハマりポイントでした。

  • tapリポジトリの命名規則
  • PATを使ったダウンロード戦略の作成
  • PATを使ったダウンロード戦略の指定

今ハマっている方や今後やろうと思っている方はぜひこれらに気をつけていただければと思います。

ここからはタイトルに関係のない今後の展望についてですが、このリポジトリは現在インナーソースとして社内公開していて利用者も比較的多いプロジェクトになっていると考えています。

しかしコントリビュータがなかなか増えず、敷居の高さや関心を引けていないことが問題かと思っています。

ツール自体メイン機能はほぼ完成していますが、爆速で作ったためリファクタリングや処理の効率化、ドキュメントの整備などやりたい事自体はまだまだある状況です。

また、普段使わない言語や領域に触れるなどエンジニアとしての成長も望めるため、コントリビュータを増やしインナーソースやOSSに興味を持ってもらえるよう活動していく予定です。

tapリポジトリについても現在配布されているのがこのツールのみということもあり寂しいので、こちらも敷居を下げより簡単に追加できるようになればいいなと想像しています。

最後に、この記事がどなたかのお役に立てば幸いです。

明日は、@hayabusa01 さんの記事です。 お楽しみに!

ニフティでは、
さまざまなプロダクトへ挑戦する
エンジニアを絶賛募集中です!
ご興味のある方は以下の採用サイトより
お気軽にご連絡ください!

ニフティに興味をお持ちの方は
キャリア登録をぜひお願いいたします!

connpassでニフティグループに
参加いただくと
イベントの
お知らせが届きます!