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

高度な設定

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

GitLab Runnerと個別に登録されたRunnerの動作を変更するには、config.tomlファイルを修正します。

config.tomlファイルは次の場所にあります。

  • GitLab Runnerがrootとして実行される場合、*nixシステムでは/etc/gitlab-runner/にあります。このディレクトリは、サービス設定のパスでもあります。
  • GitLab Runnerが非rootユーザーとして実行される場合、*nixシステムでは~/.gitlab-runner/にあります。
  • その他のシステムの./

ほとんどのオプションでは、オプションを変更した場合にGitLab Runnerを再起動する必要はありません。これには、[[runners]]セクションのパラメータとlisten_addressを除くグローバルセクションのほとんどのパラメータが含まれます。Runnerがすでに登録されている場合は、再度登録する必要はありません。

GitLab Runnerは、設定の変更を3秒ごとに確認し、必要に応じて再読み込みします。またGitLab Runnerは、SIGHUPシグナルに応答して設定を再読み込みします。

設定検証

設定検証は、config.tomlファイルの構造をチェックするプロセスです。設定バリデーターからの出力は、infoレベルのメッセージのみを示します。

設定検証プロセスは、情報提供のみを目的としています。この出力から、Runner設定に関する潜在的な問題を特定できます。設定検証では、起こり得るすべての問題を検出できるとは限りません。また、メッセージがないからといって、config.tomlファイルに欠陥がないことが保証されるわけではありません。

グローバルセクション

これらの設定はグローバルなものです。すべてのRunnerに適用されます。

設定説明
concurrent登録されているすべてのRunnerで同時に実行できるジョブ数を制限します。各[[runners]]セクションで独自の制限を定義できますが、この値はそれらのすべての値を合計した最大値を設定します。たとえば、値が10の場合、同時に実行できるジョブは最大10個までとなります。0は禁止されています。この値を使用すると、Runnerプロセスは重大なエラーで終了します。Docker Machine executorインスタンスexecutorDocker Autoscaler executorrunners.custom_build_dir設定でこの設定がどのように機能するかをご確認ください。
log_levelログレベルを定義します。オプションには、debuginfowarnerrorfatalpanicがあります。この設定は、コマンドライン引数の--debug-l、または--log-levelで設定されるレベルよりも優先度が低くなります。
log_formatログ形式を指定します。オプションには、runnertextjsonがあります。この設定は、コマンドライン引数の--log-formatで設定される形式よりも優先度が低くなります。デフォルト値はrunnerで、色分けのためのANSIエスケープコードが含まれています。
check_intervalRunnerが新しいジョブを確認する間隔を秒単位で定義します。デフォルト値は3です。0以下に設定すると、デフォルト値が使用されます。
sentry_dsnSentryへのすべてのシステムレベルのエラーの追跡を有効にします。
connection_max_ageGitLabサーバーへのTLSキープアライブ接続を再接続するまでの最大時間を指定します。デフォルト値は15m(15分)です。0以下に設定すると、接続は可能な限り持続します。
listen_addressPrometheusメトリクス用HTTPサーバーがリッスンするアドレス(<host>:<port>)を定義します。
shutdown_timeout強制シャットダウン操作がタイムアウトになりプロセスが終了するまでの秒数を示します。デフォルト値は30です。0以下に設定すると、デフォルト値が使用されます。

設定の警告

ロングポーリングのイシュー

GitLab Runnerは、GitLabのロングポーリングがGitLab Workhorseを介してオンになっている場合、いくつかの設定シナリオでロングポーリングのイシューが発生する可能性があります。これらは、設定に応じて、パフォーマンスのボトルネックから重大な処理遅延まで多岐にわたります。GitLab Runnerのワーカーは、長時間(GitLab Workhorseの設定である-apiCiLongPollingDuration(デフォルトは50秒)と一致)ロングポーリングリクエストで停止し、他のジョブが迅速に処理されるのを妨げる可能性があります。

このイシューは、GitLab Workhorseの-apiCiLongPollingDuration設定によって制御されるGitLab CI/CDのロングポーリング機能に関連しています。オンにすると、ジョブリクエストは、ジョブが利用可能になるのを待機している間、設定された時間までブロックされる可能性があります。

デフォルトのGitLab Workhorseのロングポーリングの設定値は50秒です(最近のGitLabバージョンではデフォルトでオンになっています)。

次に、設定例をいくつか示します:

  • Omnibus:gitlab_workhorse['api_ci_long_polling_duration'] = "50s" in /etc/gitlab/gitlab.rb
  • Helmチャート: gitlab.webservice.workhorse.extraArgs設定を使用
  • CLI:gitlab-workhorse -apiCiLongPollingDuration 50s

詳細については、以下を参照してください:

Symptoms:

  • 一部のプロジェクトからのジョブは、開始前に遅延が発生します(時間は、GitLabインスタンスのロングポーリングのタイムアウトと一致します)。
  • 他のプロジェクトからのジョブはすぐに実行されます
  • Runnerログの警告メッセージ:CONFIGURATION: Long polling issues detected

Common problematic scenarios:

  • ワーカーのスターベーションボトルネック: concurrent設定がRunnerの数よりも少ない(重大なボトルネック)
  • リクエストのボトルネック: request_concurrency=1のRunnerは、ロングポーリング中にジョブの遅延を引き起こします
  • ビルド制限のボトルネック: limit設定(≤2)が低いRunnerとrequest_concurrency=1の組み合わせ

Solution options:

GitLab Runnerは、問題のあるシナリオを自動的に検出し、警告メッセージで調整されたソリューションを提供します。一般的な解決策は次のとおりです:

  • Runnerの数を超えるようにconcurrent設定を増やします。
  • 高ボリュームのRunnerのrequest_concurrency値を1より大きい値に設定します(デフォルトは1)。システムのステートを理解し、設定に最適な値を見つけるために、Runnerのモニタリングをオンにすることを検討してください。ワークロードに基づいてrequest_concurrencyを自動的に調整するには、FF_USE_ADAPTIVE_REQUEST_CONCURRENCY機能フラグを使用することを検討してください。適応的な並行処理については、機能フラグのドキュメントを参照してください。
  • limit設定と予想されるジョブボリュームのバランスを取ります。

Example problematic configurations:

シナリオ1: ワーカーのスターベーションボトルネック

concurrent = 2  # Only 2 concurrent workers

[[runners]]
  name = "runner-1"
[[runners]]
  name = "runner-2"
[[runners]]
  name = "runner-3"  # 3 runners, only 2 workers - severe bottleneck

シナリオ2: リクエストのボトルネック

concurrent = 4  # 4 workers available

[[runners]]
  name = "high-volume-runner"
  request_concurrency = 1  # Default: only 1 request at a time
  limit = 10               # Can handle 10 jobs, but only 1 request slot

シナリオ3: ビルド制限のボトルネック

concurrent = 4

[[runners]]
  name = "limited-runner"
  limit = 2                # Only 2 builds allowed
  request_concurrency = 1  # Only 1 request at a time
  # Creates severe bottleneck: builds at capacity + request slot blocked by long polling

Example corrected configuration:

concurrent = 4  # Adequate worker capacity

[[runners]]
  name = "high-volume-runner"
  request_concurrency = 3  # Allow multiple simultaneous requests
  limit = 10

[[runners]]
  name = "balanced-runner"
  request_concurrency = 2
  limit = 5

設定例


# Example `config.toml` file

concurrent = 100 # A global setting for job concurrency that applies to all runner sections defined in this `config.toml` file
log_level = "warning"
log_format = "text"
check_interval = 3 # Value in seconds

[[runners]]
  name = "first"
  url = "Your Gitlab instance URL (for example, `https://gitlab.com`)"
  executor = "shell"
  (...)

[[runners]]
  name = "second"
  url = "Your Gitlab instance URL (for example, `https://gitlab.com`)"
  executor = "docker"
  (...)

[[runners]]
  name = "third"
  url = "Your Gitlab instance URL (for example, `https://gitlab.com`)"
  executor = "docker-autoscaler"
  (...)

log_formatの例(一部)

runner

Runtime platform                                    arch=amd64 os=darwin pid=37300 revision=HEAD version=development version
Starting multi-runner from /etc/gitlab-runner/config.toml...  builds=0
WARNING: Running in user-mode.
WARNING: Use sudo for system-mode:
WARNING: $ sudo gitlab-runner...

Configuration loaded                                builds=0
listen_address not defined, metrics & debug endpoints disabled  builds=0
[session_server].listen_address not defined, session endpoints disabled  builds=0

text

INFO[0000] Runtime platform                              arch=amd64 os=darwin pid=37773 revision=HEAD version="development version"
INFO[0000] Starting multi-runner from /etc/gitlab-runner/config.toml...  builds=0
WARN[0000] Running in user-mode.
WARN[0000] Use sudo for system-mode:
WARN[0000] $ sudo gitlab-runner...
INFO[0000]
INFO[0000] Configuration loaded                          builds=0
INFO[0000] listen_address not defined, metrics & debug endpoints disabled  builds=0
INFO[0000] [session_server].listen_address not defined, session endpoints disabled  builds=0

json

{"arch":"amd64","level":"info","msg":"Runtime platform","os":"darwin","pid":38229,"revision":"HEAD","time":"2025-06-05T15:57:35+02:00","version":"development version"}
{"builds":0,"level":"info","msg":"Starting multi-runner from /etc/gitlab-runner/config.toml...","time":"2025-06-05T15:57:35+02:00"}
{"level":"warning","msg":"Running in user-mode.","time":"2025-06-05T15:57:35+02:00"}
{"level":"warning","msg":"Use sudo for system-mode:","time":"2025-06-05T15:57:35+02:00"}
{"level":"warning","msg":"$ sudo gitlab-runner...","time":"2025-06-05T15:57:35+02:00"}
{"level":"info","msg":"","time":"2025-06-05T15:57:35+02:00"}
{"builds":0,"level":"info","msg":"Configuration loaded","time":"2025-06-05T15:57:35+02:00"}
{"builds":0,"level":"info","msg":"listen_address not defined, metrics \u0026 debug endpoints disabled","time":"2025-06-05T15:57:35+02:00"}
{"builds":0,"level":"info","msg":"[session_server].listen_address not defined, session endpoints disabled","time":"2025-06-05T15:57:35+02:00"}

check_intervalの仕組み

config.tomlに複数の[[runners]]セクションが含まれている場合、GitLab Runnerは設定されているGitlabインスタンスに対して、ジョブリクエストを継続的にスケジュールするループ処理を行います。

次の例では、check_intervalが10秒で、2つの[[runners]]セクション(runner-1runner-2)があります。GitLab Runnerは10秒ごとにリクエストを送信し、5秒間スリープします。

  1. check_intervalの値(10s)を取得します。
  2. Runnerのリスト(runner-1runner-2)を取得します。
  3. スリープ間隔(10s / 2 = 5s)を計算します。
  4. 無限ループを開始します。
    1. runner-1のジョブをリクエストします。
    2. 5s(5秒間)スリープします。
    3. runner-2のジョブをリクエストします。
    4. 5s(5秒間)スリープします。
    5. 繰り返します。

check_interval設定例

# Example `config.toml` file

concurrent = 100 # A global setting for job concurrency that applies to all runner sections defined in this `config.toml` file.
log_level = "warning"
log_format = "json"
check_interval = 10 # Value in seconds

[[runners]]
  name = "runner-1"
  url = "Your Gitlab instance URL (for example, `https://gitlab.com`)"
  executor = "shell"
  (...)

[[runners]]
  name = "runner-2"
  url = "Your Gitlab instance URL (for example, `https://gitlab.com`)"
  executor = "docker"
  (...)

この例では、Runnerのプロセスからのジョブリクエストが5秒ごとに行われます。runner-1runner-2が同じGitlabインスタンスに接続されている場合、このGitlabインスタンスも5秒ごとにこのRunnerから新しいリクエストを受信します。

runner-1の最初のリクエストから次のリクエストまでの間に、合計で2回のスリープ期間が発生します。各期間の長さは5秒であるため、runner-1のリクエストの間隔は約10秒です。runner-2にも同じことが当てはまります。

定義するRunnerが多いと、スリープ間隔は短くなります。ただし、Runnerに対するリクエストが繰り返されるのは、他のすべてのRunnerに対するリクエストとそれぞれのスリープ期間が実行された後になります。

[session_server]セクション

ジョブを操作するには、[[runners]]セクションの外側のルートレベルで[session_server]セクションを指定します。このセクションは、個々のRunnerごとではなく、すべてのRunnerに対して1回だけ設定を行います。

# Example `config.toml` file with session server configured

concurrent = 100 # A global setting for job concurrency that applies to all runner sections defined in this `config.toml` file
log_level = "warning"
log_format = "runner"
check_interval = 3 # Value in seconds

[session_server]
  listen_address = "[::]:8093" # Listen on all available interfaces on port `8093`
  advertise_address = "runner-host-name.tld:8093"
  session_timeout = 1800

[session_server]セクションを設定する場合

  • listen_addressadvertise_addressには、host:portという形式を使用します。ここで、hostはIPアドレス(127.0.0.1:8093)またはドメイン(my-runner.example.com:8093)です。Runnerはこの情報を使用して、セキュアな接続のためのTLS証明書を作成します。
  • listen_addressまたはadvertise_addressで定義されているIPアドレスとポートにGitLabが接続できることを確認します。
  • アプリケーション設定allow_local_requests_from_web_hooks_and_servicesを有効にしていない場合は、advertise_addressがパブリックIPアドレスであることを確認してください。
設定説明
listen_addressセッションサーバーの内部URL。
advertise_addressセッションサーバーにアクセスするためのURL。GitLab RunnerはこのURLをGitlabに公開します。定義されていない場合は、listen_addressが使用されます。
session_timeoutジョブの完了後、セッションがアクティブな状態を維持できる秒数。タイムアウトによってジョブの終了がブロックされます。デフォルトは1800(30分)です。

セッションサーバーとターミナルサポートを無効にするには、[session_server]セクションを削除します。

