Shell
Shell executorは、Runnerがインストールされているマシンでローカルにビルドを実行できるシンプルなexecutorです。 Runnerがインストールできるすべてのシステムをサポートしています。 つまり、Bash、Windows PowerShell、Windows Batch(非推奨)用に生成されたスクリプトを使用することができます。
git lfs
コマンドを使用するので、GitLab Runnerがシェルexecutorを使用して実行される場合、Git LFSが最新であることを確認してください。概要
スクリプトは、gitlab-runner run
コマンドに--user
を追加すれば、非特権ユーザーとして実行できます。 この機能は Bash でのみサポートされています。
ソースプロジェクトのチェックアウト先は<working-directory>/builds/<short-token>/<concurrent-id>/<namespace>/<project-name>
です。
プロジェクトのキャッシュは<working-directory>/cache/<namespace>/<project-name>
に保存されます。
どこで
-
<working-directory>
は、gitlab-runner run
コマンドに渡された--working-directory
の値、または Runner が実行されているカレントディレクトリです。 -
<short-token>
はRunnerのトークン(最初の8文字)を短縮したものです。 -
<concurrent-id>
は一意な番号で、プロジェクトに関連する特定の Runner のローカルジョブ ID を識別します。 -
<namespace>
は GitLab 上でプロジェクトが保存されている名前空間です。 -
<project-name>
は GitLab に保存されているプロジェクトの名前です。
<working-directory>/builds
と<working-directory/cache
を上書きするには、config.toml
の[[runners]]
セクションの下にあるbuilds_dir
とcache_dir
オプションを指定します。
非特権ユーザーとしての実行
GitLab Runner が公式.deb
または.rpm
パッケージから Linux にインストールされる場合、インストーラはgitlab_ci_multi_runner
ユーザが見つかればそれを使おうとします。 見つからなければgitlab-runner
ユーザを作成し、代わりにこれを使います。
すべてのシェルビルドは、gitlab-runner
またはgitlab_ci_multi_runner
ユーザとして実行されます。
テストシナリオによっては、ビルドが Docker Engine や VirtualBox のような特権リソースにアクセスする必要があるかもしれません。 その場合は、gitlab-runner
ユーザをそれぞれのグループに追加する必要があります:
usermod -aG docker gitlab-runner
usermod -aG vboxusers gitlab-runner
シェルの選択
GitLab Runner は特定のシェルをサポートしています。 シェルを選択するには、config.toml
ファイルで指定します。 例えば次のようにします:
...
[[runners]]
name = "shell executor runner"
executor = "shell"
shell = "powershell"
...
セキュリティ
一般的に、shell executor を使ってテストを実行するのは安全ではありません。 ジョブはユーザの権限 (gitlab-runner
) で実行され、このサーバで実行されている他のプロジェクトのコードを “盗み見て” しまう可能性があります。 信頼できる自分のサーバでビルドを実行する場合にのみ使用してください。
プロセスの終了と強制終了
シェル executor は各ジョブのスクリプトを新しいプロセスで開始します。 UNIX システムでは、メイン・プロセスをプロセス・グループとして設定します。
GitLab Runnerは以下の場合にプロセスを終了します:
- ジョブがタイムアウト。
- ジョブがキャンセルされました。
GitLab 13.0 以前
UNIXシステムでは、gitlab-runner
がプロセスにSIGKILL
を送って終了させます。子プロセスも同じプロセスグループに属しているため、シグナルは子プロセスにも送られます。Windowsでは、taskkill /F /T
を送ります。
GitLab 13.1 以降
UNIXシステムでは、gitlab-runner
がSIGTERM
をプロセスとその子プロセスに送信し、10分後にSIGKILL
を送信します。 これにより、プロセスを優雅に終了させることができます。 WindowsにはSIGTERM
に相当するものがないため、killプロセスは2回送信されます。 2回目は10分後に送信されます。
もし何らかの理由でこの新しい終了処理があなたのスクリプトで問題を起こすけれども、古い方法ではうまくいくのであれば、機能フラグFF_SHELL_EXECUTOR_USE_LEGACY_PROCESS_KILL
をtrue
に設定することで、古い方法を使うようになります。この機能フラグは GitLab Runner 14.0 では削除される予定なので、新しい終了処理に対応できるようにスクリプトを修正する必要があることを覚えておいてください。