极狐GitLab 通用软件包存储库

  • 引入于 13.5 版本。
  • 部署在功能标志后默认启用。
  • 可以为每个项目启用或禁用它。
  • 推荐用于生产。
  • 对于自助自我管理的实例,GitLab 管理员可以选择禁用它
caution您可能无法使用此功能。查看上面的版本历史注释以了解详细信息。

在项目的软件包库中发布通用文件,如发布二进制文件。然后,在需要将它们用作依赖项时安装它们。

向软件包库进行身份验证

要对软件包库进行身份验证,您需要一个个人访问令牌,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 integer/string yes ID 或项目的 URL 编码路径。
package_name string yes 包名。只能包含小写字母(az)、大写字母(AZ)、数字(0-9)、点(.)、连字符(-)或下划线(_) .
package_version string yes 包版本。以下正则表达式验证了这一点:\A(\.?[\w\+-]+\.?)+\z。 您可以在 Rubular 上测试您的版本字符串。
file_name string yes 文件名。它只能包含小写字母(az)、大写字母(AZ)、数字(0-9)、点(.)、连字符(-)或下划线(_)。
status string no 包状态。可以是 default(默认)或 hidden。隐藏的包不会出现在 UI 或包 API 列表端点中。
select string no 响应负载。默认情况下,响应为空。 有效值为:package_filepackage_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 的示例响应:

{
  "message":"201 Created"
}

具有属性 select = 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=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
}

发布具有相同名称或版本的包

当您发布与现有包具有相同名称和版本的包时,新的包文件将添加到现有包中。您仍然可以使用 UI 或 API 来访问和查看现有包的旧文件。要删除这些较旧的包修订版,请考虑使用包 API 或 UI。

不允许重复的通用包

  • 引入于 13.12 版本。
  • 于 15.0 版本,所需的权限从开发者更改为维护者。

为了防止用户发布重复的通用包,您可以使用 GraphQl API 或 UI。

在用户界面中:

  1. 对于您的群组,转到 设置 > 软件包与镜像库
  2. 展开 软件包库 部分。
  3. 打开 不允许重复 开关。
  4. 可选。要允许某些重复的包,请在 例外 框中输入与要允许的包的名称和/或版本匹配的正则表达式 pattern。

您的更改会自动保存。

下载包文件

下载一个包文件。

如果多个包具有相同的名称、版本和文件名,则检索最新的包。

先决条件:

  • 您需要使用 API 进行身份验证。如果使用部署令牌进行身份验证,则必须使用 read_package_registry 和/或 write_package_registry 范围进行配置。
GET /projects/:id/packages/generic/:package_name/:package_version/:file_name
参数 类型 是否必需 描述
id integer/string yes ID 或项目的 URL 编码路径。
package_name string yes 包名称。
package_version string yes 包版本。
file_name string 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 基本身份验证的示例请求:

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 运行程序时,您必须在 uploaddownload 阶段使用 Invoke-WebRequestInvoke-RestMethod 而不是 curl

例如:

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