Runnerインスタンスがすでに実行中の場合は、[session_server]セクションの変更を有効にするためにgitlab-runner restartを実行する必要があることがあります。

GitLab Runner Dockerイメージを使用している場合は、docker runコマンド-p 8093:8093を追加して、ポート8093を公開する必要があります。

[[runners]]セクション

[[runners]]セクションは1つのRunnerを定義します。

設定説明
nameRunnerの説明(情報提供のみを目的としています)
urlGitLabインスタンスのURL。
tokenRunner認証トークン。Runnerの登録中に取得されます。登録トークンとは異なります
tls-ca-fileHTTPSを使用する場合に、ピアを検証するための証明書を含むファイル。自己署名証明書またはカスタム認証局のドキュメントを参照してください。
tls-cert-fileHTTPSを使用する場合に、ピアとの認証に使用する証明書を含むファイル。
tls-key-fileHTTPSを使用する場合に、ピアとの認証に使用する秘密キーを含むファイル。
limitこの登録済みRunnerが同時に処理できるジョブ数の制限を設定します。0(デフォルト)は、制限なしを意味します。この設定がDocker MachineInstanceDocker Autoscalerの各executorでどのように機能するかについては、関連ドキュメントを参照してください。
executorRunnerがCI/CDジョブを実行するために使用するホストのオペレーティングシステムの環境またはコマンドプロセッサ。詳細については、executorを参照してください。
shellスクリプトを生成するShellの名前。デフォルト値はプラットフォームに応じて異なります
builds_dir選択したexecutorのコンテキストでビルドが保存されるディレクトリの絶対パス。たとえば、ローカル、Docker、またはSSH環境で使用します。
cache_dir選択したexecutorのコンテキストでビルドキャッシュが保存されるディレクトリの絶対パス。たとえば、ローカル、Docker、またはSSH環境で使用します。docker executorが使用されている場合、このディレクトリをvolumesパラメータに含める必要があります。
environment環境変数を追加または上書きします。
request_concurrencyGitLabからの新しいジョブに対する同時リクエスト数を制限します。デフォルトは1です。ジョブフローを制御するためにconcurrencylimit、およびrequest_concurrencyがどのように相互作用するかについて詳しくは、GitLab Runnerの並行処理チューニングに関するKB記事をご覧ください。
output_limitビルドログの最大サイズ(KB単位)。デフォルトは4096(4 MB)です。
pre_get_sources_scriptGitリポジトリの更新とサブモジュールの更新の前にRunnerで実行されるコマンド。たとえば、最初にGitクライアントの設定を調整するために使用します。複数のコマンドを挿入するには、(三重引用符で囲まれた)複数行の文字列または\n文字を使用します。
post_get_sources_scriptGitリポジトリの更新とサブモジュールの更新の後にRunnerで実行されるコマンド。複数のコマンドを挿入するには、(三重引用符で囲まれた)複数行の文字列または\n文字を使用します。
pre_build_scriptジョブの実行前にRunnerで実行されるコマンド。複数のコマンドを挿入するには、(三重引用符で囲まれた)複数行の文字列または\n文字を使用します。
post_build_scriptジョブの実行直後、after_scriptの実行前にRunnerで実行されるコマンド。複数のコマンドを挿入するには、(三重引用符で囲まれた)複数行の文字列または\n文字を使用します。
clone_urlGitLabインスタンスのURLを上書きします。RunnerがGitlab URLに接続できない場合にのみ使用されます。
debug_trace_disabledデバッグトレーシングを無効にします。trueに設定すると、CI_DEBUG_TRACEtrueに設定されていても、デバッグログ(トレース)は無効のままになります。
clean_git_configGit設定をクリーンアップします。詳しくは、Git設定をクリーンアップするを参照してください。
referees結果をジョブアーティファクトとしてGitLabに渡す追加のジョブモニタリングワーカー。
unhealthy_requests_limit新規ジョブリクエストのunhealthy応答の数。この数を超えると、Runnerワーカーは無効になります。
unhealthy_interval異常なリクエストの制限を超えた後に、Runnerワーカーが無効になる期間。3600 s1 h 30 minなどの構文をサポートしています。
job_status_final_update_retry_limitGitLab Runnerが最終ジョブ状態をGitLabインスタンスにプッシュする操作を再試行できる最大回数。

例:

[[runners]]
  name = "example-runner"
  url = "http://gitlab.example.com/"
  token = "TOKEN"
  limit = 0
  executor = "docker"
  builds_dir = ""
  shell = ""
  environment = ["ENV=value", "LC_ALL=en_US.UTF-8"]
  clone_url = "http://gitlab.example.local"

従来の/ci URLサフィックス

1.0.0より前のバージョンのGitLab Runnerでは、RunnerのURLは/ciサフィックスで設定されていました(例:url = "https://gitlab.example.com/ci")。このサフィックスは不要になったため、設定から削除する必要があります。

config.toml/ciサフィックスを含むURLが含まれている場合、GitLab Runnerは設定を処理するときに自動的にそれを削除します。ただし、イシューの可能性を回避するために、設定ファイルを更新してサフィックスを削除する必要があります。

既知の問題

  • Gitサブモジュールの認証の失敗: GIT_SUBMODULE_FORCE_HTTPS=trueが設定されている場合、サブモジュールはfatal: could not read Username for 'https://gitlab.example.com': terminal prompts disabledのような認証エラーでクローンに失敗する可能性があります。このイシューは、/ciサフィックスがGit URLの書き換えルールを妨げるために発生します。詳しくは、issue 581678をご覧ください。

Problematic configuration:

[[runners]]
  name = "legacy-runner"
  url = "https://gitlab.example.com/ci"  # Remove the /ci suffix
  token = "TOKEN"
  executor = "docker"

Corrected configuration:

[[runners]]
  name = "legacy-runner"
  url = "https://gitlab.example.com"  # /ci suffix removed
  token = "TOKEN"
  executor = "docker"

GitLab Runnerが/ciサフィックスを含むURLで起動すると、警告メッセージをログに記録します:

WARNING: The runner URL contains a legacy '/ci' suffix. This suffix is deprecated and should be
removed from the configuration. Git submodules may fail to clone with authentication errors if this
suffix is present. Please update the 'url' field in your config.toml to remove the '/ci' suffix.
See https://docs.gitlab.com/runner/configuration/advanced-configuration.html#legacy-ci-url-suffix for more information.

この警告を解決するには、config.tomlファイルを編集し、urlフィールドから/ciサフィックスを削除します。

clone_urlの仕組み

Runnerが使用できないURLでGitLabインスタンスが利用可能な場合は、clone_urlを設定できます。

たとえば、ファイアウォールが原因でRunnerがURLにアクセスできない場合があります。Runnerが192.168.1.23上のノードに接続できる場合は、clone_urlhttp://192.168.1.23に設定します。

clone_urlが設定されると、Runnerはhttp://gitlab-ci-token:s3cr3tt0k3n@192.168.1.23/namespace/project.gitの形式でクローンURLを作成します。

clone_urlは、Git LFSエンドポイントまたはアーティファクトのアップロードとダウンロードには影響しません。

Git LFSエンドポイントを変更する

Git LFSエンドポイントを変更するには、次のいずれかのファイルでpre_get_sources_scriptを設定します。

  • config.toml:

    pre_get_sources_script = "mkdir -p $RUNNER_TEMP_PROJECT_DIR/git-template; git config -f $RUNNER_TEMP_PROJECT_DIR/git-template/config lfs.url https://<alternative-endpoint>"
  • .gitlab-ci.yml:

    default:
      hooks:
        pre_get_sources_script:
          - mkdir -p $RUNNER_TEMP_PROJECT_DIR/git-template
          - git config -f $RUNNER_TEMP_PROJECT_DIR/git-template/config lfs.url https://localhost

unhealthy_requests_limitunhealthy_intervalの仕組み

GitLabインスタンスが長期間使用できない場合(バージョンのアップグレード中など)、そのRunnerはアイドル状態になります。GitLabインスタンスが再び使用可能になっても、Runnerは後の30~60分間は、ジョブ処理を再開しません。

Runnerがアイドル状態になる期間を増減するには、unhealthy_interval設定を変更します。

RunnerのGitLabサーバーへの接続試行回数を変更し、アイドル状態になる前に異常なスリープを受信するには、unhealthy_requests_limit設定を変更します。詳細については、check_intervalの仕組みを参照してください。

executor

次のexecutorを使用できます。

executor必要な設定ジョブの実行場所
shellローカルShell。デフォルトのexecutor。
docker[runners.docker]Docker EngineDockerコンテナ。
docker-windows[runners.docker]Docker EngineWindows Dockerコンテナ。
ssh[runners.ssh]SSH、リモート。
parallels[runners.parallels][runners.ssh]Parallels VM、SSHで接続。
virtualbox[runners.virtualbox][runners.ssh]VirtualBox VM、SSHで接続。
docker+machine[runners.docker][runners.machine]dockerと同じ。ただし、オートスケールDocker Machineを使用。
kubernetes[runners.kubernetes]Kubernetesポッド。
docker-autoscaler[docker-autoscaler][runners.autoscaler]dockerと同じ。ただし、オートスケールインスタンスを使用してCI/CDジョブをコンテナ内で実行。
instance[docker-autoscaler][runners.autoscaler]shellと同じ。ただし、オートスケールインスタンスを使用してCI/CDジョブをホストインスタンス上で直接実行。

Shell

Shell executorを使用するように設定されている場合、CI/CDジョブはホストマシンでローカルに実行されます。サポートされているオペレーティングシステムのShellは次のとおりです。

Shell説明
bashBash(Bourne-shell)スクリプトを生成します。すべてのコマンドはBashコンテキストで実行されます。すべてのUnixシステムのデフォルトです。
shSh(Bourne-shell)スクリプトを生成します。すべてのコマンドはShコンテキストで実行されます。すべてのUnixシステムでbashのフォールバックとして使用されます。
powershellPowerShellスクリプトを生成します。すべてのコマンドはPowerShell Desktopのコンテキストで実行されます。
pwshPowerShellスクリプトを生成します。すべてのコマンドはPowerShell Coreのコンテキストで実行されます。これは、WindowsのデフォルトShellです。

shellオプションがbashまたはshに設定されている場合、BashのANSI-C引用符の処理方法を使用して、ジョブスクリプトがShellエスケープされます。

POSIX準拠のShellを使用する

GitLab Runner 14.9以降では、dashなどのPOSIX準拠のShellを使用するには、FF_POSIXLY_CORRECT_ESCAPES機能フラグを有効にします。有効にすると、POSIX準拠のShellエスケープメカニズムである二重引用符が使用されます。

[runners.docker]セクション

次の設定は、Dockerコンテナのパラメータを定義します。これらの設定は、Docker executorを使用するようにRunnerが設定されている場合に適用されます。

サービスとしてのDocker-in-Docker、またはジョブ内で設定されているコンテナランタイムは、これらのパラメータを継承しません。

