これはなに
Mackerel APIのインターフェイスを、fastlane 向けに提供するPluginです。
実装は fastlane/actions/github_api.rb を元として、Mackerel API向けに調整しました。
Actions.sh
で curl
を実行するだけでも事足りるのですが、せっかくなのでPlugin化しました。
例) ビルドにかかった時間をトラッキングする
発端は、はてなブックマークアプリでの開発環境にまつわる情報をトラッキングするために、MackerelのService Metricsを使おうと考えたことでした。
Service Metricsについては こちら
以下のように使うことで、処理にかかった時間を、Mackerelに投稿します。*1
start_time = Time.new.to_i # scanなどの処理 end_time = Time.new.to_i duration = (end_time.to_f - start_time.to_f) / 60 # 単位を分に変換 result = mackerel_api( api_key: ENV['MACKEREL_API_KEY'], http_method: "POST", path: "/api/v0/services/#{ENV['MACKEREL_SERVICE_NAME']}/tsdb", body: [ { "name": "#{ENV['MACKEREL_GRAPH_NAME']}.#{ENV['MACKEREL_METRIC_NAME']}", "time": end_time, "value": duration } ] )
結果
緑のグラフが跳ねているのは、Xcode 11.5を利用するように変えた時に、CIのキャッシュを破棄したからです。
こういった情報をグラフで記録できます!
ビルド時間の他にも、テストカバレッジの変動の記録にも使用しています。
感想
GWにゲームしながら、合間に作っていました。
fastlaneを使い始めて、早いもので3年強経ちますが、Pluginを作ったのは初めてでした。
最近はfastlaneのDSLよりも、Rubyらしく書けるようになりたいと思っていて、 fastlane new_action
でActionとして作ることが多くなっています。
Pluginの実装は、Actionを作るのとほぼ同じように作れるため、何から始めればよいかはわかりやすかったです。
GitHub Actions for Android Lintを作ってる - がんばってなんか書く を作った時にも感じたことですが、テンプレートから生成して、そこにGitHub ActionsやTravis CIなどのテスト環境が用意されていると、ちゃんとテスト書くようになるのでよいですね。
特に慣れていないプログラミング言語のプロジェクトだと、実行結果があっているのかの自信もないので、自然とテストを書くようになれます。
fastlaneにコントリビューションもした
最近のCI環境は、もっぱらGitHub Actionsで暮らしています。
この fastlane-plugin-mackerel_api でも、GitHub Actions上でテストを行なっています。
これまで fastlane new_plugin
からは、Travis CIとCircle CIでの実行テンプレートが生成されていました。
fastlane-plugin-mackerel_api でGitHub Actionsでの知見を培ったので、Pluginテンプレートに追加するPull Requestを出し、無事マージされました🎉
fastlane pluginの作成を始める開発者は、CI環境としてこれまでのTravis CIとCircle CIに追加して、新たにGitHub Actionsを選びやすくなりました。
v2.148.1 でリリースされています。
今回の変更の恩恵は、fastlaneのエンドユーザーでは感じることがないので、ぜひPluginを作ってみてください!
大変だったこと
1つ目は、テストの書き方やrakeなどのRubyを扱うそのもの。
Rubyに慣れていないので、Error throwsのテストの書き方がわからずに、めっちゃ調べました。
2つ目は、RubyGemsへの公開。
fastlaneのドキュメント Create your own fastlane pluginの中のPublishing your plugin には、
bundle install rake install rake release
で公開すると書かれていて、GitHub Actionsでやろうとしましたが、 rake release
がgitのタグを打とうとする挙動を知らずに、はまりました。
bundle exec gem push pkg/*.gem
とすることにしました。
その他に、GitHub ActionからのRubyGems公開には、OTP codeを突破できないという課題が残っています。
それを除けば、たぶん release.yml で動くと思うのだけど、OTPの回避方法を知っている人が教えてください。
まとめ
ぜひ、ご利用ください!
- fastlane-plugin-mackerel_api | RubyGems.org | your community gem host
- GitHub - yutailang0119/fastlane-plugin-mackerel_api: fastlane plugin for Mackerel API
*1:実際にはこの処理をさらにWrapしたActionを作っています