ジョブ実行のスピードアップ

イメージや依存関係をキャッシュすることで、ジョブのパフォーマンスを向上させることができます。

コンテナ用のプロキシを使用します。

を使えば、Dockerイメージのダウンロードにかかる時間を短縮できます:

  • GitLab 依存プロキシや
  • DockerHubレジストリのミラー
  • その他のオープンソースソリューション

GitLab 依存プロキシ

コンテナイメージにより素早くアクセスするために、依存プロキシを使ってコンテナイメージをプロキシすることができます。

Docker Hubレジストリミラー

Docker Hubをミラーリングすることで、ジョブがコンテナイメージにアクセスする時間を短縮することもできます。この結果、レジストリはプルスルーキャッシュとなります。ジョブの実行を高速化するだけでなく、ミラーはDocker Hubの停止やDocker Hubのレート制限に対するインフラストラクチャの耐性を高めることができます。

Dockerデーモンがミラーを使用するように設定されると、ミラーの実行中のインスタンス上のイメージを自動的にチェックします。利用できない場合は、公開Dockerレジストリからイメージを取得し、ローカルに保存してからあなたに返します。

次に同じイメージを要求すると、ローカルのレジストリから取得します。

動作の詳細については、こちらを参照してください。

Docker Hubレジストリのミラーを使用します。

Docker Hubレジストリのミラーを作成します:

  1. プロキシコンテナレジストリを実行する専用マシンにログインします。
  2. そのマシンにDocker Engineがインストールされていることを確認します。
  3. 新しいコンテナレジストリを作成します:

    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) を有効にしたい場合は、公式ドキュメントに従ってください。

  4. サーバの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キャッシュ機能の詳細をご覧ください。

以下のキャッシュサーバーがサポートされています:

GitLab CI/CDキャッシュの依存関係とベストプラクティスについてはこちらをご覧ください。

AWS S3を使う

AWS S3を分散キャッシュとして使用するには、Runnerのconfig.toml ファイル を編集してS3の場所を指定し、接続のための認証情報を指定します。RunnerがS3エンドポイントへのネットワークパスを持っていることを確認してください。

NATゲートウェイ付きの非公開サブネットを使用する場合、データ転送のコストを節約するために、S3 VPCエンドポイントを有効にすることができます。

MinIOの使用

AWS S3を使用する代わりに、独自のキャッシュストレージを作成できます。

  1. キャッシュサーバーが動作する専用マシンにログインします。
  2. そのマシンにDocker Engineがインストールされていることを確認します。
  3. 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 を変更します。

  4. サーバのIPアドレスを確認してください:

    hostname --ip-address
    
  5. キャッシュサーバーはMY_CACHE_IP:9005 で利用可能です。
  6. Runnerが使用するバケットを作成します:

    sudo mkdir /export/runner
    

    runner はその場合のバケツの名前です。別のバケットを選択した場合は、別のバケットになります。すべてのキャッシュは/export ディレクトリに保存されます。

  7. Runnerを設定する際には、(上記の)MINIO_ROOT_USERMINIO_ROOT_PASSWORD の値をアクセスキーとシークレットキーとして使用してください。

これで、、新しいキャッシュサーバーを使用するようにconfig.toml を設定することができます。

Googleクラウドストレージの使用

Google Cloud Platformを分散キャッシュとして使用するには、Runnerのconfig.toml ファイル を編集して、GCPの場所を指定し、接続用の認証情報を指定します。RunnerがGCSエンドポイントへのネットワークパスを持っていることを確認してください。

Azure Blobストレージの使用

Azure Blobストレージを分散キャッシュとして使用するには、Runnerのconfig.toml ファイル を編集してAzureの場所を指定し、接続用の認証情報を指定します。RunnerにAzureエンドポイントへのネットワークパスがあることを確認してください。