RubygemsとGithubへ公開してみる

satoyamaが2015/05/01 19:12:44に投稿

BundlerでRubygemsとGitHubに公開してみる

はじめに

いつもお世話になっているRubygemsやGithubなどのエコシステムを体験してみたいという思いがありました。

RubygemsであればRubyのBundlerが楽だろうということで、
BundlerでRubygemsとGitHubでソフトウェアを公開するまでの流れを書いてみます。

何を作るか

何を作るか。
これが実は一番難しかったりするわけですが、今回は私自身が開発を行っていてたまに欲しくなるものにします。
普段、私はLinuxのサーバサイドのソフトウェアなどをよく開発していますが、
その開発中にサーバ上で、あるツールやコマンドをバックグラウンドで起動させたり、任意のタイミングで停止させたり、デーモン化されていないものをデーモン化したいと思うことがあります。

例えば、サーバ上で負荷情報をモニタリングするときに、 vmstat で情報を書き出させ、別な作業を行い、任意のタイミングで停止させるようなケースです。

このとき、以下の様に起動停止が簡単にできれば、いいなぁと思うので、それをサポートするツールを作成してみたいと思います。

起動・停止のイメージ

$ nand start --out vmstat.log vmstat -n 3 
(ログアウトしたり、何か別のことをする)
$ nand stop vmstat

ここで、nand が開発するツールとします。以下で、nandを開発、公開する過程を説明してみます。

もちろん、psコマンドで確認してkillすればよいのですが、手順が多かったり、該当のプロセスを探したりするのが手間だったりするので、
そのあたりも上手くサポートしてくれるツールを目指します。

Ruby/Bundlerを使った開発

RubyとBundlerを使ってnandを作成し、公開するまでの流れを説明します。

rbenvでターゲットのRubyバージョンを用意

Rubyのrbenvは複数のRubyのバージョンを共存、切替をディレクトリやシェルレベルで行える
非常に便利なツールです。
rbenvおよびRubyのダウンロードからビルド、インストールまで行うruby-buildについては、説明を割愛します。
今回はRuby 2.0以上をターゲットにすることにします。

$ rbenv install 2.0.0-p598
(以下略)

インストール完了後、ログインしている端末上でインストールしたRubyのバージョンを利用するようにしておきます。

$ rbenv shell 2.0.0-p598
$ rbenv rehash
$ ruby -v
ruby 2.0.0p598 (2014-11-13 revision 48408) [x86_64-darwin13.4.0]

Bundlerの準備

BundlerはインストールしたRubyのgemsディレクトリにインストールすることなく、
開発環境のローカルにgemパッケージをインストールして利用してくれる素敵パッケージです。
Bundlerはrubygemsで提供されていますので、これはインストールしたRubyのgemsディレクトリに
インストールします。

$ gem install bundler
(中略)
$ bundle version
Bundler version 1.9.1

雛形の作成

インストールしたBundlerで雛形を作成します。

$ bundle gem nand -b -t --coc --mit
Creating gem 'nand'...
      create  nand/Gemfile
      create  nand/.gitignore
      create  nand/lib/nand.rb
      create  nand/lib/nand/version.rb
      create  nand/nand.gemspec
      create  nand/Rakefile
      create  nand/README.md
      create  nand/bin/console
      create  nand/bin/setup
      create  nand/CODE_OF_CONDUCT.md
      create  nand/LICENSE.txt
      create  nand/.travis.yml
      create  nand/.rspec
      create  nand/spec/spec_helper.rb
      create  nand/spec/nand_spec.rb
      create  nand/exe/nand
Initializing git repo in /YOUR/PATH/nand

-bnand/exec/nand を作成 -tはテスト用のディレクトリ(rspec)作成です。
--mitはMITライセンス、--cocはContributor Code of Conductに関するテキストを出力するオプションです。
Contribute Code of Conductについてはこちらなどを参考にしてください。

bundlerは1.9から雛形のディレクトリ構造が変わっています。
1.9以前は-bで生成される実行ファイルは、bin/nandに出力されていましたが、
1.9以降はexe/nand以下に生成されますので、
開発中に、bundle install --binstubsとするとbin/nandにbinstubが生成されます。
binにパスを通しておくことで、毎回bundle execを付けることなく、nand start...で試行できます。

