環境変数の補間とは?解説
環境変数の補間とは、変数の値を文字列に置換することであり、ドル記号付きの名前のようなプレースホルダーがその実際の値に置き換えられます。
補間は、設定を動的にするための仕組みです。値をハードコードする代わりに、環境変数を参照するプレースホルダーを書き、ツールが実行時にそれを実際の値に置き換えます。CIはこれに依存しています: パイプラインは補間を通じてシークレット、ビルド番号、ブランチ名を注入します。しかし、誰が置換を行うのか - シェル、CIエンジン、または設定ツール - によってルールが変わります。
補間とは何か
補間は、プレースホルダーとして書かれた変数への参照を、テキストが処理される時点でのその変数の現在の値に置き換えます。典型的な形式は、ドル記号に続く名前です。補間は、静的なテンプレートを、それが実行される環境に適応するものへと変えます。
誰が置換を行うのか
CIでは通常、補間を行える複数のレイヤーがあります: CIエンジンはジョブが実行される前に独自の式構文を置換し、その後シェルはコマンドが実行される際に自身の変数を補間します。あるプレースホルダーをどのレイヤーが処理するかを知ることは不可欠です。なぜなら、それらは構文もタイミングも異なるからです。
クォートと値の欠落の落とし穴
2つの典型的なバグ: スペースを含む補間された値をクォートし忘れて、それが複数の引数に分割されてしまうこと。そして、欠落した変数が空文字列に展開され、コマンドを危険なものに変えてしまうことです。厳格なシェルは、後者を検出するために未定義の変数でエラーを出すように設定できます。
CIにおける補間
GitHub Actionsはエンジンレベルで独自の式構文(二重波かっこ形式)を補間し、シェルは実行時にドル記号の変数を補間します。よくある間違いは、それらを混同したり、信頼できない入力をエンジンに直接シェルコマンドへ補間させたりすることで、これはインジェクションのリスクです。
# Engine vs shell interpolation in a CI step
steps:
- env:
NAME: ${{ github.actor }} # engine interpolates
run: echo "Hello, $NAME" # shell interpolates safelyLatchkeyに関する注記
式の補間とシェルの補間はLatchkeyのランナー上でも同じように動作し、信頼できないコンテキストをコマンドにインライン化するのではなくenv varを通じて渡すことが、そこでも標準的な安全なパターンです。
重要なポイント
- 補間は、プレースホルダーが現れる場所であればどこでも、変数の値をテキストに置換します。
- CIでは複数のレイヤーが補間します - runの前にエンジンが、run中にシェルが - それぞれ異なる構文で行います。
- クォートされていない値や欠落した値はバグを引き起こし、信頼できない入力をコマンドに補間することはインジェクションのリスクとなります。