【zcrypt】Go製のツールを作る際に便利だったツールの紹介

zcrypt というgo製のCLIツールを作った。

github.com

何ができるの?

CLIで手軽にファイルの暗号化、複合化ができる。

作った背景

apiなどを使用する際の鍵などのような機密情報をバックアップ目的でgithubに乗せておきたいけど、さすがに平文で置いておくのは怖いので適当に暗号化して保存したかった。

暗号化、複合化するだけならopensslなどのコマンドを使えばよいがせっかくなのでツールを作ってみたかった。(コマンドのオプションを覚えるのも面倒だった。)

使ってる技術

使い方などはREADME見てもらえばだいたいわかると思うので、ここでは記述しない。

代わりにこのツールを作るに当たって利用させていただいた便利なツールについて書きたいと思う。

並列クロスコンパイルツール(gox)

golangはクロスコンパイル可能な言語である。コンパイル時にどの実行環境で動かすかを設定することでその環境用の実行ファイルを生成することができる。

しかし、golang単体でこれをやろうとした場合、いろんな環境で動くようにいろんなパターンの実行環境用のビルドファイルを作ろうとすると何回もビルドする必要があるし、オプションも実行環境に合わせて変更する必要があり、一つ一つコンパイルするので時間もかかりとても面倒である。

そこでこのgoxと言うツールを使うと、コマンド一つで複数の実行環境用のコンパイルを一度に実行してくれ、オプションも自動でいい感じにしてくれる。

github.com

リリースタグとファイルアップロード(ghr)

リリースタグを切るのとリリースタグにファイルをアップロードしてくれるツールがこちらである。しかも並列でアップロードできるので早い!

go製ツールのデプロイと言うと多くがリリースタグを切ってそこにバイナリファイルをおくことが多い。このツールではこの部分を自動化してくれるものだ。とても便利ですね。

github.com

デプロイのフロー

上記で紹介したツールをCircleCIからうまく使いデプロイを行ってる流れは次の通りだ。

  1. masterにマージ
  2. CircleCI上でイベントを検知
  3. CircleCIでビルドできるか確認
  4. CircleCIで正常に暗号化複合化できているか確認
    • ここはあえてgoでのtestではなく、ツールをCLI上から実行して動作確認するようにしている。コードはこちら
    • これはgoでテストしてもそれはライブラリのテストになってしまうと思ったためである。あくまでここでテストしたいのはCLIツールとして使用した時に正しく使えるかである。
  5. CircleCIで並列クロスコンパイル
  6. CircleCIからリリースタグ作成、バイナリファイルのアップロード

リリースタグ作成時に工夫したこと

自動でリリースタグを採番してリリースして欲しかったため、少し工夫した。

具体的には下記の部分である。

https://github.com/IkezoeMakoto/zcrypt/blob/master/get_tag.sh#L4

お手製のワンライナーであるが、やってることとしては簡単で

  1. git tag でタグ一覧取得
  2. sort で新しい順に並び替え
  3. tail -1 で1件のみ取得(この時点で最新のタグを取得できる)
  4. awk -F "." "{cnt=\$3+1}{printf \"%s.%s.%d\", \$1, \$2, cnt}" 少し難しいが、 . 区切りにして3つ目に+1をしてくっつけ直している

これでタグを自動でつけるようにしている。 もちろんセマンティックバージョニングに乗っ取るなら、機能性の追加や後方互換のない変更の場合には手動でタグを切る必要があるだろう。

まとめ

Go製のツール作るためのライブラリや環境が多く整っていて、簡単なものをサクッと作りやすいので何か困ったことがあればサクッとツールを作って解決してみてはいかがだろうか。