同様に、依存性を解決してREPL(irbやpryなど)を利用したい場合、bin/consoleが出力されていますので、consoleで実行できます。
bin/setupbundle installを実行するもので、その他のセットアップ処理を追加する場合は、こちらを利用しましょう。

ここでは、混乱がないようにbinstubを利用せずに、必要なものは全てbundle execを付けています。

gemspecの編集

nand/nand.gempsecが生成されています。このファイルをまず編集します。TODOなどを適宜編集しましょう。
spec.homepage はGitHubのリポジトリにしておくと、RubygemsのページからGitHubのリポジトリに飛べて便利になります。

依存ライブラリ

nandはCLIツールです。RubyのCLIツールとしてとても便利なthorを利用しますので、nand.gemspecに依存性を追加しておきます。

(前略)
  spec.add_development_dependency "bundler", "~> 1.9"
  spec.add_development_dependency "rake", "~> 10.0"
  spec.add_development_dependency "rspec"

  spec.add_dependency "thor"
(後略)

依存するライブラリでシステムのgemにないものを開発環境にインストールします。

$ bundle install --path vendor/bundle
(後略)

開発していて、依存ライブラリが増えたら、都度nand.gemspecに追記して、bundle installを実行します。

このあたりで、GitHubに最初のコミットをしてみましょう。

GitHub にコミット

$ git commit -a -m "1st commit"
$ git remote add origin https://github.com/linkodehub/nand.git
$ git push origin master
(後略)

コミット用のブランチはmasterとして、リモートのGitHubをoriginとしておいた方が rake releaseでトラブルが少なくてよいです。

開発

バックアップ用途やtypoなどログが汚くなるのを晒したくないので、
開発時はなるべくmasterブランチ以外で行った方が無難だと思います。
ブランチの命名など運用については、GitHub Flowなどを参考にするとよいでしょう。

$ git checkout -b dev

あとは、実際の開発を進めてください。
なお、ここまで説明に利用してきたNandのGitHubリポジトリはこちらになります。

ドキュメントの整備

Rubyで作成していますので、rdocなどを整備していくと利用者は助かると思いますが、
まずはREADME.mdを書きましょう。GitHubのリポジトリのページでも表示されるので、
説明や簡単な使い方などは載せておくべきかと思います。

日本語で書く場合はREADME.ja.mdREADME-ja.mdなどとするのを見かけます。

Gemの公開

開発がある程度進んで、動作するようになったら、gemをRubygems.orgに登録しましょう。
登録前にアカウントを作成する必要があります。

アカウント作成自体は以下のサイトなどを参考にしてください。

rake releasemasterブランチであることを期待するようですので、開発ブランチからmasterブランチへマージを事前にしておきます。

$ bundle exec rake release
(後略)

前述していますが、事前にbundle install --binstubsをして、./binをPATHに追加しておけば、bundle execは省略できます。

Rubygemsに登録するとダウンロードされた数が分かるので、少しずつでも増えていくダウンロード数を見るのは感慨深いモノがあります。

バッジ

公開されているREADME.mdには試験の結果やコードの品質チェックなど、様々なバッジが表示されているのを見たことがあると思います。

gem version バッジ

Gem Version

Rubygems.orgに登録していれば、gemのページにあるLINKSBadgeから、gemのバージョンを表示するバッジのURLを取得できます。

Markdownの内容をコピーしてREADME.mdに貼り付けてコミットしましょう。

[![Gem Version](https://badge.fury.io/rb/nand.svg)](http://badge.fury.io/rb/nand)

Gitterバッジ

GitterとはGitHubにあるOrginizationやリポジトリに対して、チャットルームを作成できるWebサービスです。

GitHubのアカウントで登録できるので簡単です。
サインインしてホームからCreate a roomでリポジトリのチャットルームを作ってみましょう。

create room

create room to add badge

ここで、 Add badge to README on GitHub(via pull request)にチェックを入れておくと、
gitter-badgerからREADME.mdに対してバッジのURLが貼り付けられたプルリクエストが来るので、
取り込みます。

初めてのプルリクエストのマージには丁度いい練習になると思います。

その他、様々なサービスと連携することで、より 意識が高い リポジトリに見えるでしょう。
他の方のブログが参考になります。

最後に

以上で、説明は終了です。
この文章が誰かの参考になれば、幸いです。

あと、この説明は後から思い出しながら書いたものなので、間違いがあるかもしれません。
間違いなどありましたら、ご指摘ください。

あとは、継続できるかどうかです(自戒)