ジョブ実行のスピードアップ
イメージや依存関係をキャッシュすることで、ジョブのパフォーマンスを向上させることができます。
コンテナ用のプロキシを使用します。
を使えば、Dockerイメージのダウンロードにかかる時間を短縮できます:
- GitLab 依存プロキシや
- DockerHubレジストリのミラー
- その他のオープンソースソリューション
GitLab 依存プロキシ
コンテナイメージにより素早くアクセスするために、依存プロキシを使ってコンテナイメージをプロキシすることができます。
Docker Hubレジストリミラー
Docker Hubをミラーリングすることで、ジョブがコンテナイメージにアクセスする時間を短縮することもできます。この結果、レジストリはプルスルーキャッシュとなります。ジョブの実行を高速化するだけでなく、ミラーはDocker Hubの停止やDocker Hubのレート制限に対するインフラストラクチャの耐性を高めることができます。
Dockerデーモンがミラーを使用するように設定されると、ミラーの実行中のインスタンス上のイメージを自動的にチェックします。利用できない場合は、公開Dockerレジストリからイメージを取得し、ローカルに保存してからあなたに返します。
次に同じイメージを要求すると、ローカルのレジストリから取得します。
動作の詳細については、こちらを参照してください。
Docker Hubレジストリのミラーを使用します。
Docker Hubレジストリのミラーを作成します:
- プロキシコンテナレジストリを実行する専用マシンにログインします。
- そのマシンにDocker Engineがインストールされていることを確認します。
-
新しいコンテナレジストリを作成します:
docker run -d -p 6000:5000 \ -e REGISTRY_PROXY_REMOTEURL=https://registry-1.docker.io \ --restart always \ --name registry registry:2
ポート番号 (
6000
) を変更して、別のポートでレジストリを公開することができます。これにより、http
でサーバーが起動します。 TLS (https
) を有効にしたい場合は、公式ドキュメントに従ってください。 -
サーバのIPアドレスを確認してください:
hostname --ip-address
非公開ネットワークのIPアドレスを選択する必要があります。非公開ネットワークは、通常、DigitalOcean、AWS、Azureのような単一のプロバイダ上のマシン間の内部通信のための最速のソリューションです。通常、非公開ネットワークで転送されたデータは、月間の帯域幅制限に適用されません。
Docker HubレジストリにはMY_REGISTRY_IP:6000
からアクセスできます。
新しいレジストリサーバーを使用するように config.toml
を設定できます。
その他のオープンソースソリューション
-
rpardini/docker-registry-proxy
では、GitLab Container Registry を含め、ほとんどのコンテナレジストリをローカルにプロキシすることができます。
ディストリビューションキャッシュを使う
分散キャッシュを使うことで、言語の依存関係をダウンロードする時間を短縮できます。
分散キャッシュを指定するには、キャッシュサーバーを設定し、そのキャッシュサーバーを使用するようにRunnerを設定します。
オートスケーリングを使用している場合は、分散Runnerキャッシュ機能の詳細をご覧ください。
以下のキャッシュサーバーがサポートされています:
- AWS S3
- MinIOまたはその他のS3互換キャッシュサーバー
- Googleクラウドストレージ
- Azure Blobストレージ
GitLab CI/CDキャッシュの依存関係とベストプラクティスについてはこちらをご覧ください。
AWS S3を使う
AWS S3を分散キャッシュとして使用するには、Runnerのconfig.toml
ファイル を編集してS3の場所を指定し、接続のための認証情報を指定します。RunnerがS3エンドポイントへのネットワークパスを持っていることを確認してください。
NATゲートウェイ付きの非公開サブネットを使用する場合、データ転送のコストを節約するために、S3 VPCエンドポイントを有効にすることができます。
MinIOの使用
AWS S3を使用する代わりに、独自のキャッシュストレージを作成できます。
- キャッシュサーバーが動作する専用マシンにログインします。
- そのマシンにDocker Engineがインストールされていることを確認します。
-
Goで書かれたシンプルなS3互換サーバーであるMinIOを起動します:
docker run -d --restart always -p 9005:9000 \ -v /.minio:/root/.minio -v /export:/export \ -e "MINIO_ROOT_USER=<minio_root_username>" \ -e "MINIO_ROOT_PASSWORD=<minio_root_password>" \ --name minio \ minio/minio:latest server /export
キャッシュサーバーを別のポートで公開するには、ポート
9005
を変更します。 -
サーバのIPアドレスを確認してください:
hostname --ip-address
- キャッシュサーバーは
MY_CACHE_IP:9005
で利用可能です。 -
Runnerが使用するバケットを作成します:
sudo mkdir /export/runner
runner
はその場合のバケツの名前です。別のバケットを選択した場合は、別のバケットになります。すべてのキャッシュは/export
ディレクトリに保存されます。 - Runnerを設定する際には、(上記の)
MINIO_ROOT_USER
とMINIO_ROOT_PASSWORD
の値をアクセスキーとシークレットキーとして使用してください。
これで、、新しいキャッシュサーバーを使用するようにconfig.toml
を設定することができます。
Googleクラウドストレージの使用
Google Cloud Platformを分散キャッシュとして使用するには、Runnerのconfig.toml
ファイル を編集して、GCPの場所を指定し、接続用の認証情報を指定します。RunnerがGCSエンドポイントへのネットワークパスを持っていることを確認してください。
Azure Blobストレージの使用
Azure Blobストレージを分散キャッシュとして使用するには、Runnerのconfig.toml
ファイル を編集してAzureの場所を指定し、接続用の認証情報を指定します。RunnerにAzureエンドポイントへのネットワークパスがあることを確認してください。