パラメータ説明
allowed_images["ruby:*", "python:*", "php:*"].gitlab-ci.ymlファイルで指定できるイメージのワイルドカードリスト。この設定がない場合は、すべてのイメージが許可されます(["*/*:*"]と同等)。Docker executorまたはKubernetes executorで使用します。
allowed_privileged_imagesprivilegedが有効になっている場合に、特権モードで実行されるallowed_imagesのワイルドカードサブセット。この設定がない場合は、すべてのイメージが許可されます(["*/*:*"]と同等)。Docker executorで使用します。
allowed_pull_policies.gitlab-ci.ymlファイルまたはconfig.tomlファイルで指定できるプルポリシーのリスト。指定されていない場合、pull-policyで指定されたプルポリシーのみが許可されます。Docker executorで使用します。
allowed_services["postgres:9", "redis:*", "mysql:*"].gitlab-ci.ymlファイルで指定できるサービスのワイルドカードリスト。この設定がない場合は、すべてのイメージが許可されます(["*/*:*"]と同等)。Docker executorまたはKubernetes executorで使用します。
allowed_privileged_servicesprivilegedまたはservices_privilegedが有効になっている場合に、特権モードで実行できるallowed_servicesのワイルドカードサブセット。この設定がない場合は、すべてのイメージが許可されます(["*/*:*"]と同等)。Docker executorで使用します。
cache_dirDockerキャッシュを保存するディレクトリ。絶対パス、または現在の作業ディレクトリを基準にした相対パスを指定できます。詳細については、disable_cacheを参照してください。
cap_add["NET_ADMIN"]コンテナにLinux機能を追加します。
cap_drop["DAC_OVERRIDE"]コンテナから追加のLinux機能を削除します。
cpuset_cpus"0,1"コントロールグループのCpusetCpus。文字列。
cpuset_mems"0,1"コントロールグループのCpusetMems。文字列。
cpu_shares相対CPU使用率を設定するために使用されるCPU共有の数。デフォルトは1024です。
cpus"2"CPUの数(Docker 1.13以降で利用可能)。文字列。
devices["/dev/net/tun"]追加のホストデバイスをコンテナと共有します。
device_cgroup_rulesカスタムデバイスのcgroupルール(Docker 1.28以降で利用可能)。
disable_cacheDocker executorには、グローバルキャッシュ(他のexecutorと同様)とDockerボリュームに基づくローカルキャッシュという2つのレベルのキャッシュがあります。この設定フラグは、自動的に作成された(ホストディレクトリにマップされていない)キャッシュボリュームの使用を無効にするローカルキャッシュでのみ機能します。つまり、ビルドの一時ファイルを保持するコンテナの作成を防ぐだけであり、Runnerが分散キャッシュモードで設定されている場合は、キャッシュを無効にしません。
disable_entrypoint_overwriteイメージエントリポイントの上書きを無効にします。
dns["8.8.8.8"]コンテナが使用するDNSサーバーのリスト。
dns_searchDNS検索ドメインのリスト。
extra_hosts["other-host:127.0.0.1"]コンテナ環境で定義する必要があるホスト。
gpusDockerコンテナ用のGPUデバイス。docker CLIと同じ形式を使用します。詳細については、Dockerのドキュメントを参照してください。GPUを有効にするための設定が必要です。
group_add["docker"]コンテナプロセスを実行するためのグループをさらに追加します。
helper_image(高度)リポジトリのクローンやアーティファクトのアップロードに使用されるデフォルトのヘルパーイメージ
helper_image_flavorヘルパーイメージフレーバー(alpinealpine3.21alpine-latestubi-fips、またはubuntu)を設定します。alpineがデフォルトです。alpineフレーバーはalpine-latestと同じバージョンを使用します。
helper_image_autoset_arch_and_os基盤となるOSを使用して、ヘルパーイメージのアーキテクチャとOSを設定します。
hostカスタムDockerエンドポイント。デフォルトはDOCKER_HOST環境変数またはunix:///var/run/docker.sockです。
hostnameDockerコンテナのカスタムホスト名。
image"ruby:3.3"ジョブを実行するイメージ。
links["mysql_container:mysql"]ジョブを実行するコンテナにリンクする必要があるコンテナ。
memory"128m"メモリ制限。文字列。
memory_swap"256m"合計メモリ制限。文字列。
memory_reservation"64m"メモリのソフト制限。文字列。
network_modeコンテナをカスタムネットワークに追加します。
mac_address92:d0:c6:0a:29:33コンテナのMACアドレス。
oom_kill_disableメモリ不足(OOM)エラーが発生した場合に、コンテナ内のプロセスを終了しません。
oom_score_adjustOOMスコアの調整。正の値は、プロセスを早期に終了することを意味します。
privilegedfalseコンテナを特権モードで実行します。安全ではありません。
services_privilegedサービスを特権モードで実行できるようにします。設定されていない場合(デフォルト)、代わりにprivilegedの値が使用されます。Docker executorで使用します。安全ではありません。
pull_policyイメージプルポリシー(neverif-not-present、またはalways(デフォルト))。詳細については、プルポリシーのドキュメントを参照してください。複数のプルポリシーの追加、失敗したプルの再試行プルポリシーの制限も可能です。
runtimeDockerコンテナのランタイム。
isolationコンテナ分離テクノロジー(defaulthyperv、およびprocess)。Windowsのみ。
security_optセキュリティオプション(docker runの–security-opt)。:で区切られたキー/値のリストを取得します。systempaths仕様はサポートされていません。詳細については、issue 36810をご覧ください。
shm_size300000イメージの共有メモリサイズ(バイト単位)。
sysctlssysctlのオプション。
tls_cert_pathmacOSの場合: /Users/<username>/.boot2docker/certsca.pemcert.pem、またはkey.pemが保存され、Dockerへの安全なTLS接続を確立するために使用されるディレクトリ。この設定はboot2dockerで使用します。
tls_verifyDockerデーモンへの接続のTLS検証を有効または無効にします。デフォルトでは無効になっています。デフォルトでは、GitLab RunnerはSSH経由でDocker Unixソケットに接続します。UnixソケットはRTLSをサポートしておらず、暗号化と認証を提供するためにSSHを使用してHTTP経由で通信します。通常、tls_verifyを有効にする必要はありません。有効にする場合には、追加の設定が必要です。tls_verifyを有効にするには、デーモンが(デフォルトのUnixソケットではなく)ポートでリッスンする必要があり、GitLab Runner Dockerホストはデーモンがリッスンしているアドレスを使用する必要があります。
userコンテナ内のすべてのコマンドを、指定されたユーザーとして実行します。
userns_modeユーザーネームスペースの再マッピングオプションが有効になっている場合の、コンテナおよびDockerサービス用のユーザーネームスペースモード。Docker 1.10以降で利用可能です。詳細については、Dockerのドキュメントを参照してください。
ulimitコンテナに渡されるUlimit値。Docker --ulimitフラグと同じ構文を使用します。
volumes["/data", "/home/project/cache"]マウントする必要がある追加ボリューム。Docker -vフラグと同じ構文。
volumes_from["storage_container:ro"]別のコンテナから継承するボリュームのリスト。形式は<container name>[:<access_level>]です。アクセスレベルはデフォルトで読み取り/書き込みですが、手動でro(読み取り専用)またはrw(読み取り/書き込み)に設定できます。
volume_driverコンテナに使用するボリュームドライバー。
wait_for_services_timeout30Dockerサービスを待機する時間。無効にするには-1に設定します。デフォルトは30です。
container_labelsRunnerによって作成された各コンテナに追加するラベルのセット。ラベルの値には、展開用の環境変数を含めることができます。
services_limitジョブごとに許可されるサービスの最大数を設定します。-1(デフォルト)は、制限がないことを意味します。
service_cpuset_cpusサービスに使用するcgroups CpusetCpusを含む文字列値。
service_cpu_sharesサービスの相対CPU使用率を設定するために使用されるCPUシェア数(デフォルトは1024)。
service_cpusサービスのCPU数を表す文字列値。Docker 1.13以降で利用可能です。
service_gpusDockerコンテナ用のGPUデバイス。docker CLIと同じ形式を使用します。詳細については、Dockerのドキュメントを参照してください。GPUを有効にするための設定が必要です。
service_memoryサービスのメモリ制限を表す文字列値。
service_memory_swapサービスの合計メモリ制限を表す文字列値。
service_memory_reservationサービスのメモリのソフト制限を表す文字列値。

[[runners.docker.services]]セクション

ジョブと実行する追加のサービスを指定します。利用可能なイメージのリストについては、Docker Registryを参照してください。各サービスは個別のコンテナで実行され、ジョブにリンクされます。

パラメータ説明
name"registry.example.com/svc1"サービスとして実行されるイメージの名前。
alias"svc1"サービスへのアクセスに使用できる追加のエイリアス名
entrypoint["entrypoint.sh"]コンテナのエントリポイントとして実行されるコマンドまたはスクリプト。構文はDockerfile ENTRYPOINTディレクティブに似ており、各Shellトークンは配列内の個別の文字列です。GitLab Runner 13.6で導入されました。
command["executable","param1","param2"]コンテナのコマンドとして使用されるコマンドまたはスクリプト。構文はDockerfile CMDディレクティブに似ており、各Shellトークンは配列内の個別の文字列です。GitLab Runner 13.6で導入されました。
environment["ENV1=value1", "ENV2=value2"]サービスコンテナの環境変数を付加または上書きします。

例:

[runners.docker]
  host = ""
  hostname = ""
  tls_cert_path = "/Users/ayufan/.boot2docker/certs"
  image = "ruby:3.3"
  memory = "128m"
  memory_swap = "256m"
  memory_reservation = "64m"
  oom_kill_disable = false
  cpuset_cpus = "0,1"
  cpuset_mems = "0,1"
  cpus = "2"
  dns = ["8.8.8.8"]
  dns_search = [""]
  service_memory = "128m"
  service_memory_swap = "256m"
  service_memory_reservation = "64m"
  service_cpuset_cpus = "0,1"
  service_cpus = "2"
  services_limit = 5
  privileged = false
  group_add = ["docker"]
  cap_add = ["NET_ADMIN"]
  cap_drop = ["DAC_OVERRIDE"]
  devices = ["/dev/net/tun"]
  disable_cache = false
  wait_for_services_timeout = 30
  cache_dir = ""
  volumes = ["/data", "/home/project/cache"]
  extra_hosts = ["other-host:127.0.0.1"]
  shm_size = 300000
  volumes_from = ["storage_container:ro"]
  links = ["mysql_container:mysql"]
  allowed_images = ["ruby:*", "python:*", "php:*"]
  allowed_services = ["postgres:9", "redis:*", "mysql:*"]
  [runners.docker.ulimit]
    "rtprio" = "99"
  [[runners.docker.services]]
    name = "registry.example.com/svc1"
    alias = "svc1"
    entrypoint = ["entrypoint.sh"]
    command = ["executable","param1","param2"]
    environment = ["ENV1=value1", "ENV2=value2"]
  [[runners.docker.services]]
    name = "redis:2.8"
    alias = "cache"
  [[runners.docker.services]]
    name = "postgres:9"
    alias = "postgres-db"
  [runners.docker.sysctls]
    "net.ipv4.ip_forward" = "1"

[runners.docker]セクションのボリューム

ボリュームの詳細については、Dockerのドキュメントを参照してください。

次の例は、[runners.docker]セクションでボリュームを指定する方法を示しています。

例1: データボリュームを追加する

データボリュームは、1つ以上のコンテナ内で特別に指定されたディレクトリで、Union File Systemをバイパスします。データボリュームは、コンテナのライフサイクルに依存せず、データを永続化するように設計されています。

[runners.docker]
  host = ""
  hostname = ""
  tls_cert_path = "/Users/ayufan/.boot2docker/certs"
  image = "ruby:3.3"
  privileged = false
  disable_cache = true
  volumes = ["/path/to/volume/in/container"]

この例では、コンテナ内の/path/to/volume/in/containerという場所に新しいボリュームが作成されます。

例2: ホストディレクトリをデータボリュームとしてマウントする

コンテナの外部にディレクトリを保存する場合は、Dockerデーモンのホストからコンテナにディレクトリをマウントできます。

[runners.docker]
  host = ""
  hostname = ""
  tls_cert_path = "/Users/ayufan/.boot2docker/certs"
  image = "ruby:3.3"
  privileged = false
  disable_cache = true
  volumes = ["/path/to/bind/from/host:/path/to/bind/in/container:rw"]

この例では、CI/CDホストの/path/to/bind/from/hostをコンテナ内の/path/to/bind/in/containerで使用します。

GitLab Runner 11.11以降では、定義されたサービスについても同様にホストディレクトリをマウントします。

プライベートコンテナレジストリを使用する

ジョブのイメージのソースとしてプライベートレジストリを使用するには、CI/CD変数DOCKER_AUTH_CONFIGを使用して認証を設定します。次のいずれかで変数を設定できます。

  • プロジェクトのCI/CD設定内でfileタイプとして設定
  • config.tomlファイル内で設定

if-not-presentプルポリシーでプライベートレジストリを使用すると、セキュリティ上の影響が生じる可能性があります。プルポリシーの仕組みの詳細については、Runnerがイメージをプルする方法を設定するを参照してください。

プライベートコンテナレジストリの使用に関する詳細については、以下を参照してください。

Runnerによって実行されるステップの要約を次に示します。

  1. レジストリ名がイメージ名から検出されます。
  2. 値が空でない場合、executorはこのレジストリに対する認証設定を検索します。
  3. 最後に、指定されたレジストリに対応する認証が見つかった場合、以降のプルではその認証が使用されます。

GitLab統合レジストリのサポート

GitLabは、ジョブのデータとともに、統合レジストリの認証情報を送信します。これらの認証情報は、レジストリの認証パラメータリストに自動的に追加されます。

このステップの後、レジストリに対する認証は、DOCKER_AUTH_CONFIG変数で追加された設定と同様に進みます。

ジョブでは、GitLab統合レジストリのイメージがプライベートまたは保護されている場合でも、任意のイメージを使用できます。ジョブがアクセスできるイメージの詳細については、CI/CDジョブトークンのドキュメントを参照してください。

Docker認証解決の優先順位

前述のように、GitLab Runnerはさまざまな方法で送信される認証情報を使用して、レジストリに対してDockerを認証できます。適切なレジストリを見つけるために、次の優先順位が考慮されます。

  1. DOCKER_AUTH_CONFIGで設定された認証情報
  2. GitLab Runnerホストでローカルに設定された認証情報(~/.docker/config.jsonまたは~/.dockercfgファイルに保存)(例: ホストでdocker loginを実行した場合)。
  3. ジョブのペイロードとともにデフォルトで送信される認証情報(例: 前述の統合レジストリの認証情報)。

レジストリに対して最初に検出された認証情報が使用されます。たとえば、DOCKER_AUTH_CONFIG変数を使用して統合レジストリの認証情報を追加すると、デフォルトの認証情報が上書きされます。

[runners.parallels]セクション

次にParallelsのパラメータを示します。

パラメータ説明
base_nameクローンされるParallels VMの名前。
template_nameParallels VMにリンクされたテンプレートのカスタム名。オプション。
disable_snapshots無効にした場合、ジョブが完了するとVMは破棄されます。
allowed_images許可されるimage/base_name値のリスト。これらの値は正規表現として表されます。詳細については、ベースVMイメージを上書きするセクションを参照してください。

例:

[runners.parallels]
  base_name = "my-parallels-image"
  template_name = ""
  disable_snapshots = false

[runners.virtualbox]セクション

次にVirtualBoxのパラメータを示します。このexecutorは、VirtualBoxマシンを制御するためにvboxmanage実行可能ファイルに依存しています。そのため、WindowsホストではPATH環境変数を調整する必要があります(PATH=%PATH%;C:\Program Files\Oracle\VirtualBox)。

パラメータ説明
base_nameクローンされるVirtualBox VMの名前。
base_snapshotリンクされたクローンを作成する際の特定のVMスナップショットの名前またはUUID。この値が空であるか省略されている場合は、現在のスナップショットが使用されます。現在のスナップショットが存在しない場合は、スナップショットが作成されます。ただし、disable_snapshotsがtrueでない場合は、ベースVMの完全なクローンが作成されます。
base_folder新しいVMを保存するフォルダー。この値が空であるか省略されている場合は、デフォルトのVMフォルダーが使用されます。
disable_snapshots無効にした場合、ジョブが完了するとVMは破棄されます。
allowed_images許可されるimage/base_name値のリスト。これらの値は正規表現として表されます。詳細については、ベースVMイメージを上書きするセクションを参照してください。
start_typeVMの起動時のグラフィカルフロントエンドタイプ。

例:

[runners.virtualbox]
  base_name = "my-virtualbox-image"
  base_snapshot = "my-image-snapshot"
  disable_snapshots = false
  start_type = "headless"

start_typeパラメータは、仮想イメージの起動時に使用されるグラフィカルフロントエンドを決定します。有効な値は、ホストとゲストの組み合わせでサポートされているheadless(デフォルト)、gui、またはseparateです。

