GitHub Actions で secrets を使う¶
GitHub Actions で secrets を入力値や環境変数へ渡す方法と、条件分岐での制約を整理します。secrets は、認証情報などをワークフローのコードへ直接書かずに渡すための仕組みです。
secrets とは¶
GitHub Docs では、secrets を次のように説明しています。
シークレットは、Organization、リポジトリ、またはリポジトリ環境内に作成する、暗号化された環境変数です。 作成したシークレットは、GitHub Actions ワークフローで利用できます。
つまり、secrets は Organization・リポジトリ・リポジトリ環境のいずれかの単位で作成でき、どの単位で作っても GitHub Actions のワークフローから参照できます。
GitHub Actions で secrets を使う¶
GitHub Actions では、secrets をアクションの入力値かステップの環境変数として設定します。
この例のwithはアクションの入力値で、envはステップ内のプロセスから参照する環境変数です。アクション自体が secrets を必要とするならwithを使い、ステップ内で実行するスクリプトが必要とするならenvが候補になります。envで渡した値は、Python ならos.environ.get("super_secret")で取得できます。
注意¶
ワークフローで secrets を使うときの注意点として、GitHub Docs は次の点を挙げています。
if:条件でシークレットを直接参照することはできません。 代わりに、シークレットをジョブ レベルの環境変数として設定し、ジョブのステップを条件付きで実行するために環境変数を参照することを検討してください。 詳しくは、「コンテキスト」とjobs.<job_id>.steps[*].ifをご覧ください。
つまり、ステップの条件分岐に secrets を直接書くことはできません。いったんジョブレベルの環境変数へ設定してから、ステップのif:ではその環境変数を参照します。
シークレットが設定されていない場合、シークレットを参照する式の戻り値 (例では
${{ secrets.SuperSecret }}など) は空の文字列になります。
secrets の値が未設定のまま参照すると、エラーにはならず空文字列として扱われます。
可能であれば、コマンドラインからプロセス間でシークレットを渡すのは避けてください。 コマンドライン プロセスは、他のユーザーに表示される (
psコマンドを使用)、またはセキュリティ監査イベントによってキャプチャされる可能性もあります。 シークレットの保護のために、環境変数、STDIN、またはターゲットのプロセスがサポートしている他のメカニズムの利用を検討してください。
値をコマンドライン引数として渡すと、psコマンドや監査ログを通じて他人から見える場合があります。渡す経路には、環境変数やSTDINなど、別の手段を優先します。
コマンドラインからシークレットを渡さなければならない場合は、それらを適切なルールでクオート内に収めてください。 シークレットは、意図せずシェルに影響するかもしれない特殊なキャラクターをしばしば含みます。 それらの特殊なキャラクターをエスケープするには、環境変数をクオートで囲ってください。 次に例を示します。
Bash の利用例
まとめ¶
GitHub Actions では、secrets をアクションの入力値(with)か、ステップの環境変数(env)として渡します。使うときは、次の 4 点に注意が必要です。
if:条件では secrets を直接参照できない- 未設定の secrets は空文字列として扱われる
- コマンドライン引数として渡すのはなるべく避ける
- やむを得ず渡す場合は、特殊文字を壊さないようクオートで囲む