GoのPixela APIクライアントライブラリを作り始めた。
最低限自分が今必要なAPIはカバーできたのでpublicに公開した。
TL;DR
- PixelaのGo用APIクライアントライブラリを作りはじめた
- ひとまずテストは最小限のAcceptance Testを書いている
- 実APIを叩いているのでモックの更新漏れなどもない
- 自動でリリースタグを作るようにしているのでリリースがとてもラク
- GoReleaserは使っていない
- リズムよく開発できるので個人開発では(でも)最初にテストとCI/CDを書いておくのがオススメ
Pixelaについて
Pixelaは@a-knowさんが提供しているWebサービスだ。
日々のさまざまな活動量をGitHubのような鮮やかなグラフにすることができる。
詳細なAPIドキュメントも公開されており、エンジニアならcurlなどでも簡単に利用することができる。
なぜ作るのか?
昨年、PixelaのグラフをTerraformから操作するためのTerraform Providerを作った。
TerraformでPixelaのグラフを宣言できるProviderを作った #pixela
Terraform ProviderはGoで実装するのだが、この中でPixelaのAPIを叩くために3rdパーティのAPIクライアントを使っていた。
PixelaのGo APIクライアントはいくつかあるのだが、いろいろ思うところがあったので自作することにした。
budougumi0617/pixela
今回作ったPixela API実行用のAPIクライアントは次のとおり。
まだグラフを操作するメソッドしかないが、主に次の点を満たしたくて自作した。
context.Context
対応- 素直なメソッド呼び出し
- v1.21.0で増えた新しいエンドポイントをサポートしている
また、APIクライアントライブラリの作成に合わせてTerraform Providerも更新した。 https://github.com/budougumi0617/terraform-provider-pixela/releases/tag/v0.0.6
Acceptance Testという安心
今回はズルして単体テストはほとんど書いていない。
実際のAPIを叩いてテストしているので「モックが古い仕様のままだった」みたいな不安はない。
バリデーションなど、細かい実装を一切していないので、そういった実装書き始めるときは単体テストでよさそう。
Terraform Providerの方もAPIを直接叩くAcceptance Testを書いてあったのでデグレの心配なく更新できた。
自動でリリースタグを作るようにしているのでリリースがとてもラク
release-it npmを使って自動リリースする設定をしている。 次の2ファイルを置いておくだけでmasterブランチにpushすれば自動で新しいバージョンが切られる。
- https://github.com/budougumi0617/pixela/blob/master/.release-it.json
- https://github.com/budougumi0617/pixela/blob/master/.github/workflows/release.yml
上記ファイルについての説明は以前所属会社のブログに記載した。
APIクライアントライブラリ(バイナリ配布する予定がない)なのでGoReleaserは使っていない。
いちいち「いまのバージョンなんだっけ?」「バージョンタグはv付けてたっけ?」なんて考えなくてよいので非常にラクだ。
個人開発でも最初にテストとCI/CDを書いておくのがオススメ
昨年から趣味でコードを書く時間が深夜になったのでどうしても眠気との戦いになっている。
ウトウトしながらコーディングしていてもテストがちゃんとあればエンバグすることは少ない。
また、レビューしてもらえるわけでもないのでCIでテストと静的解析を流しておけば独りでも最低限のクオリティを確認しながら開発ができる。
他方、個人的に個人開発しているときは「機能実装が終わった(キレイに実装できた)」というタイミングがピークだ。
なので、そのあとに「バージョン番号を思い出してインクリメントしたtagを切って…」なんてやる時間は面白くない。
Terraform Providerのリリースになるとバイナリをzipにしたあと証明書で署名する必要もあり、絶対に手作業したくない。
だから最初に自動リリースやデプロイを整備しておくとモチベーションの高い状態をキープしたまま実装を続けられるのでよい。
終わりに
PixelaのAPIクライアントライブラリを作った話をまとめた。
別のツールを作る必要があるので一度開発はストップしてしまうのだが不足しているAPIも少しずつカバーしていきたい。
最初なのでDRYはまったく考えずに実装したので、それなりに実装が進んだらリファクタリングも始めたい。