概要
- Firebaseを利用したプロジェクトで動作検証できるようにしたかった
- Firebase Emulatorを起動するのに、
firebase login
が必要だったが、Devinなので、サービスアカウントでパスするようにしたい。ってなった
- Firebase Emulatorを起動するのに、
- JSONファイルをアップロードするのは嫌だったので、DevinのSecretsにJSON文字列押し込んだ
- それをDocker Composeに渡せるようにしたメモ
前提
下記でDocker環境は用意した
また、サービスアカウントは最低限のロールだけ渡してJSONダウンロードした → それをDevinのSecretsに保存した
手順
Devin用のcompose.yamlを用意する
人間(?)の開発環境にはいらない場合はcompose.yamlをオーバーライドする方式で進める
$ docker compose -f compose.yaml -f compose-devin.yaml up -d
compose-devin.yaml
はこう用意した(これはGeminiに書いてもらった)
services:
firebase:
environment:
# ホストの DEVIN_CREDENTIALS (サービスアカウントJSONの文字列) の値を
# コンテナ内の環境変数 GA_ に設定します。
- GA_=${DEVIN_CREDENTIALS}
command: >
sh -c '
# 1. 環境変数 GA_ (JSONの内容) が空でないか基本的なチェック
# 空の場合はエラーメッセージを出力して終了します。
if [ -z "$$GA_" ]; then
echo "Error: Service account JSON content from environment variable is empty. Halting." >&2
exit 1
fi &&
# 2. 環境変数の内容 (JSON文字列) を /opt/service-account.json ファイルに書き出します。
# printf を使い、変数は $$ でエスケープします。
printf "%s" "$$GA_" > /opt/service-account.json &&
# 3. Firebase CLI が参照する GOOGLE_APPLICATION_CREDENTIALS 環境変数に、
# 作成したファイルのパスを設定します。この export はシェル内なので $$ は不要です。
export GOOGLE_APPLICATION_CREDENTIALS=/opt/service-account.json &&
# 4. Firebase Emulators を起動します。
firebase emulators:start --import=./export-data
'
以上。終わり
ハマったところ
compose-devin.yaml
のenvironment
で設定した環境変数をcommand
で読み込むところでハマりました(Devin全然関係ない)
printf を使い、変数は $$ でエスケープします。
これ(ハマったときは $
一個だけで渡らない!!渡らない!!!ってなってた)
ちなみに、environment
にもわたっていない可能性もあるので、下記コマンドでデバッグください
$ docker compose -f compose.yaml -f compose-devin.yaml config
composeで読まれるyamlの内容が表示されるので、この時点でenvironment
の内容が意図したものじゃなければ違う問題
雑感
- Devin楽しい!!(細かいタスクは瞬殺されてPRあがってくる。そして僕のレビューで詰まる)
- Dead Lock man(ボトルネックともいう)
- 今更だけど「Workload Identity Provider」を使ってもよかったのかもしれない
- 自分のプロジェクトだと、GitHub Actionsからデプロイするときに利用している
- ただ、AIにデプロイさせるのは現時点ではまだ怖いので、ここも最低限のロールだけ(開発に必要なものだけ)