ベースVMイメージを上書きする

Parallels executorとVirtualBox executorの両方で、base_nameで指定されたベースVM名を上書きできます。そのためには、.gitlab-ci.ymlファイルのimageパラメータを使用します。

下位互換性のため、デフォルトではこの値を上書きできません。base_nameで指定されたイメージのみが許可されます。

ユーザーが.gitlab-ci.ymlimageパラメータを使用してVMイメージを選択できるようにするには、次のようにします。

[runners.virtualbox]
  ...
  allowed_images = [".*"]

この例では、既存のVMイメージであればどれでも使用できます。

allowed_imagesパラメータは、正規表現のリストです。必要な精度に応じて設定を細かく指定できます。たとえば、特定のVMイメージのみを許可したい場合は、次のような正規表現を使用できます。

[runners.virtualbox]
  ...
  allowed_images = ["^allowed_vm[1-2]$"]

この例では、allowed_vm1allowed_vm2のみが許可されます。その他の試行はすべてエラーになります。

[runners.ssh]セクション

次のパラメータは、SSH接続を定義します。

パラメータ説明
host接続先
portポートデフォルトは22です。
userユーザー名。
passwordパスワード。
identity_fileSSH秘密キーのファイルパス(id_rsaid_dsa、またはid_edcsa)。ファイルは暗号化されていない状態で保存する必要があります。
disable_strict_host_key_checkingこの値は、Runnerが厳密なホストキーチェックを使用するかどうかを決定します。デフォルトはtrueです。GitLab 15.0では、デフォルト値、または指定されていない場合の値はfalseです。

例:

[runners.ssh]
  host = "my-production-server"
  port = "22"
  user = "root"
  password = "production-server-password"
  identity_file = ""

[runners.machine]セクション

次のパラメータは、Docker Machineベースのオートスケール機能を定義します。詳細については、Docker Machine Executorのオートスケール設定を参照してください。

パラメータ説明
MaxGrowthRateRunnerに並行して追加できるマシンの最大数。デフォルトは0(制限なし)です。
IdleCount_アイドル_状態で作成され待機する必要があるマシンの数。
IdleScaleFactor使用中マシンの数の係数として示される_アイドル_マシンの数。浮動小数点数形式である必要があります。詳細については、オートスケールのドキュメントを参照してください。0.0がデフォルトです。
IdleCountMinIdleScaleFactor使用時に作成され_アイドル_状態で待機する必要があるマシンの最小数。デフォルトは1です。
IdleTimeマシンが削除されるまでにそのマシンが_アイドル_状態を維持する時間(秒単位)。
[[runners.machine.autoscaling]]オートスケール設定の上書きが含まれている複数のセクション。現在の時刻に一致する式を含む最後のセクションが選択されます。
OffPeakPeriods非推奨: スケジューラがOffPeakモードになっている時間帯。cron形式のパターンの配列(下記を参照)。
OffPeakTimezone非推奨: OffPeakPeriodsで指定された時刻のタイムゾーン。Europe/Berlinのようなタイムゾーン文字列です。省略または空の場合、デフォルトはホストのロケールシステム設定です。GitLab Runnerは、ZONEINFO環境変数で指定されたディレクトリまたは解凍済みzipファイルでタイムゾーンデータベースを検索し、次にUnixシステム上の既知のインストール場所を検索し、最後に$GOROOT/lib/time/zoneinfo.zip内を検索します。
OffPeakIdleCount非推奨: IdleCountと同様ですが、_オフピーク_の時間帯を対象としています。
OffPeakIdleTime非推奨: IdleTimeと同様ですが、_オフピーク_の時間帯を対象としています。
MaxBuildsマシンが削除されるまでの最大ジョブ(ビルド)数。
MachineNameマシンの名前。%sを含める必要があります。これは一意のマシン識別子に置き換えられます。
MachineDriverDocker Machineのdriver。詳細については、Docker Machine設定のクラウドプロバイダーセクションを参照してください。
MachineOptionsMachineDriverのDocker Machineオプション。詳細については、サポートされているクラウドプロバイダーを参照してください。AWSのすべてのオプションの詳細については、Docker MachineリポジトリのAWSプロジェクトとGCPプロジェクトを参照してください。

[[runners.machine.autoscaling]]セクション

次のパラメータは、Instance executorまたはDocker Autoscaler executorを使用する際に利用可能な設定を定義します。

パラメータ説明
Periodsこのスケジュールがアクティブな時間帯。cron形式のパターンの配列(下記を参照)。
IdleCount_アイドル_状態で作成され待機する必要があるマシンの数。
IdleScaleFactor(実験的機能)使用中のマシン数の係数として示される_アイドル_マシンの数。浮動小数点数形式である必要があります。詳細については、オートスケールのドキュメントを参照してください。0.0がデフォルトです。
IdleCountMinIdleScaleFactor使用時に作成され_アイドル_状態で待機する必要があるマシンの最小数。デフォルトは1です。
IdleTimeマシンが削除されるまでにそのマシンが_アイドル_状態である時間(秒単位)。
TimezonePeriodsで指定された時刻のタイムゾーン。Europe/Berlinのようなタイムゾーン文字列です。省略または空の場合、デフォルトはホストのロケールシステム設定です。GitLab Runnerは、ZONEINFO環境変数で指定されたディレクトリまたは解凍済みzipファイルでタイムゾーンデータベースを検索し、次にUnixシステム上の既知のインストール場所を検索し、最後に$GOROOT/lib/time/zoneinfo.zip内を検索します。

例:

[runners.machine]
  IdleCount = 5
  IdleTime = 600
  MaxBuilds = 100
  MachineName = "auto-scale-%s"
  MachineDriver = "google" # Refer to Docker Machine docs on how to authenticate: https://docs.docker.com/machine/drivers/gce/#credentials
  MachineOptions = [
      # Additional machine options can be added using the Google Compute Engine driver.
      # If you experience problems with an unreachable host (ex. "Waiting for SSH"),
      # you should remove optional parameters to help with debugging.
      # https://docs.docker.com/machine/drivers/gce/
      "google-project=GOOGLE-PROJECT-ID",
      "google-zone=GOOGLE-ZONE", # e.g. 'us-central1-a', full list in https://cloud.google.com/compute/docs/regions-zones/
  ]
  [[runners.machine.autoscaling]]
    Periods = ["* * 9-17 * * mon-fri *"]
    IdleCount = 50
    IdleCountMin = 5
    IdleScaleFactor = 1.5 # Means that current number of Idle machines will be 1.5*in-use machines,
                          # no more than 50 (the value of IdleCount) and no less than 5 (the value of IdleCountMin)
    IdleTime = 3600
    Timezone = "UTC"
  [[runners.machine.autoscaling]]
    Periods = ["* * * * * sat,sun *"]
    IdleCount = 5
    IdleTime = 60
    Timezone = "UTC"

periods構文

Periods設定は、cron形式で表される時間帯の文字列パターンを集めた配列です。行は次のフィールドで構成されます。

[second] [minute] [hour] [day of month] [month] [day of week] [year]

標準のcron設定ファイルと同様に、これらのフィールドには単一値、範囲、リスト、およびアスタリスクを含めることができます。構文の詳細な説明を参照してください。

[runners.instance]セクション

パラメータ説明
allowed_images文字列VM分離が有効になっている場合、allowed_imagesはジョブが指定できるイメージを制御します。

[runners.autoscaler]セクション

次のパラメータは、オートスケーラー機能を設定します。これらのパラメータは、インスタンス executorとDocker Autoscaler executorでのみ使用できます。

パラメータ説明
capacity_per_instance1つのインスタンスで同時に実行できるジョブの数。
max_use_countインスタンスが削除対象としてスケジュールされる前にそのインスタンスを使用できる最大回数。
max_instances許可されるインスタンスの最大数。これは、インスタンスの状態(保留中、実行中、削除中)に関係なく適用されます。デフォルトは0(無制限)です。
plugin使用するフリートプラグイン。プラグインのインストール方法と参照方法について詳しくは、フリートプラグインをインストールするを参照してください。
delete_instances_on_shutdownGitLab Runnerのシャットダウン時に、プロビジョニングされたすべてのインスタンスを削除するかどうかを指定します。デフォルト: falseGitLab Runner 15.11で導入されました。
instance_ready_commandオートスケーラーによってプロビジョニングされた各インスタンスでこのコマンドを実行して、インスタンスが使用できる状態になっていることを確認します。失敗すると、インスタンスが削除されます。GitLab Runner 16.11で導入されました。
instance_acquire_timeoutRunnerがインスタンス取得を待機してタイムアウトになるまでの最大時間。デフォルト: 15m(15分)。この値は、実際の環境に合わせて調整できます。GitLab Runner 18.1で導入されました。
update_intervalフリートプラグインでインスタンスの更新を確認する間隔。デフォルト: 1m(1分)。GitLab Runner 16.11で導入されました。
update_interval_when_expecting状態が変化することが予期される場合にフリートプラグインでインスタンスの更新を確認する間隔。たとえば、インスタンスがインスタンスをプロビジョニングし、Runnerがpendingからrunningへの移行を待機している場合などです。デフォルト: 2s(2秒)。GitLab Runner 16.11で導入されました。
deletion_retry_interval以前の削除試行が効果がなかった場合に、プラグインが削除を再試行するまで待機する間隔。デフォルト: 1m(1分)。GitLab Runner 18.4で導入。
shutdown_deletion_intervalインスタンスを削除してからシャットダウン中にそれらのステータスをチェックするまでの間で使用される、フリーティングプラグインの間隔。デフォルト: 10s(10秒)。GitLab Runner 18.4で導入。
shutdown_deletion_retriesシャットダウン前にインスタンスが削除を完了したことを確認するために、フリーティングプラグインが行う試行の最大数。デフォルト: 3GitLab Runner 18.4で導入。
failure_thresholdフリーティングプラグインがインスタンスを置き換えるまでに発生する、連続したヘルスの失敗の最大数。ハートビート機能も参照してください。デフォルト: 3GitLab Runner 18.4で導入。
log_internal_ipVMの内部IPアドレスをCI/CDの出力ログに記録するかどうかを指定します。デフォルト: falseGitLab Runner 18.1で導入されました。
log_external_ipVMの外部IPアドレスをCI/CDの出力ログに記録するかどうかを指定します。デフォルト: falseGitLab Runner 18.1で導入されました。

instance_ready_commandがアイドル状態のスケールルールで頻繁に失敗する場合、Runnerがジョブを受け入れるよりも速くインスタンスが削除および作成される可能性があります。スケールスロットリングをサポートするため、GitLab 17.0で指数バックオフが追加されました。

オートスケーラーの設定オプションは、設定が変更されても再読み込みされません。ただし、GitLab 17.5.0以降では、設定が変更されると、[[runners.autoscaler.policy]]エントリが再読み込されます。

[runners.autoscaler.plugin_config]セクション

このハッシュテーブルはJSONに再エンコードされ、設定済みのプラグインに直接渡されます。

フリートプラグインには通常、サポートされている設定に関するドキュメントが付いています。

[runners.autoscaler.scale_throttle]セクション

パラメータ説明
limit1秒あたりにプロビジョニングできる新しいインスタンスのレート制限。-1は無制限を意味します。デフォルト(0)では、制限が100に設定されます。
burst新しいインスタンスのバースト制限。デフォルトはmax_instancesに設定されるか、max_instancesが設定されていない場合はlimitに設定されます。limitが無制限の場合、burstは無視されます。

limitburstの関係

スケールスロットルは、トークンクォータシステムを使用してインスタンスを作成します。このシステムは、次の2つの値で定義されます。

  • burst: クォータの最大サイズ。
  • limit: 1秒あたりのクォータ更新レート。

一度に作成できるインスタンスの数は、残りのクォータによって決まります。十分なクォータがある場合は、その量までインスタンスを作成できます。クォータがなくなった場合は、1秒あたりlimitの数のインスタンスを作成できます。インスタンスの作成が停止すると、クォータは1秒あたりlimitずつ、burstの値に達するまで増加します。

たとえば、limit1burst60の場合は、次のようになります。

  • 60個のインスタンスを即時に作成できますが、制限(スロットル)されます。
  • 60秒待機すると、さらに60個のインスタンスを即時に作成できます。
  • 待機しない場合は、1秒ごとに1つのインスタンスを作成できます。

[runners.autoscaler.connector_config]セクション

フリートプラグインには通常、サポートされている接続オプションに関するドキュメントが付いています。

プラグインはコネクタ設定を自動的に更新します。[runners.autoscaler.connector_config]を使用して、コネクタ設定の自動更新を上書きしたり、プラグインが判断できない空の値を入力したりできます。

パラメータ説明
osインスタンスのオペレーティングシステム。
archインスタンスのアーキテクチャ。
protocolsshwinrm、またはwinrm+https。Windowsが検出された場合、デフォルトでwinrmが使用されます。
protocol_port指定されたプロトコルに基づいて接続を確立するために使用されるポート。デフォルトはssh:22winrm+http:5985winrm+https:5986です。
username接続に使用するユーザー名。
password接続に使用するパスワード。
key_path接続に使用するTLSキー、または動的にプロビジョニングされた認証情報に使用するTLSキー。
use_static_credentials自動認証情報プロビジョニングが無効になっています。デフォルト: false
keepalive接続キープアライブ時間。
timeout接続タイムアウト時間。
use_external_addrプラグインが提供する外部アドレスを使用するかどうか。プラグインが内部アドレスのみを返す場合は、この設定に関係なく内部アドレスが使用されます。デフォルト: false

[runners.autoscaler.state_storage]セクション

  • ステータス: ベータ版

ステートストレージが無効になっている場合(デフォルト)、GitLab Runnerが起動すると、安全上の理由から既存のフリートインスタンスは直ちに削除されます。たとえば、max_use_count1に設定されている場合、使用状態がわからないと、すでに使用されているインスタンスに誤ってジョブを割り当ててしまう可能性があります。

