概要
Retty Advent Calendar 2022 17日目は、エンジニアの堤が担当します。
昨日は、ヤマモトマユミさんの
じわじわハマるカップ酒のデザイン|ヤマモトマユミ/Retty|note
でした。
CircleCIのプロジェクト用環境変数を管理(リスト・作成・削除)するためだけのツールを作成したので、その紹介をします。
セットアップ方法はGitHubをご覧ください。
ちなみに、現在はGitHubのCircleCIプロジェクトにのみ対応しています。
想定読者
Summary
- CircleCIのProject用環境変数を管理するツールccienvを公開しました
- シンプルに使える作りとなっています
- 本家CircleCIのCLIには現在同機能がなく、追加待ちです
- ccienvを作る上で利用した、Goで使えるCLImoduleを紹介しています
使い勝手
セットアップが済んだ状態で、
$ ccienv -o <Organization Name> -r <Repository Name> <command>
のように使います。
例えば https://github.com/threepipes/circleci-env
のCircleCIの環境変数一覧を閲覧したければ、下記のようになります。
$ ccienv -o threepipes -r circleci-env ls
セットアップで設定したAPI Keyに閲覧権限がないリポジトリでは見れないので、ご自身のCircleCIプロジェクトでご確認ください。
また、OrganizationやRepositoryは省略可能です。
- Organizationのみを省略する場合
- セットアップ時に入力したデフォルトのOrganizationが使われます
- Organization, Repositoryを省略する場合
Organization, Repositoryを省略して、下記のように使えます。
$ ccienv ls
公式CLIは現在Org, Repo指定を省略できないため、個人的には推しポイントです。
環境変数操作コマンドとしては、現在下記の3つが用意されています。
Helpは下記で確認可能です。
$ ccienv -h
rmコマンド
登録されている環境変数の削除ができます。Keyを複数指定し、まとめて削除可能です。
$ ccienv rm ENV_1 ENV_2 ...
また、インタラクティブに一覧から選んで削除することも可能です。
$ ccienv rm -i
こちらを含め、ユーザー入力を必要とする箇所ではインターフェイスとして https://github.com/go-survey/survey を利用しています。
lsコマンド
登録されている環境変数の一覧を確認できます。
$ ccienv ls
余計な装飾のない列挙なので、grep等と組み合わせやすいです。
$ ccienv ls | grep AWS AWS_ASSUME_ROLE_ARN xxxxrole AWS_DEFAULT_REGION xxxxst-1 AWS_REGION xxxxst-1
addコマンド
環境変数を新規追加します。
$ ccienv add ENV_NAME somevalue
既に存在する場合は、上書き確認されます。
$ ccienv add TEST_ENV testvalue key:TEST_ENV already exists as value=xxxxenvv ? Do you want to overwrite? Yes TEST_ENV=xxxxde is created
作成背景
弊社のマイクロサービスTerraform移行プロジェクトで様々なリポジトリのCircleCI設定を変更する機会が発生したためです。
そのプロジェクトに限らず、弊チームではCircleCIの設定を触る機会が多いため、毎回コンソールから同じような操作をするのは手間だなと思いました。
そこで公式CLI を使おうと確認してみたのですが、Project用環境変数の管理がサポートされていませんでした。
最初は直接APIを叩く簡易Shell Scriptで済ませる予定でしたが、世にないのであれば公開できるものを作ろうと思い、作成しました。
一応本家CLIにも、Project用環境変数管理機能追加のPRを出しているのですが、取り込みはしばらく先になりそうです。
構成・利用module等紹介
本ツールの主機能を構成するmoduleを紹介します。
alecthomas/kong
Go標準のflag packageを利用したサブコマンド(参考)でも実現可能ですが、
などが欲しかったため外部のmoduleを利用しました。
他にGoでCLIを作成する場合の有名どころとしては、例えば下記があるようです。
- https://github.com/spf13/cobra
- circleci-cliはこちらを利用
- https://github.com/urfave/cli
- 有名どころだとgrafanaが使っているようです
- https://github.com/google/subcommands
- 標準のflag plackageをもとに作成しており、標準以外の依存がない
- コードも500行でシンプル
複雑なものを作るわけではないので、実現はどれを使っても可能なようでした。
強いてkongを選んだ理由を挙げるとすれば、
- https://github.com/alecthomas/kong#introduction で使いたい機能の説明がシンプルにまとまっていた
- FlagやArgsについて、structの中で宣言的に記述する方式が個人的に気に入った
です。
ただ、google/subcommands はブログを書きながら見つけましたがシンプルで良さそうですね。先に見つけていたらこちらを利用していたかもしれません。
go-survey/survey
CLIにおけるインタラクティブな入力受付として、surveyを使いました。
それなりに利用者や更新があり、かつ使いたい機能(複数選択・Yes/No選択)も揃っていたためこちらを利用しました。
Readmeに、できる機能の一覧が実際の動作画面やサンプルコードとともに示されており、使い勝手がわかりやすいです。
数行で導入できて手軽にモダンなCLIが構築できます。
その他用途の近いmodule
- https://github.com/manifoldco/promptui
- 依存関係が少なく機能もシンプル
- リアルタイムな入力バリデーションがある
- https://github.com/c-bata/go-prompt
- より対話的なCLIを作成する場合向け
- auto-completionやPrompto上でのキーボードショートカット等リッチな機能がある
grezar/go-circleci
CircleCIのAPIを叩く上で、go-circleciを使いました。
Readme曰くまだbeta版とのことですが、CircleCI v2のAPIに対応しており、今回ターゲットとしているProjects系APIには対応していたため利用しました。
他にGoでCircleCI v2を扱えるmoduleは見つけられませんでした。
最後に
良ければご利用ください。メンテナンスはしますが、メイン機能としては完結しているので、今後大きな機能追加は行われない予定です。
何かあれば、issueやContributionお待ちしています。
またRettyでは、一緒に新たな食体験を作り上げていくメンバーを探しています。
エンジニアについても、SREからフロントエンド、データエンジニアまで広く募集しています。
カジュアル面談から応募できるので、興味のあるかたはぜひ!