0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Devinにサービスアカウントの環境変数(GOOGLE_APPLICATION_CREDENTIALS)を渡すのでハマった

Last updated at Posted at 2025-05-20

概要

  • Firebaseを利用したプロジェクトで動作検証できるようにしたかった
    • Firebase Emulatorを起動するのに、firebase login が必要だったが、Devinなので、サービスアカウントでパスするようにしたい。ってなった
  • 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.yamlenvironmentで設定した環境変数をcommandで読み込むところでハマりました:innocent:(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にデプロイさせるのは現時点ではまだ怖いので、ここも最低限のロールだけ(開発に必要なものだけ)
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?