ステートストレージ機能を有効にすると、インスタンスの状態をローカルディスクに保持できます。この場合、GitLab Runnerの起動時にインスタンスが存在していても、そのインスタンスは削除されません。キャッシュされた接続の詳細、使用回数、およびその他の設定が復元されます。

ステートストレージ機能を有効にする場合は、次の点を考慮してください。

  • インスタンスの認証の詳細(ユーザー名、パスワード、キー)はディスクに残ります。

  • インスタンスがジョブをアクティブに実行しているときにそのインスタンスが復元されると、GitLab Runnerはデフォルトでそのインスタンスを削除します。GitLab Runnerがジョブを再開できないため、この動作により安全性が確保されます。インスタンスを維持するには、keep_instance_with_acquisitionstrueに設定します。

    インスタンスで進行中のジョブについて特に懸念していない場合には、keep_instance_with_acquisitionstrueに設定すると役立ちます。また、instance_ready_command設定オプションを使用して環境をクリーンアップし、インスタンスを維持することもできます。この場合、実行中のすべてのコマンドを停止したり、Dockerコンテナを強制的に削除したりすることがあります。

パラメータ説明
enabledステートストレージを有効にするかどうか。デフォルト: false
dirステートストアディレクトリ。このディレクトリの中に、各Runner設定エントリに対応するサブディレクトリがあります。デフォルトは、Gitlab Runner設定ファイルディレクトリ内の.taskscalerです。
keep_instance_with_acquisitionsアクティブなジョブがあるインスタンスを削除するかどうか。デフォルト: false

[[runners.autoscaler.policy]]セクション

- ここでのidle_countはジョブの数を示し、従来のオートスケール方式のようにオートスケールされたマシンの数ではありません。

パラメータ説明
periodsこのポリシーが有効になっている期間を示すunix-cron形式の文字列の配列。デフォルト: * * * * *
timezoneunix-cron期間の評価時に使用されるタイムゾーン。デフォルト: システムのローカルタイムゾーン。
idle_countジョブで即時利用可能であるべき目標アイドル容量。
idle_timeインスタンスが終了するまでにアイドル状態でいられる時間。
scale_factoridle_countに加えて、ジョブで即時利用可能であるべき目標アイドル容量を、現在の使用中の容量の係数として表したもの。0.0がデフォルトです。
scale_factor_limitscale_factorの計算から得られる最大容量。
preemptive_modeプリエンプティブモードがオンになっている場合、ジョブがリクエストされるのは、インスタンスが使用可能であることが確認された場合だけです。この動作により、プロビジョニングの遅延なしに、ほぼすぐにジョブを開始できます。プリエンプティブモードがオフになっている場合、まずジョブがリクエストされた後、次にシステムが必要なキャパシティを検出したりプロビジョニングしたりしようとします。

アイドル状態のインスタンスを削除するかどうかを決定するために、taskscalerはidle_timeをインスタンスのアイドル期間と比較します。各インスタンスのアイドル期間は、インスタンスが次の操作を行った時点から計算されます。

  • 最後にジョブを完了した時点(インスタンスが以前に使用されていた場合)。
  • プロビジョニングされた時点(未使用の場合)。

このチェックは、スケーリングイベント中に発生します。設定されているidle_timeを超えるインスタンスは、必要なidle_countジョブキャパシティを維持するために必要な場合を除き、削除されます。

scale_factorを設定すると、idle_countが最小のidle容量になり、scaler_factor_limitが最大のidle容量になります。

複数のポリシーを定義できます。最後に一致したポリシーが使用されます。

次の例では、アイドルカウント1は、月曜日から金曜日の08:00から15:59の間に使用されます。それ以外の場合、アイドルカウントは0です。

[[runners.autoscaler.policy]]
  idle_count        = 0
  idle_time         = "0s"
  periods           = ["* * * * *"]

[[runners.autoscaler.policy]]
  idle_count        = 1
  idle_time         = "30m0s"
  periods           = ["* 8-15 * * mon-fri"]

periods構文

periods設定には、ポリシーが有効になっている期間を示す、unix-cron形式の文字列の配列が含まれています。cron形式は、次の5つのフィールドで構成されています。

 ┌────────── minute (0 - 59)
 │ ┌──────── hour (0 - 23)
 │ │ ┌────── day of month (1 - 31)
 │ │ │ ┌──── month (1 - 12)
 │ │ │ │ ┌── day of week (1 - 7 or MON-SUN, 0 is an alias for Sunday)
 * * * * *
  • -は、2つの数値の間で範囲を指定するときに使用できます。
  • *は、そのフィールドの有効な値の範囲全体を表すときに使用できます。
  • /に続く数字は、範囲内でその数字ごとにスキップするときに範囲の後に使用できます。たとえば、hourフィールドに0-12/2と指定すると、00:00から00:12の間、2時間ごとに期間がアクティブになります。
  • ,は、フィールドの有効な数値または範囲のリストを区切るときに使用できます。たとえば、1,2,6-9などです。

このcronジョブは時間の範囲を表していることを覚えておいてください。例:

期間効果
1 * * * * *1時間ごとに1分間にわたってルールが有効になります(非常に効果的である可能性は低い)
* 0-12 * * *毎日の開始時に12時間にわたってルールが有効になります
0-30 13,16 * * SUN毎週日曜日の午後1時に30分間、午後4時に30分間にわたってルールが有効になります

[runners.autoscaler.vm_isolation]セクション

VM分離はnestingを使用し、これはmacOSでのみサポートされています。

パラメータ説明
enabledVM分離を有効にするかどうかを指定します。デフォルト: false
nesting_hostnestingデーモンホスト。
nesting_confignesting設定。JSONにシリアル化され、nestingデーモンに送信されます。
imageジョブイメージが指定されていない場合に、nestingデーモンで使用されるデフォルトイメージ。

[runners.autoscaler.vm_isolation.connector_config]セクション

[runners.autoscaler.vm_isolation.connector_config]セクションのパラメータは、[runners.autoscaler.connector_config]セクションと同じですが、オートスケールされたインスタンスではなく、nestingでプロビジョニングされた仮想マシンへの接続に使用されます。

[runners.custom]セクション

次のパラメータは、カスタムexecutorの設定を定義します。

パラメータ説明
config_exec文字列実行可能ファイルのパス。これにより、ユーザーはジョブ開始前に一部の設定を上書きできます。これらの値は、[[runners]]セクションで設定されている値を上書きします。一覧はCustom executorのドキュメントにあります。
config_args文字列配列config_exec実行可能ファイルに渡される最初の引数セット。
config_exec_timeout整数config_execの実行が完了するまでのタイムアウト(秒)。デフォルトは3600秒(1時間)。
prepare_exec文字列環境を準備するための実行可能ファイルのパス。
prepare_args文字列配列prepare_exec実行可能ファイルに渡される最初の引数セット。
prepare_exec_timeout整数prepare_execの実行が完了するまでのタイムアウト(秒)。デフォルトは3600秒(1時間)。
run_exec文字列必須。環境内でスクリプトを実行するための実行可能ファイルのパス。たとえば、クローンスクリプトやビルドスクリプトなどです。
run_args文字列配列run_exec実行可能ファイルに渡される最初の引数セット。
cleanup_exec文字列環境をクリーンアップするための実行可能ファイルのパス。
cleanup_args文字列配列cleanup_exec実行可能ファイルに渡される最初の引数セット。
cleanup_exec_timeout整数cleanup_execの実行が完了するまでのタイムアウト(秒)。デフォルトは3600秒(1時間)。
graceful_kill_timeout整数prepare_execcleanup_execが(ジョブのキャンセル中などに)終了した場合に待機する時間(秒)。このタイムアウト後に、プロセスが強制終了されます。デフォルトは600秒(10分)。
force_kill_timeout整数kill(強制終了)シグナルがスクリプトに送信された後に待機する時間(秒)。デフォルトは600秒(10分)。

[runners.cache]セクション

次のパラメータは、分散キャッシュ機能を定義します。詳細については、Runnerオートスケールに関するドキュメントを参照してください。

パラメータ説明
Type文字列s3gcsazureのいずれか。
Path文字列キャッシュURLの先頭に付加するパスの名前。
Sharedブール値Runner間でのキャッシュ共有を有効にします。デフォルトはfalseです。
MaxUploadedArchiveSizeint64クラウドストレージにアップロードされるキャッシュアーカイブの制限(バイト単位)。悪意のあるアクターはこの制限を回避できるため、GCSアダプターは署名付きURLのX-Goog-Content-Length-Rangeヘッダーによってこの制限を適用します。クラウドストレージプロバイダーにも制限を設定する必要があります。

以下の環境変数を使用して、キャッシュの圧縮を設定できます:

変数説明デフォルト
CACHE_COMPRESSION_FORMATキャッシュアーカイブの圧縮形式zipziptarzstd
CACHE_COMPRESSION_LEVELキャッシュアーカイブの圧縮レベルdefaultfastestfastdefaultslowslowest

tarzstd形式は、zipよりも優れた圧縮率を提供する、Zstandard圧縮でTARを使用します。圧縮レベルの範囲は、fastest(最大速度を実現するための最小圧縮)からslowest(最小ファイルサイズを実現するための最大圧縮)です。defaultレベルは、圧縮率と速度のバランスの取れたトレードオフを提供します。

例:

job:
  variables:
    CACHE_COMPRESSION_FORMAT: tarzstd
    CACHE_COMPRESSION_LEVEL: fast

キャッシュメカニズムは、事前署名付きURLを使用してキャッシュをアップロードおよびダウンロードします。GitLab Runnerがそれ自体のインスタンスでURLに署名します。ジョブのスクリプト(キャッシュのアップロード/ダウンロードスクリプトを含む)がローカルマシンまたは外部マシンで実行されるかどうかは関係ありません。たとえば、shell executorやdocker executorは、GitLab Runnerプロセスが実行されているマシンでスクリプトを実行します。一方でvirtualboxdocker+machineは、別のVMに接続してスクリプトを実行します。このプロセスは、キャッシュアダプターの認証情報が漏洩する可能性を最小限に抑えるというセキュリティ上の理由によるものです。

S3キャッシュアダプターがIAMインスタンスプロファイルを使用するように設定されている場合、このアダプターはGitLab Runnerマシンに接続されているプロファイルを使用します。GCSキャッシュアダプターCredentialsFileを使用するように設定されている場合も同様です。このファイルがGitLab Runnerマシンに存在している必要があります。

次の表に、config.tomlregisterのCLIオプションおよび環境変数を示します。これらの環境変数を定義すると、新しいGitLab Runnerを登録した後に、値がconfig.tomlに保存されます。

config.tomlからS3の認証情報を省略し、環境変数から静的な認証情報を読み込む場合は、AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYを定義できます。詳細については、AWS SDKデフォルト認証情報チェーンセクションを参照してください。

設定TOMLフィールドregisterのCLIオプションregisterの環境変数
Type[runners.cache] -> Type--cache-type$CACHE_TYPE
Path[runners.cache] -> Path--cache-path$CACHE_PATH
Shared[runners.cache] -> Shared--cache-shared$CACHE_SHARED
S3.ServerAddress[runners.cache.s3] -> ServerAddress--cache-s3-server-address$CACHE_S3_SERVER_ADDRESS
S3.AccessKey[runners.cache.s3] -> AccessKey--cache-s3-access-key$CACHE_S3_ACCESS_KEY
S3.SecretKey[runners.cache.s3] -> SecretKey--cache-s3-secret-key$CACHE_S3_SECRET_KEY
S3.SessionToken[runners.cache.s3] -> SessionToken--cache-s3-session-token$CACHE_S3_SESSION_TOKEN
S3.BucketName[runners.cache.s3] -> BucketName--cache-s3-bucket-name$CACHE_S3_BUCKET_NAME
S3.BucketLocation[runners.cache.s3] -> BucketLocation--cache-s3-bucket-location$CACHE_S3_BUCKET_LOCATION
S3.Insecure[runners.cache.s3] -> Insecure--cache-s3-insecure$CACHE_S3_INSECURE
S3.AuthenticationType[runners.cache.s3] -> AuthenticationType--cache-s3-authentication_type$CACHE_S3_AUTHENTICATION_TYPE
S3.ServerSideEncryption[runners.cache.s3] -> ServerSideEncryption--cache-s3-server-side-encryption$CACHE_S3_SERVER_SIDE_ENCRYPTION
S3.ServerSideEncryptionKeyID[runners.cache.s3] -> ServerSideEncryptionKeyID--cache-s3-server-side-encryption-key-id$CACHE_S3_SERVER_SIDE_ENCRYPTION_KEY_ID
S3.DualStack[runners.cache.s3] -> DualStack--cache-s3-dual-stack$CACHE_S3_DUAL_STACK
S3.Accelerate[runners.cache.s3] -> Accelerate--cache-s3-accelerate$CACHE_S3_ACCELERATE
S3.PathStyle[runners.cache.s3] -> PathStyle--cache-s3-path-style$CACHE_S3_PATH_STYLE
S3.RoleARN[runners.cache.s3] -> RoleARN--cache-s3-role-arn$CACHE_S3_ROLE_ARN
S3.UploadRoleARN[runners.cache.s3] -> UploadRoleARN--cache-s3-upload-role-arn$CACHE_S3_UPLOAD_ROLE_ARN
GCS.AccessID[runners.cache.gcs] -> AccessID--cache-gcs-access-id$CACHE_GCS_ACCESS_ID
GCS.PrivateKey[runners.cache.gcs] -> PrivateKey--cache-gcs-private-key$CACHE_GCS_PRIVATE_KEY
GCS.CredentialsFile[runners.cache.gcs] -> CredentialsFile--cache-gcs-credentials-file$GOOGLE_APPLICATION_CREDENTIALS
GCS.BucketName[runners.cache.gcs] -> BucketName--cache-gcs-bucket-name$CACHE_GCS_BUCKET_NAME
Azure.AccountName[runners.cache.azure] -> AccountName--cache-azure-account-name$CACHE_AZURE_ACCOUNT_NAME
Azure.AccountKey[runners.cache.azure] -> AccountKey--cache-azure-account-key$CACHE_AZURE_ACCOUNT_KEY
Azure.ContainerName[runners.cache.azure] -> ContainerName--cache-azure-container-name$CACHE_AZURE_CONTAINER_NAME
Azure.StorageDomain[runners.cache.azure] -> StorageDomain--cache-azure-storage-domain$CACHE_AZURE_STORAGE_DOMAIN

