【GitLab】GitLab CI RunnerでGit-Bashを使用する方法【Windows】

GitLab-RunnerをWindows上で登録する際に、エグゼキューター(Executor)をshellにすると、そのままではbashコマンドや、シェルスクリプトが実行できません。

Dockerなどの仮想環境を使う方法もありますが、ここではGit-Bashを用いる方法を記載しておきます。
(参考: [Solved]-How to get GitLab Runner to work with Bash on Windows-bash )

1. GitLab-Runner の環境の確認

GitLab Runnerの設定ファイル(config.toml)を確認してください。

使用予定のRunnnerの設定項目のうち、executor と shell の項目が以下のようになっているか確認してください。

executor = "shell"
shell = "powershell"

上記ではない場合は、tomlファイルを書き換えるか、再びRunnerの設定コマンドをたたいて、
Runner Executor に Shell を選択して新しいRunnerを作成してください。
(参考: Registering runners | GitLab )

2. gitlab-ci.yml の編集

gitlab-ci.ymlのbefore-scriptを以下の様に編集します。

before_script:
  - New-Alias -Name gitBash -Value "$Env:ProgramFiles\Git\bin\bash.exe"

これで、GitLab Runner上のPowerShell環境のエイリアスに bash.exe を実行する「gitBash」が追加されました。

あとは任意の場所で以下の様にコマンドを実行すると、bashコマンドやシェルスクリプトを実行できます。

script:
- gitBash -c <実行したいshファイル>
- gitBash -c sample.sh
- gitBash -c "echo Hello"

後書き

Windows用アプリのGit-Bash.exeは、そのアプリケーションディレクトリ以下にある「bash.exe」を使用している模様です。

bash.exeのコマンドに関しては下記の説明の通り、-c オプションを用いるとその後に記述されたコマンドを読み込み、実行する模様です。
(参考: Man page of BASH (osdn.jp) )

つまり、bash.exeをPowerShell上で実行できれば、シェルスクリプトを実行することができます。
(Git-Bashを使う方法というより、bash.exeを使う方法というのが正しいのかもしれません)

パスを通すのではなくエイリアスにした理由としては、実は既にbash.exeは「\Windows\System32」以下にも存在しており、コマンドとしてパスも通っています。
しかし、こちらのbash.exeはうまく動かないので、おそらくwindowsシステム用に最適化されたものだと思います。(知らんけど)
パスの優先順位などを意識したコマンドはめんどくさいので、エイリアス設定にしました。

ちなみに今回のアプローチ以外にも方法はあるみたいです。
下記では config.toml で shell=”bash” とし、PowerShell用のスクリプトファイル(.psファイル)を実行させることで git-bash を使用している模様です。興味のある方は参考にしてみてもいいかもしれません。
(参考: Set gitlab runner to use git bash (github.com) )