Shellエクゼキュータ
Shellエクゼキュータは、GitLab Runnerがインストールされているマシンでローカルにビルドを実行するためのシンプルなエクゼキュータです。Runnerをインストールできるすべてのシステムをサポートしています。つまり、Bash、PowerShell Core、Windows PowerShell、Windows Batch(非推奨)用に生成されたスクリプトを使うことができます。
特権ユーザーとしてスクリプトを実行
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を識別します(CI_CONCURRENT_PROJECT_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)で実行され、このサーバーで実行されている他のプロジェクトからコードを “盗む “ことができます。設定によっては、ジョブは高度な特権ユーザーとしてサーバー上で任意のコマンドを実行する可能性があります。あなたが信頼し、所有するサーバー上であなたが信頼するユーザーからのビルドを実行するためだけに使用してください。
プロセスの終了と強制終了
Shell 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分後に送られます。