キャッシュキーの処理

GitLab Runner 18.4.0以降では、FF_HASH_CACHE_KEYS 機能フラグを使用してキャッシュキーにハッシュを付けることができます。

FF_HASH_CACHE_KEYSがオフになっている場合(デフォルト)、GitLab Runnerはキャッシュキーをサニタイズしてから、ローカルのキャッシュファイルとストレージバケット内のオブジェクトの両方のパスをビルドするために使用します。サニタイズによってキャッシュキーが変更された場合、GitLab Runnerはこの変更をログに記録します。GitLab Runnerがキャッシュキーをサニタイズできない場合、これもログに記録し、この特定のキャッシュは使用しません。

この機能フラグをオンにすると、GitLab Runnerはキャッシュキーにハッシュを付けてから、ローカルのキャッシュアーティファクトとリモートストレージバケット内のオブジェクトのパスをビルドするために使用します。GitLab Runnerは、キャッシュキーをサニタイズしません。どのキャッシュキーが特定のキャッシュアーティファクトを作成したかを理解できるように、GitLab Runnerはメタデータを添付します:

  • ローカルのキャッシュアーティファクトの場合、GitLab Runnerは、キャッシュアーティファクトcache.zipの横にmetadata.jsonファイルを配置し、次のコンテンツを含めます:

    {"cachekey": "the human readable cache key"}
  • 分散キャッシュのキャッシュアーティファクトの場合、GitLab Runnerはメタデータをストレージオブジェクトblobに直接添付し、キーcachekeyを付与します。クラウドプロバイダーのメカニズムを使用してクエリできます。例については、AWS S3のユーザー定義オブジェクトメタデータを参照してください。

FF_HASH_CACHE_KEYSを変更すると、ハッシュでキャッシュキーによってキャッシュアーティファクトの名前と場所が変更されるため、GitLab Runnerは既存のキャッシュアーティファクトを無視します。この変更は、FF_HASH_CACHE_KEYS=trueからFF_HASH_CACHE_KEYS=false、およびその逆に、両方向に適用されます。

分散キャッシュを共有する複数のRunnerを実行しているが、FF_HASH_CACHE_KEYSの設定が異なる場合、キャッシュアーティファクトは共有されません。

したがって、ベストプラクティスは次のとおりです:

  • 分散キャッシュを共有するRunner間でFF_HASH_CACHE_KEYSを同期した状態に保ちます。

  • FF_HASH_CACHE_KEYSを変更した後、キャッシュミス、キャッシュアーティファクトの再ビルド、および最初のジョブの実行時間が長くなることを想定します。

FF_HASH_CACHE_KEYSをオンにしても、(ヘルパーイメージを以前のバージョンに固定したなどの理由で)以前のバージョンのヘルパーバイナリを実行すると、キャッシュキーへのハッシュの適用と、キャッシュのアップロードまたはダウンロードは引き続き機能します。ただし、GitLab Runnerはキャッシュアーティファクトのメタデータを保持しません。

[runners.cache.s3]セクション

次のパラメータは、キャッシュ用のS3ストレージを定義します。

パラメータ説明
ServerAddress文字列S3互換サーバーのhost:port。AWS以外のサーバーを使用している場合は、ストレージ製品のドキュメントを参照して、正しいアドレスを確認してください。DigitalOceanの場合、アドレスの形式はspacename.region.digitaloceanspaces.comである必要があります。
AccessKey文字列S3インスタンス用に指定されたアクセスキー。
SecretKey文字列S3インスタンス用に指定されたシークレットキー。
SessionToken文字列一時的な認証情報を使用する場合に、S3インスタンス用に指定されたセッショントークン。
BucketName文字列キャッシュが保存されるストレージバケットの名前。
BucketLocation文字列S3リージョンの名前。
Insecureブール値S3サービスがHTTPで利用可能な場合は、trueに設定します。デフォルトはfalseです。
AuthenticationType文字列iamまたはaccess-keyに設定します。ServerAddressAccessKey、およびSecretKeyがすべて指定されている場合、デフォルトはaccess-keyです。ServerAddressAccessKey、またはSecretKeyが指定されていない場合、デフォルトはiamです。
ServerSideEncryption文字列S3で使用するサーバー側の暗号化の種類。GitLab 15.3以降で使用可能な種類は、S3またはKMSです。GitLab 17.5以降では、DSSE-KMSがサポートされています。
ServerSideEncryptionKeyID文字列KMSを使用する場合に暗号化に使用されるKMSキーのエイリアス、ID、またはAmazonリソースネーム。エイリアスを使用する場合は、alias/をプレフィックスとして付けます。クロスアカウントシナリオでは、ARN形式を使用します。GitLab 15.3以降で利用可能です。
DualStackブール値IPv4およびIPv6エンドポイントを有効にします。デフォルトはtrueです。AWS S3 Expressを使用している場合は、この設定を無効にしてください。ServerAddressを設定すると、GitLabはこの設定を無視します。GitLab 17.5以降で利用可能です。
Accelerateブール値AWS S3 Transfer Acceleration(転送高速化)を有効にします。ServerAddressがAccelerated(高速化)エンドポイントとして設定されている場合、GitLabは自動的にこれをtrueに設定します。GitLab 17.5以降で利用可能です。
PathStyleブール値パス形式のアクセスを有効にします。デフォルトでは、GitLabはServerAddressの値に基づいてこの設定を自動的に検出します。GitLab 17.5以降で利用可能です。
UploadRoleARN文字列非推奨。代わりにRoleARNを使用してください。時間制限付きのPutObject S3リクエストを生成するためにAssumeRoleで使用できるAWSロールARNを指定します。S3マルチパートアップロードを有効にします。GitLab 17.5以降で利用可能です。
RoleARN文字列時間制限付きのGetObjectPutObject S3リクエストを生成するためにAssumeRoleで使用できるAWSロールARNを指定します。S3マルチパート転送を有効にします。GitLab 17.8以降で利用可能です。

例:

[runners.cache]
  Type = "s3"
  Path = "path/to/prefix"
  Shared = false
  [runners.cache.s3]
    ServerAddress = "s3.amazonaws.com"
    AccessKey = "AWS_S3_ACCESS_KEY"
    SecretKey = "AWS_S3_SECRET_KEY"
    BucketName = "runners-cache"
    BucketLocation = "eu-west-1"
    Insecure = false
    ServerSideEncryption = "KMS"
    ServerSideEncryptionKeyID = "alias/my-key"

認証

GitLab Runnerは、設定に基づいてS3に異なる認証方法を使用します。

静的な認証情報

Runnerは、次の場合に静的アクセスキー認証を使用します:

  • ServerAddressAccessKey、およびSecretKeyパラメータが仕様されていますが、AuthenticationTypeは提供されていません。
  • AuthenticationType = "access-key"が明示的に設定されています。

AWS SDKのデフォルト認証情報チェーン

Runnerは、次の場合にAWS SDKのデフォルト認証情報チェーンを使用します:

  • ServerAddressAccessKey、またはSecretKeyのいずれかが省略され、AuthenticationTypeが提供されていません。
  • AuthenticationType = "iam"が明示的に設定されています。

この認証情報チェーンは、次の順序で認証を試みます:

  1. 環境変数(AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY
  2. 共有認証情報ファイル(~/.aws/credentials
  3. IAMインスタンスプロファイル(EC2インスタンスの場合)
  4. SDKでサポートされている他のAWS認証情報ソース

RoleARNが仕様されていない場合、デフォルトの認証情報チェーンはRunnerマネージャーによって実行されます。これは、ビルドが実行されるマシンと同じマシン上にあるとは限りません。たとえば、オートスケールするの設定では、ジョブは別のマシンで実行されます。同様に、Kubernetesエグゼキューターを使用すると、ビルドポッドもRunnerマネージャーとは異なるノードで実行できます。この動作により、Runnerマネージャーにのみバケットレベルのアクセス権を付与できます。

RoleARNが仕様されている場合、認証情報はヘルパーイメージの実行コンテキスト内で解決されます。詳細については、RoleARNを参照してください。

Helmチャートを使用してGitLab Runnerをインストールし、rbac.createvalues.yamlファイルでtrueに設定されている場合、サービスアカウントが作成されます。サービスアカウントの注釈は、rbac.serviceAccountAnnotationsセクションから取得されます。

Amazon EKSのRunnerの場合、サービスアカウントに割り当てるIAMロールを指定できます。必要な特定のアノテーションはeks.amazonaws.com/role-arn: arn:aws:iam::<ACCOUNT_ID>:role/<IAM_ROLE_NAME>です。

このロールのIAMポリシーには、指定されたバケットに対して次のアクションを実行する権限が必要です。

  • s3:PutObject
  • s3:GetObjectVersion
  • s3:GetObject
  • s3:DeleteObject
  • s3:ListBucket

KMSタイプのServerSideEncryptionを使用する場合、このロールには、指定されたAWS KMSキーに対して次のアクションを実行する権限も必要です。

  • kms:Encrypt
  • kms:Decrypt
  • kms:ReEncrypt*
  • kms:GenerateDataKey*
  • kms:DescribeKey

SSE-CタイプのServerSideEncryptionはサポートされていません。SSE-Cでは、事前署名付きURLに加えて、ユーザー提供のキーを含むヘッダーをダウンロードリクエストに対して指定する必要があります。これは、ジョブにキーマテリアルを渡すことになり、キーの安全を保証できません。これにより、復号化キーが漏洩する可能性があります。この問題に関するディスカッションについては、このマージリクエストを参照してください。

AWS S3キャッシュにアップロードできる単一ファイルの最大サイズは5 GBです。この動作に対する潜在的な回避策についてのディスカッションについては、このイシューを参照してください。

Runnerキャッシュ用のS3バケットでKMSキー暗号化を使用する

GenerateDataKey APIはKMS対称キーを使用して、クライアント側の暗号化(https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html)用のデータキーを作成します。KMSキーの正しい設定は次のとおりです。

属性説明
キータイプ対称
生成元AWS_KMS
キー仕様SYMMETRIC_DEFAULT
キーの用途暗号化と復号化

rbac.serviceAccountNameで定義されたServiceAccountに割り当てられたロールのIAMポリシーには、KMSキーに対して次のアクションを実行する権限が必要です。

  • kms:GetPublicKey
  • kms:Decrypt
  • kms:Encrypt
  • kms:DescribeKey
  • kms:GenerateDataKey

RoleARNでマルチパート転送を有効にする

キャッシュへのアクセスを制限するために、Runnerマネージャーは時間制限のある事前署名付きURLを生成し、ジョブがキャッシュからのダウンロードやキャッシュへアップロードを行えるようにします。ただし、AWS S3では1つのPUTリクエストが5 GBに制限されています。5 GBを超えるファイルの場合は、マルチパートアップロードAPIを使用する必要があります。

マルチパート転送は、AWS S3でのみサポートされており、他のS3プロバイダーではサポートされていません。Runnerマネージャーはさまざまなプロジェクトのジョブを処理することから、バケット全体の権限を含むS3認証情報を渡すことができません。代わりに、Runnerマネージャーは時間制限のある事前署名付きURLと範囲が限定された認証情報を使用して、特定のオブジェクトへのアクセスを制限します。

AWSでS3マルチパート転送を使用するには、RoleARNarn:aws:iam:::<ACCOUNT ID>:<YOUR ROLE NAME>形式でIAMロールを指定します。このロールは、バケット内の特定のblobへの書き込みに限定された、時間制限のあるAWS認証情報を生成します。元のS3認証情報が、指定されたRoleARNAssumeRoleにアクセスできることを確認してください。

RoleARNで指定されたIAMロールには、次の権限が必要です。

  • BucketNameで指定されたバケットへのs3:GetObjectアクセス権。
  • BucketNameで指定されたバケットへのs3:PutObjectアクセス権。
  • BucketNameで指定されたバケットへのs3:ListBucketアクセス権。
  • KMSまたはDSSE-KMSを使用したサーバー側の暗号化が有効になっている場合は、kms:Decryptkms:GenerateDataKey権限。

たとえば、ARN arn:aws:iam::1234567890123:role/my-instance-roleを持つEC2インスタンスにmy-instance-roleという名前のIAMロールが添付されているとします。

この場合、BucketNameに対してs3:PutObject権限のみを持つ新しいロールarn:aws:iam::1234567890123:role/my-upload-roleを作成できます。my-instance-roleのAWS設定では、Trust relationshipsは次のようになります。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::1234567890123:role/my-upload-role"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

my-instance-roleRoleARNとして再利用して、新しいロールの作成を回避することもできます。その場合は、my-instance-roleAssumeRole権限があることを確認してください。たとえば、EC2インスタンスに関連付けられているIAMプロファイルのTrust relationshipsは次のようになります。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "ec2.amazonaws.com",
                "AWS": "arn:aws:iam::1234567890123:role/my-instance-role"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

AWSコマンドラインインターフェースを使用して、インスタンスにAssumeRole権限があることを確認できます。例:

aws sts assume-role --role-arn arn:aws:iam::1234567890123:role/my-upload-role --role-session-name gitlab-runner-test1
RoleARNによるアップロードの仕組み

RoleARNが設定されている場合、Runnerがキャッシュにアップロードするたびに次の処理が行われます。

  1. Runnerマネージャーは、(AuthenticationTypeAccessKeySecretKeyで指定された)元のS3認証情報を取得します。

  2. RunnerマネージャーはこのS3認証情報を使用して、Amazon Security Token Service(STS)にRoleARNを使ったAssumeRoleのリクエストを送信します。ポリシーリクエストは次のようになります。

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": ["s3:PutObject"],
                "Resource": "arn:aws:s3:::<YOUR-BUCKET-NAME>/<CACHE-FILENAME>"
            }
        ]
    }
  3. リクエストが成功した場合、Runnerマネージャーは制限付きセッションで一時的なAWS認証情報を取得します。

  4. Runnerマネージャーは、これらの認証情報とURLをs3://<bucket name>/<filename>形式でキャッシュアーカイバーに渡し、キャッシュアーカイバーがファイルをアップロードします。

