すぎしーのXRと3DCG

主にXR, Unity, 3DCG系の記事を投稿していきます。

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.exepwsh.exe があるフォルダを追加

手順

詳細はあとで記載します。

1. Git for Windows と PowerShell7 をインストール

以前紹介した記事を参考にGit for WindowsとPowerShell7をインストールしてください

tsgcpp.hateblo.jp

tsgcpp.hateblo.jp

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プロセスを再起動

環境変数をプロセスに反映させるために再起動してください。
再起動方法は以下の公式ドキュメントを参考にしてください。

docs.github.com

もし、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 のみ使用可能で、それ以外は使用できません。。。

インストール後

問題なさそうですね。

活用例

せっかくなので、活用例を紹介します。

日付を文字列として取得

Bashdateコマンドを使って取得します。

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.

docs.github.com

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や独自アクションを使用しなくてもできることが増えると思いますので、ぜひご活用ください!

それでは~