パッケージの依存プロキシ
- プラン: Premium、Ultimate
- 提供形態: GitLab.com、GitLab Self-Managed、GitLab Dedicated
- ステータス: ベータ
依存プロキシはベータ版です。この機能を使用する前に、ドキュメントを注意深く確認してください。
GitLab依存プロキシは、パッケージのコピーをダウンロードして保存するローカルプロキシサーバーです。
最初にパッケージをリクエストすると、GitLabはアップストリームパッケージレジストリからそれをフェッチし、プロジェクトにコピーを保存します。同じパッケージを再度リクエストすると、GitLabはプロジェクトのパッケージレジストリに保存されているコピーを提供します。
このアプローチにより、外部ソースからのダウンロード数が減り、パッケージビルドが高速化されます。
依存プロキシを有効にする
パッケージに依存プロキシを使用するには、プロジェクトが適切に設定されていること、およびキャッシュからプルするユーザー権限を持つユーザーが、必要な認証を持っていることを確認してください:
- グローバル設定で、次の機能が無効になっている場合は、有効にします:
package機能。デフォルトでは有効になっています。dependency_proxy機能。デフォルトでは有効になっています。
- プロジェクト設定で、
package機能が無効になっている場合は、有効にします。これはデフォルトで有効になっています。 - 認証方法を追加します。依存プロキシは、パッケージレジストリと同じ認証方法をサポートしています:
高度なキャッシュ
可能な場合、パッケージの依存プロキシは、高度なキャッシュを使用して、プロジェクトのパッケージレジストリにパッケージを保存します。
高度なキャッシュは、プロジェクトのパッケージレジストリとアップストリームパッケージレジストリ間のコヒーレンスを検証します。アップストリームレジストリに更新されたファイルがある場合、依存プロキシはそれらを使用してキャッシュされたファイルを更新します。
高度なキャッシュがサポートされていない場合、依存プロキシはデフォルトの動作に戻ります:
- リクエストされたファイルがプロジェクトのパッケージレジストリにある場合、それが返されます。
- ファイルが見つからない場合は、アップストリームパッケージレジストリからフェッチされます。
高度なキャッシュのサポートは、アップストリームパッケージレジストリが依存プロキシのリクエストにどのように応答するか、および使用するパッケージ形式によって異なります。
Mavenパッケージの場合:
| パッケージレジストリ | 高度なキャッシュはサポートされていますか? |
|---|---|
| GitLab | 対応 |
| Maven Central | 対応 |
| Artifactory | 対応 |
| Sonatype Nexus | 対応 |
| GitHub Packages | 非対応 |
権限
依存プロキシがファイルをプルすると、次のようになります:
- 依存プロキシは、プロジェクトのパッケージレジストリ内のファイルを検索します。これは読み取り操作です。
- 依存プロキシは、パッケージファイルをプロジェクトのパッケージレジストリに公開する可能性があります。これは書き込み操作です。
両方のステップが実行されるかどうかは、ユーザー権限によって異なります。依存プロキシは、パッケージレジストリと同じユーザー権限を使用します。
| プロジェクトの表示レベル | 最低限必要なロール | パッケージファイルを読み取りできますか? | パッケージファイルを書き込むことができますか? | 動作 |
|---|---|---|---|---|
| 公開 | 匿名 | 非対応 | 非対応 | リクエストは拒否されました。 |
| 公開 | ゲスト | 対応 | 非対応 | パッケージファイルは、キャッシュまたはリモートレジストリのいずれかから返されました。 |
| 公開 | デベロッパー | 対応 | 対応 | パッケージファイルは、キャッシュまたはリモートレジストリのいずれかから返されました。ファイルはキャッシュに公開されます。 |
| 内部 | 匿名 | 非対応 | 非対応 | リクエストは拒否されました |
| 内部 | ゲスト | 対応 | 非対応 | パッケージファイルは、キャッシュまたはリモートレジストリのいずれかから返されました。 |
| 内部 | デベロッパー | 対応 | 対応 | パッケージファイルは、キャッシュまたはリモートレジストリのいずれかから返されました。ファイルはキャッシュに公開されます。 |
| 非公開 | 匿名 | 非対応 | 非対応 | リクエストは拒否されました |
| 非公開 | レポーター | 対応 | 非対応 | パッケージファイルは、キャッシュまたはリモートレジストリのいずれかから返されました。 |
| 非公開 | デベロッパー | 対応 | 対応 | パッケージファイルは、キャッシュまたはリモートレジストリのいずれかから返されました。ファイルはキャッシュに公開されます。 |
少なくとも、依存プロキシを使用できるユーザーは、プロジェクトのパッケージレジストリも使用できます。
キャッシュが時間の経過とともに適切に設定されるようにするには、少なくともデベロッパーロールを持つユーザーが依存プロキシを使用してパッケージをプルするようにする必要があります。
クライアントを設定する
依存プロキシのクライアントを設定することは、パッケージレジストリのクライアントを設定することに似ています。
Mavenパッケージの場合
Mavenパッケージの場合、パッケージレジストリでサポートされているすべてのクライアントが依存プロキシでサポートされています:
mvngradlesbt
認証の場合、Mavenパッケージレジストリで受け入れられるすべてのメソッドを使用できます。複雑でないため、Basic HTTP認証方式を使用する必要があります。
クライアントを設定するには:
Basic HTTP認証の手順に従ってください。
エンドポイントURL
https://gitlab.example.com/api/v4/projects/<project_id>/dependency_proxy/packages/mavenを使用していることを確認してください。クライアントの設定を完了します:
Basic HTTP認証が受け入れられます。ただし、mvnが使用するネットワークリクエストの数を減らすために、カスタムHTTPヘッダー認証を使用する必要があります。
pom.xmlファイルにrepository要素を追加します:
<repositories>
<repository>
<id>gitlab-maven</id>
<url>https://gitlab.example.com/api/v4/projects/<project_id>/dependency_proxy/packages/maven</url>
</repository>
</repositories>各設定項目の意味は次のとおりです:
<project_id>は、依存プロキシとして使用されるプロジェクトのIDです。<id>には、認証構成で使用される<server>の名前が含まれています。
デフォルトでは、Maven CentralはSuper POMを介して最初にチェックされます。ただし、GitLabエンドポイントを最初にチェックするようにmvnを強制する場合があります。これを行うには、リクエストの転送の手順に従ってください。
repositoriesセクションをbuild.gradleファイルに追加します。
Groovy DSLの場合:
repositories { maven { url "https://gitlab.example.com/api/v4/projects/<project_id>/dependency_proxy/packages/maven" name "GitLab" credentials(PasswordCredentials) { username = 'REPLACE_WITH_NAME' password = gitLabPrivateToken } authentication { basic(BasicAuthentication) } } }Kotlin DSLの場合:
repositories { maven { url = uri("https://gitlab.example.com/api/v4/projects/<project_id>/dependency_proxy/packages/maven") name = "GitLab" credentials(BasicAuthentication::class) { username = "REPLACE_WITH_NAME" password = findProperty("gitLabPrivateToken") as String? } authentication { create("basic", BasicAuthentication::class) } } }
この例では:
<project_id>は、依存プロキシとして使用されるプロジェクトのIDです。REPLACE_WITH_NAMEについては、Basic HTTP認証セクションで説明します。
build.sbtに次の行を追加します:
resolvers += ("gitlab" at "https://gitlab.example.com/api/v4/projects/<project_id>/dependency_proxy/packages/maven")
credentials += Credentials("GitLab Packages Registry", "<host>", "<name>", "<token>")この例では:
<project_id>は、依存プロキシとして使用されるプロジェクトのIDです。<host>は、プロトコルスキームまたはポートなしで、<endpoint url>に存在するホストです。例:gitlab.example.com。<name>および<token>については、Basic HTTP認証セクションで説明します。
リモートレジストリを設定する
依存プロキシは、次のように設定する必要があります:
- リモートパッケージレジストリのURL。
- オプション。必要な認証情報。
これらのパラメータを設定するには:
- 左側のサイドバーで、検索または移動先を選択して、プロジェクトを見つけます。
- 設定 > パッケージとレジストリを選択します。
- パッケージレジストリを展開します。
- 依存プロキシで、パッケージ形式のフォームに入力します:
Mavenパッケージレジストリはすべて、依存プロキシに接続できます。Mavenパッケージレジストリのユーザー名とパスワードを使用して、接続を承認できます。
リモートMavenパッケージレジストリを設定または更新するには、フォームで次のフィールドを更新します:
URL- リモートレジストリのURL。Username- オプション。リモートレジストリで使用するユーザー名。Password- オプション。リモートレジストリで使用するパスワード。
ユーザー名とパスワードの両方を設定するか、両方のフィールドを空のままにする必要があります。
トラブルシューティング
手動ファイルプルエラー
cURLを使用して手動でファイルをプルできます。ただし、次のいずれかの応答が発生する可能性があります:
404 Not Found- 依存プロキシの設定オブジェクトが見つかりませんでした。これは、オブジェクトが存在しないか、要件が満たされていないためです。401 Unauthorized- ユーザーは適切に認証されましたが、依存プロキシオブジェクトにアクセスするための適切なユーザー権限がありませんでした。403 Forbidden- GitLabライセンスレベルに問題がありました。502 Bad Gateway- リモートパッケージレジストリがファイルのリクエストを完了できませんでした。依存プロキシの設定を確認します。504 Gateway Timeout- リモートパッケージレジストリがタイムアウトしました。依存プロキシの設定を確認します。
curl --fail-with-body --verbose "https://<username>:<personal access token>@gitlab.example.com/api/v4/projects/<project_id>/dependency_proxy/packages/maven/<group id and artifact id>/<version>/<file_name>"<username>と<personal access token>は、GitLabインスタンスの依存プロキシにアクセスするための認証情報です。<project_id>はプロジェクトIDです。<group id and artifact id>は、フォワードスラッシュで結合されたMavenパッケージグループIDとアーティファクトIDです。<version>は、パッケージのバージョンです。file_nameは、ファイルの正確な名前です。
たとえば、次のパッケージがあるとします:
- グループID:
com.my_company。 - アーティファクトID:
my_package。 - バージョン:
1.2.3。
パッケージを手動でプルするリクエストは次のとおりです:
curl --fail-with-body --verbose "https://<username>:<personal access token>@gitlab.example.com/api/v4/projects/<project_id>/dependency_proxy/packages/maven/com/my_company/my_package/1.2.3/my_package-1.2.3.pom"