Kubernetes ServiceAccountリソース用のIAMロールを有効にする

サービスアカウントにIAMロールを使用するには、IAM OIDCプロバイダーがクラスター用に存在する必要があります。IAM OIDCプロバイダーがクラスターに関連付けられたら、IAMロールを作成してRunnerのサービスアカウントに関連付けることができます。

  1. Create Role(ロール作成)画面のSelect type of trusted entity(信頼されたエンティティのタイプを選択)で、Web Identity(Web ID)を選択します。

  2. ロールのTrusted Relationships(信頼関係)タブで次のようにします。

    • Trusted entities(信頼されたエンティティ)セクションの形式はarn:aws:iam::<ACCOUNT_ID>:oidc-provider/oidc.eks.<AWS_REGION>.amazonaws.com/id/<OIDC_ID>である必要があります。OIDC IDは、Amazon EKSクラスターのConfiguration(設定)タブにあります。

    • Condition(条件)セクションには、rbac.serviceAccountNameで定義されたGitLab Runnerサービスアカウント、またはrbac.createtrueに設定されている場合に作成されるデフォルトのサービスアカウントが必要です。

      条件キー
      StringEqualsoidc.eks.<AWS_REGION>.amazonaws.com/id/<OIDC_ID>:subsystem:serviceaccount:<GITLAB_RUNNER_NAMESPACE>:<GITLAB_RUNNER_SERVICE_ACCOUNT>

S3 Express One Zoneバケットを使用する

Runnerマネージャーが1つの特定のオブジェクトに対するアクセスを制限できないため、S3 Express One ZoneディレクトリバケットはRoleARNでは機能しません

  1. Amazonのチュートリアルに従って、S3 Express One Zoneバケットを設定します。
  2. BucketNameBucketLocationを使用してconfig.tomlを設定します。
  3. S3 Expressはデュアルスタックエンドポイントをサポートしていないため、DualStackfalseに設定します。

config.tomlの例

[runners.cache]
  Type = "s3"
  [runners.cache.s3]
    BucketName = "example-express--usw2-az1--x-s3"
    BucketLocation = "us-west-2"
    DualStack = false

[runners.cache.gcs]セクション

次のパラメータは、Google Cloud Storageのネイティブサポートを定義します。これらの値の詳細については、Google Cloud Storage(GCS)の認証に関するドキュメントを参照してください。

パラメータ説明
CredentialsFile文字列Google JSONキーファイルのパス。service_accountタイプのみがサポートされています。設定されている場合、この値はconfig.tomlで直接設定されたAccessIDPrivateKeyよりも優先されます。
AccessID文字列ストレージへのアクセスに使用されるGCPサービスアカウントのID。
PrivateKey文字列GCSリクエストの署名に使用される秘密キー。
BucketName文字列キャッシュが保存されるストレージバケットの名前。

例:

config.tomlファイルで直接設定された認証情報

[runners.cache]
  Type = "gcs"
  Path = "path/to/prefix"
  Shared = false
  [runners.cache.gcs]
    AccessID = "cache-access-account@test-project-123456.iam.gserviceaccount.com"
    PrivateKey = "-----BEGIN PRIVATE KEY-----\nXXXXXX\n-----END PRIVATE KEY-----\n"
    BucketName = "runners-cache"

GCPからダウンロードしたJSONファイル内の認証情報

[runners.cache]
  Type = "gcs"
  Path = "path/to/prefix"
  Shared = false
  [runners.cache.gcs]
    CredentialsFile = "/etc/gitlab-runner/service-account.json"
    BucketName = "runners-cache"

GCPのメタデータサーバーからのアプリケーションデフォルト認証情報(ADC)

GitLab RunnerとGoogle Cloud ADCを使用する場合、通常はデフォルトのサービスアカウントを使用します。その場合、インスタンスの認証情報を提供する必要はありません。

[runners.cache]
  Type = "gcs"
  Path = "path/to/prefix"
  Shared = false
  [runners.cache.gcs]
    BucketName = "runners-cache"

ADCを使用する場合は、使用するサービスアカウントにiam.serviceAccounts.signBlob権限があることを確認してください。通常、これはサービスアカウントトークン作成者のロールをサービスアカウントに付与することで行われます。

GKEのワークロードアイデンティティフェデレーション

GKEのワークロードアイデンティティフェデレーションは、アプリケーションデフォルト認証情報(ADC)でサポートされています。ワークロードアイデンティティが機能しないイシューが発生した場合:

  • ERROR: generating signed URLメッセージについては、Runnerポッドログ(ビルドログではなく)を確認してください。このエラーは、次のようなパーミッションのイシューを示している可能性があります:

    IAM returned 403 Forbidden: Permission 'iam.serviceAccounts.getAccessToken' denied on resource (or it may not exist).
  • Runnerポッド内から次のcurlコマンドを試してください:

    curl -H "Metadata-Flavor: Google" http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/email

    このコマンドは、正しいKubernetesサービスアカウントを返すはずです。次に、アクセストークンを取得してみてください:

    curl -H "Metadata-Flavor: Google" http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/token?scopes=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcloud-platform

    コマンドが成功すると、結果はアクセストークンを含むJSONペイロードを返します。失敗した場合は、サービスアカウントの権限を確認してください。

[runners.cache.azure]セクション

次のパラメータは、Azure Blob Storageのネイティブサポートを定義します。詳細については、Azure Blob Storageのドキュメントを参照してください。S3やGCSではオブジェクトの集合にbucketという用語が使用されていますが、Azureではblobの集合にcontainerが使用されています。

パラメータ説明
AccountName文字列ストレージへのアクセスに使用するAzure Blob Storageアカウントの名前。
AccountKey文字列コンテナへのアクセスに使用するストレージアカウントのアクセスキー。設定からAccountKeyを省略するには、AzureワークロードまたはマネージドIDを使用します。
ContainerName文字列キャッシュデータを保存するストレージコンテナの名前。
StorageDomain文字列Azureストレージエンドポイントのサービスに使用されるドメイン名(オプション)。デフォルトはblob.core.windows.netです。

例:

[runners.cache]
  Type = "azure"
  Path = "path/to/prefix"
  Shared = false
  [runners.cache.azure]
    AccountName = "<AZURE STORAGE ACCOUNT NAME>"
    AccountKey = "<AZURE STORAGE ACCOUNT KEY>"
    ContainerName = "runners-cache"
    StorageDomain = "blob.core.windows.net"

AzureワークロードIDとマネージドID

AzureワークロードまたはマネージドIDを使用するには、設定からAccountKeyを省略します。AccountKeyが空白の場合、Runnerは次の処理を試みます。

  1. DefaultAzureCredentialを使用して一時的な認証情報を取得します。
  2. ユーザー委任キーを取得します。
  3. そのキーを使用して、ストレージアカウントのblobにアクセスするためのSASトークンを生成します。

インスタンスにStorage Blob Data Contributorロールが割り当てられていることを確認します。上記のアクションを実行するためのアクセス権がインスタンスにない場合、GitLab RunnerはAuthorizationPermissionMismatchエラーを報告します。

AzureワークロードIDを使用するには、IDに関連付けられているservice_accountを追加し、ポッドラベルazure.workload.identity/userunner.kubernetesセクションに追加します。たとえば、service_accountgitlab-runnerの場合は次のようになります。

  [runners.kubernetes]
    service_account = "gitlab-runner"
    [runners.kubernetes.pod_labels]
      "azure.workload.identity/use" = "true"

service_accountに、azure.workload.identity/client-idアノテーションが関連付けられていることを確認します。

serviceAccount:
  annotations:
    azure.workload.identity/client-id: <YOUR CLIENT ID HERE>

GitLab 17.7以降では、ワークロードIDのセットアップにはこの設定で十分です。

ただし、GitLab Runner 17.5および17.6では、Runnerマネージャーにも以下の設定が必要です。

  • azure.workload.identity/useポッドラベル
  • ワークロードIDで使用するサービスアカウント

たとえば、GitLab Runner Helmチャートを使用する場合は次のようになります。

serviceAccount:
  name: "gitlab-runner"
podLabels:
  azure.workload.identity/use: "true"

認証情報は異なるソースから取得されるため、このラベルが必要です。キャッシュのダウンロードの場合、認証情報はRunnerマネージャーから取得されます。キャッシュのアップロードの場合、認証情報はヘルパーイメージを実行するポッドから取得されます。

詳細については、イシュー38330を参照してください。

[runners.kubernetes]セクション

次の表に、Kubernetes executorで使用できる設定パラメータを示します。その他のパラメータについては、Kubernetes executorのドキュメントを参照してください。

パラメータ説明
host文字列オプション。KubernetesホストのURL。指定されていない場合、Runnerは自動検出を試みます。
cert_file文字列オプション。Kubernetes認証証明書。
key_file文字列オプション。Kubernetes認証秘密キー。
ca_file文字列オプション。Kubernetes認証CA証明書。
image文字列ジョブでコンテナイメージが指定されていない場合に使用するデフォルトのコンテナイメージ。
allowed_images配列.gitlab-ci.ymlで許可されるコンテナイメージのワイルドカードリスト。この設定が存在しない場合は、すべてのイメージが許可されます(["*/*:*"]と同等)。Docker executorまたはKubernetes executorで使用します。
allowed_services配列.gitlab-ci.ymlで許可されるサービスのワイルドカードリスト。この設定が存在しない場合は、すべてのイメージが許可されます(["*/*:*"]と同等)。Docker executorまたはKubernetes executorで使用します。
namespace文字列Kubernetesジョブを実行するネームスペース。
privilegedブール値特権フラグを有効にしてすべてのコンテナを実行します。
allow_privilege_escalationブール値オプション。allowPrivilegeEscalationフラグを有効にしてすべてのコンテナを実行します。
node_selectorテーブルstring=stringkey=valueペアのtable。ポッドの作成が、すべてのkey=valueペアに一致するKubernetesノードに制限されます。
image_pull_secrets配列プライベートレジストリからのコンテナイメージのプル認証に使用されるKubernetesのdocker-registryシークレット名を含む項目の配列。
logs_base_dir文字列ビルドログを保存するために生成されたパスの前に付加されるベースディレクトリ。GitLab Runner 17.2で導入されました。
scripts_base_dir文字列ビルドスクリプトを保存するために生成されたパスの前に付加されるベースディレクトリ。GitLab Runner 17.2で導入されました。
service_account文字列ジョブ/executorポッドがKubernetes APIと通信するために使用するデフォルトのサービスアカウント。

例:

[runners.kubernetes]
  host = "https://45.67.34.123:4892"
  cert_file = "/etc/ssl/kubernetes/api.crt"
  key_file = "/etc/ssl/kubernetes/api.key"
  ca_file = "/etc/ssl/kubernetes/ca.crt"
  image = "golang:1.8"
  privileged = true
  allow_privilege_escalation = true
  image_pull_secrets = ["docker-registry-credentials", "optional-additional-credentials"]
  allowed_images = ["ruby:*", "python:*", "php:*"]
  allowed_services = ["postgres:9.4", "postgres:latest"]
  logs_base_dir = "/tmp"
  scripts_base_dir = "/tmp"
  [runners.kubernetes.node_selector]
    gitlab = "true"

ヘルパーイメージ

dockerdocker+machine、またはkubernetes executorを使用すると、GitLab RunnerはGit、アーティファクト、およびキャッシュ操作の処理に特定のコンテナを使用します。このコンテナは、helper imageという名前のイメージから作成されます。

ヘルパーイメージは、amd64、ARM、arm64、s390x、ppc64le、およびriscv64アーキテクチャで使用できます。これには、GitLab Runnerバイナリの特別なコンパイルであるgitlab-runner-helperバイナリが含まれています。これには、利用可能なコマンドのサブセットと、Git、Git LFS、およびSSL証明書ストアのみが含まれています。

ヘルパーイメージには、alpinealpine3.21alpine-latestubi-fipsubuntuのようないくつかの種類があります。alpineイメージはフットプリントが小さいため、デフォルトです。helper_image_flavor = "ubuntu"を使用すると、ヘルパーイメージのubuntuフレーバーが選択されます。

GitLab Runner 16.1から17.1では、alpineフレーバーはalpine3.18のエイリアスです。GitLab Runner 17.2から17.6では、alpine3.19のエイリアスです。GitLab Runner 17.7以降では、alpine3.21のエイリアスとなっています。GitLab Runner 18.4以降では、alpine-latestのエイリアスです。

alpine-latestフレーバーは、alpine:latestをベースイメージとして使用し、新しいアップストリームのバージョンがリリースされると、自動的にバージョンが上がります。

GitLab RunnerがDEBパッケージまたはRPMパッケージからインストールされると、サポートされているアーキテクチャ用のイメージがホストにインストールされます。Docker Engineが指定されたイメージバージョンを見つけられない場合、Runnerはジョブを実行する前に自動的にダウンロードします。docker executorとdocker+machine executorの両方がこのように動作します。

alpineフレーバーの場合、デフォルトのalpineフレーバーイメージのみがパッケージに含まれています。その他すべてのフレーバーは、レジストリからダウンロードされます。

GitLab Runnerの手動インストールとkubernetes executorは異なる動作をします。

  • 手動インストールの場合は、gitlab-runner-helperバイナリは含まれていません。
  • kubernetes executorの場合、Kubernetes APIはgitlab-runner-helperイメージをローカルアーカイブから読み込むことを許可しません。

