GitHub ActionsのWindows self-hostedでpwshとbashを使う方法
概要
今回は GitHub ActionsのWindows self-hostedでpwshとbashを使う方法を紹介します。
残念ながら素のWindowsマシンでshellとしてpwshやbashを指定しても使用することができません。
Windows上でpwshとbashが使用できるとCIで行えるフローの選択肢が大幅に増えると思いますので、ぜひ参考にしていただければと思います!
動作環境
- Windows10 Pro (Homeでも可)
pwshとbashを使用する条件
簡単に言えば、以下を満たせば良いです
- Git for Windows (Git Bash) と PowerShell7 (pwsh付属) をインストール
- Windowsのシステム環境変数のPATHに
bash.exe
とpwsh.exe
があるフォルダを追加
手順
詳細はあとで記載します。
1. Git for Windows と PowerShell7 をインストール
以前紹介した記事を参考にGit for WindowsとPowerShell7をインストールしてください
2. システム環境変数のPATHに登録
Git for WindowsとPowerShell7をインストールしたフォルダをPATHに登録してください。
PATHを通すps1ファイル (set-git-path.ps1
, set-powershell-path.ps1
)も上記の記事内にて記載しています。
システム環境変数に直接以下を追加しても大丈夫です(標準のインストールフォルダの場合)。
C:\Program Files\Git\cmd;C:\Program Files\Git\bin;C:\Program Files\PowerShell\7
3. self-hostedのrunnerプロセスを再起動
環境変数をプロセスに反映させるために再起動してください。
再起動方法は以下の公式ドキュメントを参考にしてください。
もし、PowerShell上でGitHub Actionsのself-hostedの .\run.cmd
で起動している場合はPowerShell自体も再起動してください。
手順は以上となります!
詳細
確認用のworkflow
以下のworkflowを使って確認します。
name: Windows Shell Check on: workflow_dispatch jobs: shell-check-all: runs-on: self-hosted steps: - name: Check cmd shell: cmd run: | echo cmd ok if: ${{ always() }} - name: Check pwsh shell: pwsh run: | echo pwsh ok if: ${{ always() }} - name: Check bash shell: bash run: | echo bash ok if: ${{ always() }}
インストール前
以下のように cmd
のみ使用可能で、それ以外は使用できません。。。
インストール後
問題なさそうですね。
活用例
せっかくなので、活用例を紹介します。
日付を文字列として取得
Bashのdate
コマンドを使って取得します。
name: Get Date String on: workflow_dispatch jobs: get-date-string: runs-on: self-hosted steps: - name: Get Date String run: echo "::set-output name=DATE::$(date +%Y%m%d%H%M)" shell: bash id: get-date-string - name: Use Date String run: echo "${{ steps.get-date-string.outputs.DATE }}"
Bashは手軽に文字列を生成可能なコマンドがたくさんあります!
レジストリから値を取得
以下はレジストリに登録されたUnity 2021.3.2f1 のインストールフォルダを取得する方法です。
name: Get Unity Folder on: workflow_dispatch jobs: get-unity-folder: runs-on: self-hosted steps: - name: Get Unity Folder run: Write-Host -NoNewline ('::set-output name=UNITY_FOLDER::' + (Get-ItemProperty 'HKCU:SOFTWARE\Unity Technologies\Installer\Unity 2021.3.2f1').'Location x64') shell: pwsh id: get-unity-folder - name: Use Unity Folder run: echo "${{ steps.get-unity-folder.outputs.UNITY_FOLDER }}"
Windowsのシステムに関わる情報を取得したい場合はPowerShellのほうが適している気がします。
余談、GitHub Actionsで提供されているWindowsのRunnerでは標準でpwshとbashが使用可能
PowerShellはともかく、Bashも使用できるように用意してくれていたりします。
ドキュメントでも以下のように記載されています。
GitHub ActionsもGit for Windowsを使用しているようですね。
When specifying a bash shell on Windows, the bash shell included with Git for Windows is used.
windows-latestでpwshとbashが使用可能なことを確認
先程のworkflowのrunnerにwindows-latestを指定して確認してみましょう。
jobs: shell-check-all: strategy: matrix: runner: [self-hosted, windows-latest] runs-on: ${{ matrix.runner }} steps:
結果は以下のように問題なく使用可能です!
雑感
最近Git for WindowsとPowerShell7のインストール方法を紹介した本当の目的はこちらだったりします。
私個人では開発基盤を用意する機会が増えているんですが、
pwshとbash (特にbash!)をGitHub Actionsで使えるようにしておくと何かと捗ったり、self-hostedとwindows-latestでworkflowの互換性が確保できたりします。
わざわざGitHub Marketplaceや独自アクションを使用しなくてもできることが増えると思いますので、ぜひご活用ください!
それでは~