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を使用するマシンで、一般的な前提要件を満たしていることを確認してください。
特権ユーザーとしてスクリプトを実行する
--userをgitlab-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-runnerShellを選択する
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分後に送信されます。