--- title: "TerraformドキュメントをCLIで読むtfdoc v0.1.0をリリースした" date: "2018-05-05T13:33:36+09:00" tags: ["terraform"] isCJKLanguage: true draft: false --- 先々月 [Terraformドキュメントをコマンドで見るツールをGoで作る · the world as code](https://chroju.github.io/blog/2018/03/25/create_terraform_helper_tool_with_go/) で書いたツールがようやく形になったのでリリース扱いにした。 [chroju/tfdoc](https://github.com/chroju/tfdoc) 指定したTerraformリソースについて、ドキュメントとスニペットをコマンドライン上で確認できるようになっている。そもそもリソース名がわからないという場合もあると思うので、 `--list` オプションでリソース名の一覧を出せるようにもした。まだまだ改善の余地はあるんだけど、取りあえず一通りやりたかったことはできるようになった。 OSSをちゃんとリリースする ---- OSSを「ちゃんと」リリースしたことがなかったので、ちゃんとした体裁を整えようとしてみた。 具体的には、今回初めてCoverallsを使ってテストカバレッジをREADME.mdへ表示している。自分は本職インフラで、プログラミングは必要にかられないとやることはないし、そもそも業務で誰かからプログラミングを習った経験もない。それを言い訳にするつもりはないのだけど、ソフトウェア開発の基本的なプラクティスを多分ちゃんとわかっていない。そのうちの一つとして「テストを書くのが苦手」というのがあり、これを解消したいと常々思っている。 幸いGoはテストを書くための機能が最初から内包されていて、これまで経験した言語の中ではとてもテストが書きやすく感じている。まだまだカバレッジは低いのだけど、今後100%へ近づけるためにテストを増やして、追加機能をリリースするときはTDD的な開発ができるようにするつもり。あと正直Coverallsの使い方もちゃんと理解してはいなくて、 [Go | Coveralls Docs](https://docs.coveralls.io/go) を読んで書いたとおりにやっただけという感じなので、そこも学び直したい。 もう一つ、GitHub Releasesもちゃんと使ったことがなかったので、今回初めて使ってみた。 `git tag` の理解すら怪しいぐらいだったんだけど、こちらはそんなに難しい話でもないので、ちゃんと使えていると思う。 活躍したパッケージ ---- tfdocを作るにあたり、Goのパッケージを様々使っている。ロジック的にはスクレイピングが中心になっているので、goqueryが肝になっているけれど、どちらかと言えば補助的な部分で感謝したいものが多い。 ### gox [mitchellh/gox: A dead simple, no frills Go cross compile tool](https://github.com/mitchellh/gox) 素でググると仮想通貨関連の話しか出てこない名前。Goにおけるクロスコンパイルをコマンド一発で一度に実行してくれるのですごくビルドが楽になる。開発しているのは、Goで様々なOSSを生み出しているHashiCorpのmitchellh氏ということで、なるほど頷ける。使い方もすごくシンプルで素晴らしい。 ### ghr [ghr - Easy to ship your project on Github to your user](https://deeeet.com/ghr/) GitHub Releasesへのファイルアップロードをコマンド一発で実行するツール。これもGoによるソフトウェア開発にあたり、クロスコンパイルした複数のバイナリをアップロードするために作られたもののようで、goxとの相性がよくて最高。 tfdocではCircleCIでテストとビルド、デプロイを任せることにしているので、goxとghrはCircleCIの中で自動実行させている。便利。 * [golangで書いたツールをCircleCI上でビルドしてその成果物をGitHub Releasesにリリースする - その手の平は尻もつかめるさ](https://moznion.hatenadiary.com/entry/2016/11/16/234139) 今後の予定 ---- まだ完成とは思っていなくて、先のテストを書くというのもそうだし、いろいろ改善はしたい。 わかっていないことの一つに、コマンドのオプションの中に「あるオプションと一緒に使わなければ有効にならない」ものがあって、これをどうしようか考えあぐねている。現状はその条件を満たさず使った場合、そのオプションは無視するようにしているのだけど、できれば内部の制御として「このオプションはこのオプションと一緒に使う必要がある」というのを実装しておきたい。今回コマンドラインオプションには [pflag](https://godoc.org/github.com/spf13/pflag) を使っていて、これはGo標準のflagパッケージとほぼ同様の動作をするので、以下の記事あたりが参考になるかもとは思っている。 [Building a Simple CLI Tool with Golang](https://blog.rapid7.com/2016/08/04/build-a-simple-cli-tool-with-golang/) あとは色付けたり、太字を使ったり、出力をもう少し工夫して見やすくしたい。自分で見てても現状のドキュメントは正直見づらい。スニペットの方も `terraform fmt` 実行時と同様のフォーマットになるよう整形したい。このツールを足掛かりに、Goの知識、ソフトウェア開発の知識をもっと深めていこうと思う。