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分後に送られます。