プロキシの背後でGitLab Runnerを実行する
- プラン: Free、Premium、Ultimate
- 提供形態: GitLab.com、GitLab Self-Managed、GitLab Dedicated
このガイドは、Docker executorでGitLab Runnerをプロキシの背後で動作させることに特化しています。
続行する前に、Dockerがインストールされ、同じマシンにGitLab Runnerがインストールされていることを確認してください。
cntlmの設定
すでに認証なしでプロキシを使用している場合は、このセクションはオプションであり、Dockerの設定に直接スキップできます。cntlmの設定は、認証付きのプロキシの背後にいる場合にのみ必要ですが、いずれにしても使用することをお勧めします。
cntlmはローカルプロキシとして使用できるLinuxプロキシであり、プロキシの詳細を手動で追加するのに比べて、次の2つの大きな利点があります:
- 変更する必要がある認証情報は1つのソースのみ
- 認証情報はDocker Runnerからアクセスできません
cntlmをインストールしたと仮定して、最初に設定する必要があります。
cntlmがdocker0インターフェースをリッスンするようにする
セキュリティを強化し、インターネットから保護するために、cntlmをバインドして、コンテナが到達できるIPアドレスを持つdocker0インターフェースでリッスンします。Dockerホスト上のcntlmにこのアドレスのみにバインドするように指示すると、Dockerコンテナはそれに到達できますが、外部には到達できません。
Dockerが使用しているIPを見つけます:
ip -4 -oneline addr show dev docker0IPアドレスは通常
172.17.0.1です。これをdocker0_interface_ipと呼びましょう。cntlm(/etc/cntlm.conf) の設定ファイルを開きます。ユーザー名、パスワード、ドメイン、プロキシホストを入力し、前の手順で見つけたListenIPアドレスを設定します。次のようになります:Username testuser Domain corp-uk Password password Proxy 10.0.0.41:8080 Proxy 10.0.0.42:8080 Listen 172.17.0.1:3128 # Change to your docker0 interface IP変更を保存して、サービスを再起動します:
sudo systemctl restart cntlm
イメージをダウンロードするためのDockerの設定
以下は、systemdをサポートするOSに適用されます。
プロキシの使用方法については、Dockerドキュメントを参照してください。
サービスファイルは次のようになります:
[Service]
Environment="HTTP_PROXY=http://docker0_interface_ip:3128/"
Environment="HTTPS_PROXY=http://docker0_interface_ip:3128/"GitLab Runner設定へのプロキシ変数の追加
プロキシ変数は、プロキシの背後からGitLab.comに接続できるように、GitLab Runner設定にも追加する必要があります。
このアクションは、上記のプロキシをDockerサービスに追加するのと同じです:
gitlab-runnerサービスのsystemdドロップインディレクトリを作成します:mkdir /etc/systemd/system/gitlab-runner.service.d/etc/systemd/system/gitlab-runner.service.d/http-proxy.confというファイルを作成して、HTTP_PROXY環境変数を追加します:[Service] Environment="HTTP_PROXY=http://docker0_interface_ip:3128/" Environment="HTTPS_PROXY=http://docker0_interface_ip:3128/"GitLab RunnerをGitLab Self-Managedインスタンスのような内部URLに接続するには、
NO_PROXY環境変数の値を設定します。[Service] Environment="HTTP_PROXY=http://docker0_interface_ip:3128/" Environment="HTTPS_PROXY=http://docker0_interface_ip:3128/" Environment="NO_PROXY=gitlab.example.com"ファイルを保存して、変更をフラッシュします:
systemctl daemon-reloadGitLab Runnerを再起動します:
sudo systemctl restart gitlab-runner設定が読み込まれたことを確認します:
systemctl show --property=Environment gitlab-runner以下が表示されるはずです:
Environment=HTTP_PROXY=http://docker0_interface_ip:3128/ HTTPS_PROXY=http://docker0_interface_ip:3128/
Dockerコンテナへのプロキシの追加
Runnerを登録した後、プロキシ設定をDockerコンテナに伝播させることができます(たとえば、git cloneなど)。
これを行うには、/etc/gitlab-runner/config.tomlを編集し、次の内容を[[runners]]セクションに追加する必要があります:
pre_get_sources_script = "git config --global http.proxy $HTTP_PROXY; git config --global https.proxy $HTTPS_PROXY"
environment = ["https_proxy=http://docker0_interface_ip:3128", "http_proxy=http://docker0_interface_ip:3128", "HTTPS_PROXY=docker0_interface_ip:3128", "HTTP_PROXY=docker0_interface_ip:3128"]ここで、docker0_interface_ipはdocker0インターフェースのIPアドレスです。
この例では、特定のプログラムがHTTP_PROXYを予期し、他のプログラムがhttp_proxyを予期するため、小文字と大文字の両方の変数を設定しています。残念ながら、この種の環境変数には標準がありません。
dindサービス使用時のプロキシ設定
Docker-in-Docker executor(dind)を使用する場合、docker:2375,docker:2376をNO_PROXY環境変数で指定する必要がある場合があります。ポートは必須です。そうしないと、docker pushがブロックされます。
dindのdockerdとローカルdockerクライアント間の通信(こちらで説明:https://hub.docker.com/_/docker/)は、ルートのDocker設定に保持されているプロキシ変数を使用します。
これを設定するには、/root/.docker/config.jsonを編集して、完全なプロキシ設定を含める必要があります(例:):
{
"proxies": {
"default": {
"httpProxy": "http://proxy:8080",
"httpsProxy": "http://proxy:8080",
"noProxy": "docker:2375,docker:2376"
}
}
}Docker executorのコンテナに設定を渡すには、$HOME/.docker/config.jsonもコンテナ内に作成する必要があります。これは、たとえば、.gitlab-ci.ymlのbefore_scriptとしてスクリプト化できます:
before_script:
- mkdir -p $HOME/.docker/
- 'echo "{ \"proxies\": { \"default\": { \"httpProxy\": \"$HTTP_PROXY\", \"httpsProxy\": \"$HTTPS_PROXY\", \"noProxy\": \"$NO_PROXY\" } } }" > $HOME/.docker/config.json'または、影響を受けるgitlab-runner(/etc/gitlab-runner/config.toml)の設定で、:
[[runners]]
pre_build_script = "mkdir -p $HOME/.docker/ && echo \"{ \\\"proxies\\\": { \\\"default\\\": { \\\"httpProxy\\\": \\\"$HTTP_PROXY\\\", \\\"httpsProxy\\\": \\\"$HTTPS_PROXY\\\", \\\"noProxy\\\": \\\"$NO_PROXY\\\" } } }\" > $HOME/.docker/config.json"TOMLファイル内で単一の文字列として指定されたシェルを使用してJSONファイルが作成されるため、追加レベルのエスケープ"が必要です。これはYAMLではないため、:をエスケープしないでください。
NO_PROXYリストを拡張する必要がある場合、ワイルドカード*はサフィックスに対してのみ機能し、プレフィックスまたはCIDR表記では機能しません。詳細については、https://github.com/moby/moby/issues/9145およびhttps://unix.stackexchange.com/questions/23452/set-a-network-range-in-the-no-proxy-environment-variableを参照してください。
レート制限されたリクエストの処理
GitLabインスタンスは、悪用を防ぐためにAPIリクエストに対するレート制限があるリバースプロキシの背後にある可能性があります。GitLab RunnerはAPIに複数のリクエストを送信し、これらのレート制限を超える可能性があります。
その結果、GitLab Runnerは、次の再試行ロジックを使用して、レート制限されたシナリオを処理します:
再試行ロジック
GitLab Runnerが429 Too Many Requests応答を受信すると、この再試行シーケンスに従います:
- Runnerは、応答ヘッダーで
RateLimit-ResetTimeヘッダーを確認します。RateLimit-ResetTimeヘッダーには、Wed, 21 Oct 2015 07:28:00 GMTのような有効なHTTP日付(RFC1123)である値が必要です。- ヘッダーが存在し、有効な値がある場合、Runnerは指定された時間まで待機し、別のリクエストを発行します。
RateLimit-ResetTimeヘッダーが無効または欠落している場合、Runnerは応答ヘッダーでRetry-Afterヘッダーを確認します。Retry-Afterヘッダーには、Retry-After: 30のような秒形式の値が必要です。- ヘッダー形式が存在し、有効な値がある場合、Runnerは指定された時間まで待機し、別のリクエストを発行します。
- 両方のヘッダーがないか無効な場合、Runnerはデフォルトの間隔を待機し、別のリクエストを発行します。
Runnerは、失敗したリクエストを最大5回再試行します。すべての再試行が失敗した場合、Runnerは最終応答からのエラーをログに記録します。
サポートされているヘッダー形式
| ヘッダー | 形式 | 例 |
|---|---|---|
RateLimit-ResetTime | HTTP日付(RFC1123) | Wed, 21 Oct 2015 07:28:00 GMT |
Retry-After | 秒 | 30 |
ヘッダーRateLimit-ResetTimeは、すべてのヘッダーキーがhttp.CanonicalHeaderKey関数を介して実行されるため、大文字と小文字が区別されません。