GitLab Generic Packagesリポジトリ
- GitLab 13.5 で
generic_packagesというフラグで導入されました。デフォルトで有効です。- GitLab 14.8 で機能フラグ
generic_packagesが削除されました。
リリースバイナリのような一般的なファイルをプロジェクトのパッケージレジストリに公開します。そして、依存関係として使用する必要があるときはいつでもパッケージをインストールしてください。
パッケージレジストリへの認証
パッケージレジストリを認証するには、個人アクセストークン、CI/CDジョブトークン、デプロイトークンのいずれかが必要です。
標準的なAPI認証メカニズムに加えて、汎用パッケージAPIは他の利用可能なメカニズムをサポートしないツールで使用するためにHTTP Basic認証による認証を許可します。user-id はチェックされず、どのような値でもかまいません。password は、個人アクセストークン、CI/CD ジョブトークン、デプロイトークンのいずれかでなければなりません。
ここで説明されている以外の認証方法は使用しないでください。文書化されていない認証方法は、将来削除される可能性があります。
パッケージファイルの公開
パッケージファイルを公開すると、パッケージが存在しない場合は作成されます。
前提条件:
- 
APIで認証する必要があります。デプロイトークンで認証する場合は、write_package_registryスコープで設定する必要があります。パーソナルアクセストークンまたはプロジェクトアクセストークンで認証する場合は、apiスコープで設定する必要があります。
- 同じパッケージ名とバージョンで複数のファイルをアップロードしようとする場合、この API エンドポイントを連続して呼び出す必要があります。新しいパッケージ名とバージョンに複数のファイルを同時にアップロードしようとすると、パッケージを作成するためのリクエストのため、HTTP 500: Internal Server Errorレスポンスで部分的に失敗する可能性があります。
PUT /projects/:id/packages/generic/:package_name/:package_version/:file_name?status=:status
| 属性 | 種類 | 必須 | 説明 | 
|---|---|---|---|
| id | 整数/文字列 | yes | プロジェクトのIDまたはURLエンコードされたパス。 | 
| package_name | 文字列です。 | yes | パッケージ名。小文字 ( a-z)、大文字 (A-Z)、数字 (0-9)、ドット (.)、ハイフン (-)、アンダースコア (_) のみを含むことができます。 | 
| package_version | 文字列です。 | yes | パッケージのバージョン。次の正規表現で検証します: \A(\.?[\w\+-]+\.?)+\z.Rubular でバージョン文字列をテストできます。 | 
| file_name | 文字列です。 | yes | ファイル名。小文字 ( a-z)、大文字 (A-Z)、数字 (0-9)、ドット (.)、ハイフン (-)、アンダースコア (_) のみを含むことができます。 | 
| status | 文字列です。 | いいえ | パッケージのステータスです。 default(デフォルト) またはhiddenです。 非表示パッケージは UI やパッケージ API リストエンドポイントに表示されません。 | 
| select | 文字列です。 | いいえ | レスポンスのペイロード。デフォルトでは、レスポンスは空です。有効な値は以下のとおりです:このリクエストによって作成されたパッケージファイルレコードの詳細を返します package_file。package_file | 
リクエストボディにファイルコンテキストを指定します。
個人アクセストークンを使用したリクエスト例:
curl --header "PRIVATE-TOKEN: <your_access_token>" \
     --upload-file path/to/file.txt \
     "https://gitlab.example.com/api/v4/projects/24/packages/generic/my_package/0.0.1/file.txt"
属性なしのレスポンス例select :
{
  "message":"201 Created"
}
属性付きのリクエスト例select = package_file :
curl --header "PRIVATE-TOKEN: <your_access_token>" \
     --user "<username>:<Project Access Token>" \
     --upload-file path/to/file.txt \
     "https://gitlab.example.com/api/v4/projects/24/packages/generic/my_package/0.0.1/file.txt?select=package_file"
