この記事はCAMPHOR- Advent Calendar 2019の 11 日目の記事です。
はじめに
こんにちは、@p1assです。
今回は自分が作ったmikkuという CLI ツールを紹介をします。
mikku はセマンティックバージョニングで管理しているリポジトリの管理や、Kubenetes のマニフェストにかかれている Docker イメージのタグの更新を楽にする CLI ツールです。
この記事では mikku の特徴、開発することにしたモチベーションや苦労した点などを紹介したいと思います。
モチベーション
実際に機能などを紹介する前に、なんでこのツールを作ろうと思ったのかのモチベーションについて書いておきます。
前提 : Kubernetes の運用方法
私は趣味で GKE を運用していて、個人開発の Web サービスなどを GKE 上で動かしています。
マニフェストファイルは 1 つのリポジトリで中央集権的に管理していて、プロダクトのソースコードは別のリポジトリで管理しています。マイクロサービス的な文脈で言うのであれば、poly repo な構成に近いです。
Helm などのパッケージマネージャは使っておらず、シンプルなスタイルで運用しています。
イメージのビルドや kubectl apply
は CircleCI で行っています。なるべく GitHub と CircleCI で全てが完結するようにしています。
2 つの辛さ
このような運用をしていたのですが、少し辛さを感じるようになってきました。
1つ目はイメージタグの更新です。
マニフェストファイルには image: sample-image:v1.0.0
のように書かれていて、これを書き換えることでイメージの更新を行っています。ほんのちょっとの書き換えのたびに毎回 PR を作るのは意外と面倒くさいです。
2 つ目は GitHub Release の作成が面倒くさいことです。
タグを切るのに合わせて GitHub Release を作成しているのですが、毎回真面目に Changelog などを書いています。 しかし、Bug Fix などで短時間に何回も作業しているとかなり面倒くさいです。
このような問題を解決できる CLI ツールが欲しいなと思ったので、mikkuを作成しました。
機能
mikkuの大まかな機能を以下の2つです。
- Kubernetes のマニフェストファイルに書かれている Docker イメージのタグを最新のものに書き換える Pull Request を作成
- セマンティックバージョニングで管理しているリポジトリのバージョンをあげる GitHub Release を作成
インストール方法
go get
もしくは GitHub Releases からバイナリをダウンロードしてください。
go get
$ GO111MODULE=off go get github.com/p1ass/mikku/cmd/mikku
$ mikku --help
GitHub Releases
Windows や Linux をお使いの方は darwin_amd64
をそれぞれ windows_amd64
か linux_amd64
に書き換えてください。
検証は Mac でしかしていないので、動作は保証していません、、、
$ VERSION=0.2.0
$ curl -O -L https://github.com/p1ass/mikku/releases/download/v${VERSION}/mikku_${VERSION}_darwin_amd64.tar.gz
$ tar -zxvf mikku\_${VERSION}\_darwin_amd64.tar.gz
$ chmod a+x mikku
$ mv mikku /usr/local/bin/mikku
$ mikku --help
他のバイナリは GitHub Releases のページをご覧ください。
使い方
事前準備 : GitHub の Personal access token を発行する
GitHub の Personal access token が必要なので発行してください。 repo 権限が必要です。
事前準備 : 環境変数をセット
上で発行したアクセストークンと GitHub のユーザ(もしくは Organization)を環境変数にセットします。
MIKKU_GITHUB_ACCESS_TOKEN
: 上で発行したアクセストークンMIKKU_GITHUB_OWNER
: 僕の場合はp1ass
$ export MIKKU_GITHUB_ACCESS_TOKEN=[YOUR_ACCESS_TOKEN]
$ export MIKKU_GITHUB_OWNER=[GITHUB_OWNER_NAME]
mikku pr コマンド
Kubernetes のマニフェストファイルにかかれている Docker イメージのタグを最新のリリースのものに更新する PR を作成するコマンドです。
$ export MIKKU_MANIFEST_REPOSITORY=sample-manifest-repository
$ export MIKKU_MANIFEST_FILEPATH=manifests/{{.Repository}}/deployment.yml
$ export MIKKU_DOCKER_IMAGE_NAME={{.Owner}}/{{.Repository}}
$ mikku pr sample-repository
環境変数
これらの設定はコマンドラインオプションで上書きできます。
MIKKU_MANIFEST_REPOSITORY
: マニフェストファイルがあるリポジトリを指定しますMIKKU_MANIFEST_FILEPATH
: 実際のファイルを指定しますMIKKU_DOCKER_IMAGE_NAME
: Docker イメージの名前を指定します
mikku release コマンド
セマンティックバージョニングに従って、バージョンを上げる GitHub Release を作成します。バージョンを明示的に設定することも出来ます。
$ mikku release <repository> <major | minor | patch | (version)>
オプション
- patch : Ex. v1.0.0 → v1.0.1
- minor : Ex. v1.0.1 → v1.1.0
- major : Ex. v1.1.0 → v2.0.0
良さみポイント
mikkuの良いところは設定でテンプレートが使える点です。
$ export MIKKU_MANIFEST_REPOSITORY=sample-manifest-repository
$ export MIKKU_MANIFEST_FILEPATH=manifests/{{.Repository}}/deployment.yml
$ export MIKKU_DOCKER_IMAGE_NAME={{.Owner}}/{{.Repository}}
mikkuでは {{.Owner}}
、{{.Repository}}
をテンプレートとして使えるようになっています。
マニフェストファイルのファイルパスなどはある程度規則的な階層構造になっている場合は多いです。そのため、テンプレートを使うことで 設定を何度も書き換えることなく使い回せるようになります ただ単にコマンドラインオプションで渡すのではなく、環境変数でも設定できるのはこのためです。
追加したい機能
一旦公開はしましたが、まだまだ追加したい機能があります。
Slack Bot 🤖
一番やりたいのは Slack Bot 対応です。
Slack Bot にすれば他の開発者はチャンネルでコマンドを叩けるようになり、便利に使えるようになるかなぁと思ってます。自分のインターン先に同じような機能の Bot がいたのにも影響されてます。
Homebrew でインストールできるようにする
せっかくなので brew
でインストールできるようにしたいなぁと思ってます。
本家のリポジトリからインストールできるようにするには、ある程度の Star が必要らしい (要出典) なので、まずは多くの人に使ってもらえるようにしたいですね。
おわりに
今回初めて CLI ツールを作りましたが、Go ではとても簡単に作ることができ感動しました。
また、GitHub Actions を使うことでバイナリの生成などを GitHub で完結するようにできたのも良いですね。
Issue、PR、Star などはいつでも大歓迎なので、使いにくかったり、バグがあったりしたら気軽にお願いします!
明日のCAMPHOR- Advent Calendar 2019の担当はtomokortnさんです。お楽しみに!