正式なドキュメントは英語版であり、この日本語訳はAI支援翻訳により作成された参考用のものです。日本語訳の一部の内容は人間によるレビューがまだ行われていないため、翻訳のタイミングにより英語版との間に差異が生じることがあります。最新かつ正確な情報については、英語版をご参照ください。

Shell executor

  • プラン: Free、Premium、Ultimate
  • 提供形態: GitLab.com、GitLab Self-Managed、GitLab Dedicated

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

GitLab RunnerがShell executorを使用するマシンで、一般的な前提要件を満たしていることを確認してください。

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

--usergitlab-runner runコマンドに追加すると、スクリプトを非特権ユーザーとして実行できます。この機能は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_ci_multi_runnerユーザーが見つからない場合には、インストーラーは代わりにgitlab-runnerユーザーを作成して使用します。

すべてのShellビルドは、gitlab-runnerユーザーとgitlab_ci_multi_runnerユーザーのいずれかとして実行されます。

一部のテストシナリオでは、ビルドがDocker EngineやVirtualBoxなどの特権リソースにアクセスすることが必要な場合があります。その場合は、gitlab-runnerユーザーをそれぞれのグループに追加する必要があります:

usermod -aG docker gitlab-runner
usermod -aG vboxusers gitlab-runner

Shellを選択する

GitLab Runnerは特定のShellをサポートしています。Shellを選択するには、config.tomlファイルでそのShellを指定します。次に例を示します:

...
[[runners]]
  name = "shell executor runner"
  executor = "shell"
  shell = "powershell"
...

セキュリティ

一般に、Shell executorでジョブを実行することは安全ではありません。ジョブがユーザーの権限(gitlab-runner)で実行され、このサーバーで実行されている他のプロジェクトからコードを「盗む」可能性があります。設定によっては、ジョブがサーバー上で高度な特権ユーザーとして任意のコマンドを実行する可能性があります。自分自身が責任を持つ信頼できるサーバー上で、信頼できるユーザーからのビルドを実行する場合にのみ、この方法を使用してください。

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

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

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

UNIXシステムでは、gitlab-runnerはプロセスとその子プロセスにSIGTERMを送信し、10分後にSIGKILLを送信します。これにより、プロセスを正常に終了できます。WindowsにはSIGTERMと同等の機能がないため、kill(強制終了)シグナルが2回送信されます。2回目のシグナルは10分後に送信されます。