select = package_file 属性による応答例 :
{
  "id": 1,
  "package_id": 1,
  "created_at": "2021-10-12T12:05:23.387Z",
  "updated_at": "2021-10-12T12:05:23.387Z",
  "size": 0,
  "file_store": 1,
  "file_md5": null,
  "file_sha1": null,
  "file_name": "file.txt",
  "file": {
    "url": "/6b/86/6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b/packages/26/files/36/file.txt"
  },
  "file_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
  "verification_retry_at": null,
  "verified_at": null,
  "verification_failure": null,
  "verification_retry_count": null,
  "verification_checksum": null,
  "verification_state": 0,
  "verification_started_at": null,
  "new_file_path": null
}
同じ名前またはバージョンのパッケージの公開
既存のパッケージと同じ名前やバージョンのパッケージを公開すると、新しいパッケージファイルが既存のパッケージに追加されます。重複している汎用パッケージをインストールすると、GitLabは最新バージョンをダウンロードします。
UIやAPIを使って、既存パッケージの古いファイルにアクセスし、閲覧することができます。これらの古いパッケージリビジョンを削除するには、Packages APIかUIの使用を検討してください。
ジェネリックパッケージの重複を許可しない
ユーザーがジェネリックパッケージを重複して公開しないようにするには、GraphQL APIまたは UI を使用します。
UI では
- 左のサイドバーで、Search(検索)を選択するか、Go to(移動)を選択してグループを探します。
- 設定 > パッケージとレジストリを選択します。
- パッケージの重複]テーブルの[一般]行で、[重複を許可]トグルをオフにします。
- オプション。例外] テキストボックスに、許可するパッケージの名前とバージョンに一致する正規表現を入力します。
変更は自動的に保存されます。
パッケージファイルのダウンロード
パッケージファイルをダウンロード
複数のパッケージの名前、バージョン、ファイル名が同じ場合は、最新のものが取得されます。
前提条件:
- 
APIで認証する必要があります。デプロイトークンで認証する場合は、read_package_registryまたはwrite_package_registryスコープで設定する必要があります。
GET /projects/:id/packages/generic/:package_name/:package_version/:file_name
| 属性 | 種類 | 必須 | 説明 | 
|---|---|---|---|
| id | 整数/文字列 | yes | プロジェクトのIDまたはURLエンコードされたパス。 | 
| package_name | 文字列です。 | yes | パッケージ名。 | 
| package_version | 文字列です。 | yes | パッケージのバージョン。 | 
| file_name | 文字列です。 | yes | ファイル名。 | 
ファイルコンテキストはレスポンスボディで提供されます。レスポンスのコンテントタイプはapplication/octet-stream です。
個人アクセストークンを使用したリクエストの例です:
curl --header "PRIVATE-TOKEN: <your_access_token>" \
     "https://gitlab.example.com/api/v4/projects/24/packages/generic/my_package/0.0.1/file.txt"
HTTP Basic認証を使用したリクエスト例:
curl --user "user:<your_access_token>" \
     "https://gitlab.example.com/api/v4/projects/24/packages/generic/my_package/0.0.1/file.txt"
CI/CDによる汎用パッケージの発行
GitLab CI/CDで汎用パッケージを扱うには、コマンドで個人アクセストークンの代わりにCI_JOB_TOKEN 。
使用例:
image: curlimages/curl:latest
stages:
  - upload
  - download
upload:
  stage: upload
  script:
    - 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file path/to/file.txt "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/my_package/0.0.1/file.txt"'
download:
  stage: download
  script:
    - 'wget --header="JOB-TOKEN: $CI_JOB_TOKEN" ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/my_package/0.0.1/file.txt'
PowerShell で Windows Runner を使用する場合、upload およびdownload ステージでcurl の代わりにInvoke-WebRequest またはInvoke-RestMethod を使用する必要があります。
使用例:
upload:
  stage: upload
  script:
    - Invoke-RestMethod -Headers @{ "JOB-TOKEN"="$CI_JOB_TOKEN" } -InFile path/to/file.txt -uri "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/my_package/0.0.1/file.txt" -Method put
汎用パッケージサンプルプロジェクト
Write CI-CD Variables in Pipelineプロジェクトには、GitLab CI/CD で汎用パッケージを作成、アップロード、ダウンロードするためのサンプルが含まれています。
また、ジェネリックパッケージのセマンティックバージョンを管理する方法も示しています:CI/CD変数に格納し、それを取得し、インクリメントし、ダウンロードのテストが正しく動作したときにCI/CD変数に書き戻します。
トラブルシューティング
S3への大容量ファイルのアップロードで内部サーバーエラーが発生します。
S3互換のオブジェクトストレージでは、1回のPUTリクエストのサイズが5GBに制限されています。オブジェクトストレージの接続設定で、aws_signature_version が2 に設定されている場合、5 GB の制限を超えるサイズのパッケージファイルを公開しようとすると、HTTP 500: Internal Server Error レスポンスが返されることがあります。
S3 に大きなファイルを公開するときにHTTP 500: Internal Server Error 応答を受け取る場合は、aws_signature_version を4 に設定してください:
# Consolidated Object Storage settings
gitlab_rails['object_store']['connection'] = {
  # Other connection settings
  'aws_signature_version' => '4'
}
# OR 
# Storage-specific form settings
gitlab_rails['packages_object_store_connection'] = {
  # Other connection settings
  'aws_signature_version' => '4'
}
