Shell

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

注意:常に利用可能なGitの最新バージョンを使用してください。 さらに、GitLab RunnerはGit LFSがマシンにインストールされている場合、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_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) で実行され、このサーバで実行されている他のプロジェクトのコードを “盗み見て” しまう可能性があります。 信頼できる自分のサーバでビルドを実行する場合にのみ使用してください。

プロセスの終了と強制終了

シェル executor は各ジョブのスクリプトを新しいプロセスで開始します。 UNIX システムでは、メイン・プロセスをプロセス・グループとして設定します。

GitLab Runnerは以下の場合にプロセスを終了します:

GitLab 13.0 以前

UNIXシステムでは、gitlab-runner がプロセスにSIGKILL を送って終了させます。子プロセスも同じプロセスグループに属しているため、シグナルは子プロセスにも送られます。Windowsでは、taskkill /F /Tを送ります。

GitLab 13.1 以降

UNIXシステムでは、gitlab-runnerSIGTERM をプロセスとその子プロセスに送信し、10分後にSIGKILLを送信します。 これにより、プロセスを優雅に終了させることができます。 WindowsにはSIGTERMに相当するものがないため、killプロセスは2回送信されます。 2回目は10分後に送信されます。

もし何らかの理由でこの新しい終了処理があなたのスクリプトで問題を起こすけれども、古い方法ではうまくいくのであれば、機能フラグFF_SHELL_EXECUTOR_USE_LEGACY_PROCESS_KILLtrueに設定することで、古い方法を使うようになります。この機能フラグは GitLab Runner 14.0 では削除される予定なので、新しい終了処理に対応できるようにスクリプトを修正する必要があることを覚えておいてください。