検索Heroku上のアプリに自身のGemfileを書き換えさせる2015年03月11日Heroku上で動作させているアプリケーションに、自身のレポジトリ上のGemfileを更新させる方法について書きます。APIなどを利用します。いう場合に必要になるか自分は、r7kamura/ruboty-bundlerというRubotyのプラグインをつくる上でこの処理が必要になりました。普段Slackでいろいろな仕事をしてくれるBotをHerokuで動かしているのですが、RubotyのプラグインはGemfileで管理する形式になっているため、プラグインを追加するたびにGemfileを書き換えなければいけません。この作業が面倒だと思い、Botに命じれば勝手にプラグインを入れてくれるようにしようと考えました。APIが追加されました。これは、レポジトリ上のファイルを取得したり、更新したりするためのAPIです。APIなどを組み合わせなければなりませんでした。APIのおかげで、より簡単にファイル操作が行えるようになりました。APIを利用してレポジトリ上のファイルを更新します。Gemfileを取得する例を以下に示します。contentというプロパティに、Base64形式でエンコードされたデータが格納されています。shaプロパティにSHA1の値が入っていますが、ファイルを更新する場合はファイルの内容と一緒にこのSHA1の値を送る必要があるので大事な値です。installが実行できます。利用して実行する場合、自身のプロセスにBundlerが参照する環境変数が幾つか与えられているため、これを外した状態で実行する必要があります。いうメソッドに与えたブロックの中で処理を実行すれば、そのように振る舞うことができます。いうファイルが存在すれば、そこに記述されている設定を読み込んだ上で処理が実行されます。実行されたときに生成されます。実行されるという訳です。今回のケースではこの設定ファイルの存在が新規Gemの追加を妨げてしまうため、何らかの対策が必要です。単純に削除するのも良いでしょう。}Gemfileをパースする今回の目的の中では、Gemfileに任意のGemの定義を追加する必要があります。そのためには、Gemfileの内容を一旦解析し、データを追加し、有効なGemfileを再生成しなければなりません。インスタンスが得られます。インスタンスの配列を取り出せます。ような1つのGemに対する定義を表現するオブジェクトです。以下のコードは、カレントディレクトリのGemfileとGemfile.lockを解析し、ruboty-kokodeikkuというGemを追加し、Gemfileの内容を再生成する簡単な例です。メソッドにはバージョン情報やオプションなどを与えられたりするので、その辺りの面倒も見たほうが良いでしょう。SyncHerokuの管理画面で設定を行うと、GitHubのmasterブランチにコードがPushされたときに、自動でHerokuに反映してくれるようになります。APIでGemfileとGemfile.lockを更新したときに自動で反映されてくれるということになります。CIなどでもデプロイの自動化はできますが、特長を挙げるとすれば、こちらの方が反映完了までの時間がより短く済みます。おしまい以上の処理を組み合わせると、Heroku上のアプリに自身のGemfileを書き換えさせる処理が可能になります。いうGemでは同様の処理を実現しているので、参考になるかもしれません。