Kubernetesのイメージタグの更新を楽にするCLIツールをGoで作った

5 min read | #Go #mikku #Kubernetes #Semantic Versioning

この記事は 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つです。

インストール方法

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_amd64linux_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)を環境変数にセットします。

$ 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 release コマンド

セマンティックバージョニングに従って、バージョンを上げる GitHub Release を作成します。バージョンを明示的に設定することも出来ます。

\$ mikku release <repository> <major | minor | patch | (version)>

スクリーンショット スクリーンショット

オプション

良さみポイント

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 さんです。お楽しみに!

Top