RubygemsへのデプロイをCircleCIで自動化してみた

ActiveResourceでChatworkのAPIを叩くgemを作ってみました。
これが初めて作ったgemなのですが、手で運用すると色々忘れそうな感じがした。

ライブラリのメンテはただでさえ手がかかるので、パッケージ管理サービスへのデプロイくらい手を抜きたい。
ということで、GithubのmasterブランチにpushされたらCircleCIを使って自動でgemをデプロイする設定をしてみました。

作ったもの

作ったgemのリポジトリを御覧ください。circle.ymlにかかれています

GitHub – Leko/activeresource-chatwork: ActiveResource classes for Chatwork API

gemのデプロイ手順

まずは自動化すべきタスクの内容をおさらいします。
Rakeタスクにデプロイコマンドがくっついているので、それを利用します。

  1. rubygems.orgにユーザ登録
  2. ログインしてEdit Profileへ移動
  3. API ACCESS という節にコマンドが書かれているので、それを実行

これで公開準備は完了しました。ここまでの操作は最初の1回で良いようです。
デプロイ自体は

bundle exec rake build
bundle exec rake release

という感じでいけるそうです。こんなフローを自動化してみます。

CircleCIにuser keyを追加する

CircleCIと連携したままのだと、read onlyなデプロイキーが使用されています。
なのでリポジトリからpullはできるのですが、タグの追加やpushができない。

bundle exec rake releaseは内部的にgit taggit push origin タグをやっているので、リポジトリへのwrite権限が必要になります。
ということでまずはそこの準備を整える。

  1. CircleCIの対象プロジェクトの Project Settings を開く
  2. PERMISSIONS > Checkout SSH keys を選択
  3. Create and add {ユーザ名} user key を選択

で、連携しているリポジトリにwrite権限を持つキーが作成できます。
こんな感じの画面になればOKだと思います。

スクリーンショッ

circle.ymlにデプロイ処理を追加する

deploymentセクションを追加して、masterブランチのビルドが走ったときのデプロイ処理を指定します。
私の場合RubyGemsのユーザもGit(hub)のユーザもLekoなので、以下のような内容になると思います。
パスワードやメールアドレスをリポジトリに載せたくないので、環境変数に切り出してProject settings画面から設定しています。

deployment:
  rubygems:        # 任意の名前でよい
    branch: master # master相当のブランチが別名なら変えてください
    commands:
      - curl -u Leko:$RUBYGEMS_PASSWORD https://rubygems.org/api/v1/api_key.yaml > ~/.gem/credentials; chmod 0600 ~/.gem/credentials
      - git config user.name Leko
      - git config user.email $RUBYGEMS_EMAIL
      - bundle exec rake build
      - bundle exec rake release

試す

CircleCI上の表示は

スクリーンショッ

デプロイした後のRubyGems.orgは

スクリーンショッ

はい、OKそうです。

まとめ

gem作るのもCircleCIのdeployment機能を使用したのも今回が始めてでした。
どちらも機能が充実しているもののシンプルに使えるようになっているので、学習コストは安かったと思います。

思っていたよりもさくっとできて安心しました。
gemもCircleCIのデプロイも色々な方向に活用していきたいです。

いつかnpmのデプロイ自動化も記事にしようと思います。