いずれの場合も、GitLab Runnerはヘルパーイメージをダウンロードします。GitLab Runnerのリビジョンとアーキテクチャによって、ダウンロードするタグが決まります。

Arm上のKubernetes用ヘルパーイメージ設定

既定では、アーキテクチャに適したヘルパーイメージが選択されます。arm64 Kubernetesクラスターでarm64ヘルパーイメージを使用するためにカスタムhelper_imageパスを設定する必要がある場合は、設定ファイルで次の値を設定します:

[runners.kubernetes]
  helper_image = "my.registry.local/gitlab/gitlab-runner-helper:arm64-v${CI_RUNNER_VERSION}"

古いバージョンのAlpine Linuxを使用するRunnerイメージ

イメージは、複数のAlpine Linuxバージョンでビルドされています。新しいバージョンのAlpineを使用できますが、同時に古いバージョンも使用できます。

ヘルパーイメージの場合は、helper_image_flavorを変更するか、ヘルパーイメージセクションを参照してください。

GitLab Runnerイメージの場合は、alpinealpine3.19alpine3.21、またはalpine-latestがバージョンの前にイメージのプレフィックスとして使用されるように、同じロジックに従ってください:

docker pull gitlab/gitlab-runner:alpine3.19-v16.1.0

Alpine pwshイメージ

GitLab Runner 16.1以降、すべてのalpineヘルパーイメージにはpwshバリアントがあります。唯一の例外はalpine-latestです。これは、GitLab Runnerヘルパーイメージのベースとなるpowershell Dockerイメージalpine:latestをサポートしていないためです。

例:

docker pull registry.gitlab.com/gitlab-org/gitlab-runner/gitlab-runner-helper:alpine3.21-x86_64-v17.7.0-pwsh

ヘルパーイメージレジストリ

GitLab 15.0以前では、Docker Hubのイメージを使用するようにヘルパーイメージを設定します。

GitLab 15.1以降では、ヘルパーイメージは、GitLab.com上のGitLab Containerレジストリからregistry.gitlab.com/gitlab-org/gitlab-runner/gitlab-runner-helper:x86_64-v${CI_RUNNER_VERSION}でプルされます。GitLab Self-Managedインスタンスも、既定でGitLab.com上のGitLab Containerレジストリからヘルパーイメージをプルします。GitLab.com上のGitLab Containerレジストリのステータスを確認するには、GitLabシステムのステータスを参照してください。

ヘルパーイメージを上書きする

場合によっては、次の理由でヘルパーイメージを上書きする必要があります。

  1. ジョブ実行の高速化: インターネット接続の速度が遅い環境では、同じイメージを複数回ダウンロードすると、ジョブの実行に時間がかかる可能性があります。registry.gitlab.com/gitlab-org/gitlab-runner/gitlab-runner-helper:XYZの正確なコピーが保存されているローカルレジストリからヘルパーイメージをダウンロードすることで、処理を高速化できます。

  2. セキュリティに関する懸念: 事前にチェックされていない外部依存関係をダウンロードしたくない場合があります。レビューが完了し、ローカルリポジトリに保存されている依存関係のみを使用するというビジネスルールが存在する可能性があります。

  3. インターネットにアクセスできないビルド環境: オフライン環境にKubernetesクラスターをインストールしている場合は、ローカルイメージレジストリまたはパッケージリポジトリを使用して、CI/CDジョブで使用されるイメージをプルできます。

  4. 追加のソフトウェア: git+httpの代わりにgit+sshを使用してアクセス可能なサブモジュールをサポートするために、opensshのような追加のソフトウェアをヘルパーイメージにインストールしたい場合があります。

このような場合は、dockerdocker+machine、およびkubernetes executorで利用可能なhelper_image設定フィールドを使用して、カスタムイメージを設定できます。

[[runners]]
  (...)
  executor = "docker"
  [runners.docker]
    (...)
    helper_image = "my.registry.local/gitlab/gitlab-runner-helper:tag"

ヘルパーイメージのバージョンは、GitLab Runnerのバージョンと緊密に結合されていると考えてください。これらのイメージを提供する主な理由の1つは、GitLab Runnerがgitlab-runner-helperバイナリを使用していることです。このバイナリは、GitLab Runnerソースの一部からコンパイルされます。このバイナリは、両方のバイナリで同じであることが期待される内部APIを使用しています。

デフォルトでは、GitLab Runnerはregistry.gitlab.com/gitlab-org/gitlab-runner/gitlab-runner-helper:XYZイメージを参照します。ここで、XYZはGitLab RunnerのアーキテクチャとGitリビジョンに基づいています。バージョン変数のいずれかを使用することによって、イメージバージョンを定義することができます。

[[runners]]
  (...)
  executor = "docker"
  [runners.docker]
    (...)
    helper_image = "my.registry.local/gitlab/gitlab-runner-helper:x86_64-v${CI_RUNNER_VERSION}"

この設定により、GitLab Runnerはexecutorに対し、コンパイルデータに基づくバージョンx86_64-v${CI_RUNNER_VERSION}のイメージを使用するように指示します。GitLab Runnerが新しいバージョンに更新された後で、GitLab Runnerは適切なイメージをダウンロードしようとします。GitLab Runnerをアップグレードする前に、イメージをレジストリにアップロードする必要があります。そうしないと、ジョブが「No such image」(指定されたイメージが見つかりません)エラーで失敗し始めます。

ヘルパーイメージは、$CI_RUNNER_REVISIONに加えて$CI_RUNNER_VERSIONによってタグ付けされます。どちらのタグも有効であり、同じイメージを指しています。

[[runners]]
  (...)
  executor = "docker"
  [runners.docker]
    (...)
    helper_image = "my.registry.local/gitlab/gitlab-runner-helper:x86_64-v${CI_RUNNER_VERSION}"

PowerShell Coreを使用する場合

PowerShell Coreを含むLinux用のヘルパーイメージの追加バージョンは、registry.gitlab.com/gitlab-org/gitlab-runner/gitlab-runner-helper:XYZ-pwshタグを使用して公開されます。

[runners.custom_build_dir]セクション

このセクションでは、カスタムビルドディレクトリパラメータを定義します。

この機能は、明示的に設定されていない場合でも、kubernetesdockerdocker+machinedocker autoscaler、およびinstance executorで、デフォルトで有効になっています。他のすべてのexecutorでは、デフォルトで無効になっています。

この機能を使用するには、runners.builds_dirで定義されたパスにGIT_CLONE_PATHが含まれている必要があります。builds_dirを使用するには、$CI_BUILDS_DIR変数を使用します。

デフォルトでは、この機能はdocker executorとkubernetes executorでのみ有効になっています。これは、これらのexecutorがリソースを分離するのに適した方法を提供するためです。この機能はどのexecutorでも明示的に有効にできますが、builds_dirを共有し、concurrent > 1が設定されたexecutorで使用する場合は注意が必要です。

パラメータ説明
enabledブール値ユーザーがジョブのカスタムビルドディレクトリを定義できるようにします。

例:

[runners.custom_build_dir]
  enabled = true

デフォルトのビルドディレクトリ

GitLab Runnerは、_ビルドディレクトリ_と呼ばれるベースパスの下に存在するパスにリポジトリをクローンします。このベースディレクトリのデフォルトの場所は、executorによって異なります。詳細は以下の説明を参照してください。

  • KubernetesDockerDocker Machine executorの場合は、コンテナ内の/buildsです。
  • Instanceの場合は、ターゲットマシンへのSSH接続またはWinRM接続を処理するように設定されているユーザーのホームディレクトリにある~/buildsです。
  • Docker Autoscalerの場合は、コンテナ内の/buildsです。
  • Shell executorの場合は、$PWD/buildsです。
  • SSHVirtualBoxParallels executorの場合は、ターゲットマシンへのSSH接続を処理するように設定されているユーザーのホームディレクトリにある~/buildsです。
  • Custom executorの場合はデフォルトが提供されていないため、明示的に設定する必要があります。設定されていない場合、ジョブが失敗します。

使用される_ビルドディレクトリ_は、ユーザーがbuilds_dir設定で明示的に定義できます。

カスタムディレクトリにクローンする場合は、GIT_CLONE_PATHを指定することもできます。その場合は以下のガイドラインは適用されません。

GitLab Runnerは、実行するすべてのジョブに_ビルドディレクトリ_を使用しますが、特定のパターン{builds_dir}/$RUNNER_TOKEN_KEY/$CONCURRENT_PROJECT_ID/$NAMESPACE/$PROJECT_NAMEを使用してそれらをネストします。例: /builds/2mn-ncv-/0/user/playground

GitLab Runnerは、ユーザーが_ビルドディレクトリ_に保存することを妨げません。たとえば、CI実行中に使用できるツールを/builds/tools内に保存できます。この操作は極力控えてください。_ビルドディレクトリ_には何も保存しないでください。GitLab Runnerはこの動作を完全に制御する必要があり、そのような場合には安定性が保証されません。CIに必要な依存関係がある場合は、他の場所にインストールする必要があります。

Git設定をクリーンアップする

すべてのビルドの開始時と終了時に、GitLab Runnerはリポジトリとそのサブモジュールから次のファイルを削除します。

  • Gitロックファイル({index,shallow,HEAD,config}.lock
  • post-checkoutフック(hooks/post-checkout

clean_git_configを有効にすると、リポジトリ、そのサブモジュール、およびGitテンプレートディレクトリから、次の追加ファイルまたはディレクトリが削除されます。

  • .git/configファイル
  • .git/hooksディレクトリ

このクリーンアップにより、カスタムGit設定、一時的なGit設定、または潜在的に悪意のあるGit設定がジョブ間でキャッシュされることを防ぎます。

GitLab Runner 17.10より前では、クリーンアップの動作が異なっていました。

  • Gitロックファイルとpost-checkoutフックのクリーンアップは、ジョブの開始時にのみ行われ、終了時には行われませんでした。
  • 他のGit設定(現在はclean_git_configで制御されるようになった設定)は、FF_ENABLE_JOB_CLEANUPが設定されていない場合には削除されませんでした。このフラグを設定すると、メインリポジトリの.git/configのみが削除されますが、サブモジュールの設定は削除されませんでした。

clean_git_config設定はデフォルトでtrueです。ただし、次の場合はデフォルトでfalseです。

明示的なclean_git_config設定は、デフォルト設定よりも優先されます。

[runners.referees]セクション

GitLab Runnerレフェリーを使用して、追加のジョブモニタリングデータをGitLabに渡します。レフェリーは、ジョブに関連する追加データの照会と収集を行うRunnerマネージャーのワーカーです。結果は、ジョブアーティファクトとしてGitLabにアップロードされます。

Metrics Runnerレフェリーを使用する

ジョブを実行しているマシンまたはコンテナがPrometheusメトリクスを公開している場合、GitLab Runnerはジョブ期間全体にわたってPrometheusサーバーに照会できます。受信したメトリクスはジョブアーティファクトとしてアップロードされ、後で分析に使用できます。

docker-machine executorのみがレフェリーをサポートしています。

GitLab Runner用のMetrics Runnerレフェリーを設定する

config.tomlファイルの[[runner]]セクションで[runner.referees][runner.referees.metrics]を定義し、次のフィールドを追加します。

設定説明
prometheus_addressGitLab Runnerインスタンスからメトリクスを収集するサーバー。ジョブの完了時にRunnerマネージャーからアクセスできる必要があります。
query_intervalジョブに関連付けられているPrometheusインスタンスに対し、時系列データが照会を受ける頻度。間隔(秒単位)として定義されます。
queries各間隔で実行されるPromQLクエリの配列。

node_exporterメトリクスの構成を網羅した設定例を次に示します。

[[runners]]
  [runners.referees]
    [runners.referees.metrics]
      prometheus_address = "http://localhost:9090"
      query_interval = 10
      metric_queries = [
        "arp_entries:rate(node_arp_entries{{selector}}[{interval}])",
        "context_switches:rate(node_context_switches_total{{selector}}[{interval}])",
        "cpu_seconds:rate(node_cpu_seconds_total{{selector}}[{interval}])",
        "disk_read_bytes:rate(node_disk_read_bytes_total{{selector}}[{interval}])",
        "disk_written_bytes:rate(node_disk_written_bytes_total{{selector}}[{interval}])",
        "memory_bytes:rate(node_memory_MemTotal_bytes{{selector}}[{interval}])",
        "memory_swap_bytes:rate(node_memory_SwapTotal_bytes{{selector}}[{interval}])",
        "network_tcp_active_opens:rate(node_netstat_Tcp_ActiveOpens{{selector}}[{interval}])",
        "network_tcp_passive_opens:rate(node_netstat_Tcp_PassiveOpens{{selector}}[{interval}])",
        "network_receive_bytes:rate(node_network_receive_bytes_total{{selector}}[{interval}])",
        "network_receive_drops:rate(node_network_receive_drop_total{{selector}}[{interval}])",
        "network_receive_errors:rate(node_network_receive_errs_total{{selector}}[{interval}])",
        "network_receive_packets:rate(node_network_receive_packets_total{{selector}}[{interval}])",
        "network_transmit_bytes:rate(node_network_transmit_bytes_total{{selector}}[{interval}])",
        "network_transmit_drops:rate(node_network_transmit_drop_total{{selector}}[{interval}])",
        "network_transmit_errors:rate(node_network_transmit_errs_total{{selector}}[{interval}])",
        "network_transmit_packets:rate(node_network_transmit_packets_total{{selector}}[{interval}])"
      ]

メトリクスクエリの形式はcanonical_name:query_stringです。クエリ文字列は、実行中に置き換えられる2つの変数をサポートしています。

設定説明
{selector}特定のGitLab RunnerインスタンスによってPrometheusで生成されたメトリクスを選択するlabel_name=label_valueペアに置き換えられます。
{interval}このレフェリーの[runners.referees.metrics]設定のquery_intervalパラメータに置き換えられます。

たとえば、docker-machine executorを使用する共有GitLab Runner環境では、{selector}node=shared-runner-123のようになります。