Shellエクゼキュータ

Shellエクゼキュータは、GitLab Runnerがインストールされているマシンでローカルにビルドを実行するためのシンプルなエクゼキュータです。Runnerをインストールできるすべてのシステムをサポートしています。つまり、Bash、PowerShell Core、Windows PowerShell、Windows Batch(非推奨)用に生成されたスクリプトを使うことができます。

note
GitLab RunnerがShell Executorを使用するマシンで共通の前提条件を満たしていることを確認してください。

特権ユーザーとしてスクリプトを実行

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