Windows 向けの GitHub Actions で PATH を通すとき
はじめに
scoopをインストールする Action を作っていてハマったので、ちょっと備忘録- そんなにちゃんと調べてません (滝汗)
TL;DR
- 普通の Windows 形式のパスなら何も考えずに
$GITHUB_PATHのファイルに追記すれば OK- 例(
shell: pwshの場合):echo C:\Users\foo\bar >> $Env:GITHUB_PATH
- 例(
- ホームディレクトリ以下を指定したい場合は
(Resolve-Path ~\bar\).Path >> $Env:GITHUB_PATHとかすれば OK - Windows 形式、 cygwin 形式どっちが必要かわからなくても Windows 形式で足しておけば問題ない
バックグラウンド
GitHub Actions での環境変数周辺
- ステップ内で環境変数を変更・追加できるが、それは以降のステップには引き継がれない
PATHについてはadd-pathなどが用意されていたがセキュリティ上のアレで deprecated になって環境ファイル$GITHUB_PATHを使う形になった- 追加したいパス1つごとに1行で
$GITHUB_PATHで示されるファイルに追加する $GITHUB_PATHを使ったからといって「shell:の違いを吸収して Windows <-> cygwin のパス変換」とかはしてくれない
PowerShell の事情
- コマンドプロンプトと違って
~とか使える - だけど
echo ~\scoop\shims>> $Env:GITHUB_PATHとかすると~` の解決がされずにそのままファイルに追記されてしまう- ちゃんと確認してないけど
~の状態じゃパスが通ってない扱いになる?
- ちゃんと確認してないけど
- この辺のパス解決をさせるには
(Resolve-Path ~\scoop\shims).Pathとかすればいい - PowerShell では cygwin 形式のパスを
PATHに設定しても効果がない
shell:bash on Windows での事情
shell: bashにしたとき Windows 環境では Git for Windows の bash が使われると書いてある- 環境変数
PATHは cygwin 形式だけでなく Windows 形式のパスも受け付ける - cygwin 形式のパスを Windows 形式に変換するのは
cygpath cygwin形式のパスでできる
というわけで、全部合わせると…
PowerShell (shell: pwsh) で解決する場合
(Resolve-Path ~/scoop/shims).Path >> $Env:GITHUB
bash (shell: bash) で解決する場合
cygpath ~/scoop/shims >> $GITHUB_PATH
bashもpwshも Windows 形式のパスを受け付けるのでそちらに統一してしまうのが良さそう- bash でしか使わないなら
echo ~/scoop/shims >> $GITHUB_PATHでも良さそう (だけどあえてそうする理由もなさそう) - 今回私が遭遇したケースは PowerShell で
scoopをインストールした前提なので、普通にそのまま続けて PowerShell でResolve-Path使います