Retty Tech Blog

実名口コミグルメサービスRettyのエンジニアによるTech Blogです。プロダクト開発にまつわるナレッジをアウトプットして、世の中がHappyになっていくようなコンテンツを発信します。

CircleCIのプロジェクト用環境変数管理ツールccienvの紹介

概要

Retty Advent Calendar 2022 17日目は、エンジニアの堤が担当します。
昨日は、ヤマモトマユミさんの じわじわハマるカップ酒のデザイン|ヤマモトマユミ/Retty|note でした。

CircleCIのプロジェクト用環境変数を管理(リスト・作成・削除)するためだけのツールを作成したので、その紹介をします。

github.com

セットアップ方法はGitHubをご覧ください。
ちなみに、現在はGitHubのCircleCIプロジェクトにのみ対応しています。

想定読者

  • CircleCIプロジェクト管理者
  • golangでのCLI作成に興味がある方

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

CLI作成moduleとして、kongを使いました。

github.com

Go標準のflag packageを利用したサブコマンド(参考)でも実現可能ですが、

などが欲しかったため外部のmoduleを利用しました。

他にGoでCLIを作成する場合の有名どころとしては、例えば下記があるようです。

複雑なものを作るわけではないので、実現はどれを使っても可能なようでした。
強いてkongを選んだ理由を挙げるとすれば、

です。
ただ、google/subcommands はブログを書きながら見つけましたがシンプルで良さそうですね。先に見つけていたらこちらを利用していたかもしれません。

go-survey/survey

CLIにおけるインタラクティブな入力受付として、surveyを使いました。

github.com

それなりに利用者や更新があり、かつ使いたい機能(複数選択・Yes/No選択)も揃っていたためこちらを利用しました。
Readmeに、できる機能の一覧が実際の動作画面やサンプルコードとともに示されており、使い勝手がわかりやすいです。
数行で導入できて手軽にモダンなCLIが構築できます。

その他用途の近いmodule

grezar/go-circleci

CircleCIのAPIを叩く上で、go-circleciを使いました。

github.com

Readme曰くまだbeta版とのことですが、CircleCI v2のAPIに対応しており、今回ターゲットとしているProjects系APIには対応していたため利用しました。
他にGoでCircleCI v2を扱えるmoduleは見つけられませんでした。

最後に

良ければご利用ください。メンテナンスはしますが、メイン機能としては完結しているので、今後大きな機能追加は行われない予定です。
何かあれば、issueやContributionお待ちしています。

またRettyでは、一緒に新たな食体験を作り上げていくメンバーを探しています。
エンジニアについても、SREからフロントエンド、データエンジニアまで広く募集しています。

hrmos.co

カジュアル面談から応募できるので、興味のあるかたはぜひ!

www.wantedly.com