🐈‍⬛

cloudflare/wrangler-action@v3で環境ごとのsecretを設定する

2024/03/08に公開

はじめに

cloudflare/wrangler-action@v3でsecretを設定するサンプルとして以下のコードが載っています。

jobs:
  deploy:
    steps:
      uses: cloudflare/wrangler-action@v3
      with:
        apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
        secrets: |
          SECRET1
          SECRET2
      env:
        SECRET1: ${{ secrets.SECRET1 }}
        SECRET2: ${{ secrets.SECRET2 }}

例えば、本番環境では SECRET2 を設定しなかった場合、この設定ではエラーになってしまいます。

Error: Value for secret SECRET2 not found in environment.
Error: Failed to upload secrets.
Error: 🚨 Action failed

無視してくれてもいいのにと思いつつ、試行錯誤したので解決した方法を書きたいと思います。

環境ごとに分ける

ステージングには SECRET1 SECRET2 を指定し、本番には SECRET1 だけを指定します。
ここまではよく見るので簡単です。

secrets: ${{ github.ref_name != 'main' && 'SECRET1 SECRET2' || 'SECRET1' }}

が、 SECRET1 SECRET2 が一つの環境変数と認識されてしまい、今度はステージングの方でエラーになりました。

Error: Value for secret SECRET1 SECRET2 not found in environment.
Error: Failed to upload secrets.
Error: 🚨 Action failed

改行する

secrets には設定する環境変数を改行区切りで指定するので、 SECRET1 SECRET2 が改行されるように指定しなおします。

改行コードを入れる

まずはシンプルに改行コード \n を入れてみたのですがそのまま表示されました。

secrets: ${{ github.ref_name != 'main' && 'SECRET1\nSECRET2' || 'SECRET1' }}
Error: Value for secret SECRET1\nSECRET2 not found in environment.
Error: Failed to upload secrets.
Error: 🚨 Action failed

ためしにエスケープして \\n を入れてみたものもダメでした。

secrets: ${{ github.ref_name != 'main' && 'SECRET1\\nSECRET2' || 'SECRET1' }}
Error: Value for secret SECRET1\\nSECRET2 not found in environment.
Error: Failed to upload secrets.
Error: 🚨 Action failed

fromJSON()を使う

こんな時は公式のドキュメントを眺めていると解決策が見つかることがあります。
https://docs.github.com/ja/actions/learn-github-actions/expressions#fromjson

fromJSONという関数を見つけました。
改行を入れてもそのまま文字列として認識されてしまうので、JSON文字列をデコードしてみます。

secrets: ${{ github.ref_name != 'main' && fromJSON('"SECRET1\nSECRET2"') || 'SECRET1' }}
✨ Successfully created secret for key: SECRET1
✨ Successfully created secret for key: SECRET2

出来ました。

まとめ

実際はもっと多くの環境変数を指定しているので結構不細工ですが、目的は達成出来ました。
かっこいいやり方をご存知の方は素敵なコメントで教えてください。

Discussion