---
url: /zh/artifact/generic.md
description: |
  介绍 Generic 制品库的使用方式， 包括通过命令行或流水线推送、拉取通用格式制品，以及凭据配置方法。
---
## 前置准备

1. [创建制品库](/zh/artifact/intro.md#创建制品库)
2. [获取制品库地址](/zh/artifact/intro.md#获取制品库的地址)
3. [创建令牌](/zh/artifact/intro.md#创建访问令牌)

## 推送制品

::: tip 凭证配置
推送和拉取制品前需配置 `.netrc` 认证凭据（首次配置即可，后续无需重复）：

```shell
printf "machine generic.cnbprod.alpha.qq.com\nlogin cnb\npassword %s\n" "${CNB_TOKEN}" > ~/.netrc
```

`CNB_TOKEN` 的获取方式请参考 [创建访问令牌](./intro.md#创建访问令牌)。
:::

### 本地命令行推送

配置凭据后，执行以下命令推送制品
（`<REPO_URL>`、`<PACKAGE>`、`<VERSION>`、`<LOCAL_FILE_NAME>` 请替换为实际值）：

```shell
curl --netrc '<REPO_URL>/<PACKAGE>?version=<VERSION>' -T '<LOCAL_FILE_NAME>'
```

### 云原生构建中推送

1. 将以下内容添加到 `.cnb.yml` 并提交到代码仓库。推送 Tag 触发构建，Tag 值将作为制品版本号：

```yaml title=".cnb.yml"
$:
  tag_push:
    - docker:
        image: curlimages/curl
      stages:
        - name: setup netrc
          script: printf "machine generic.cnbprod.alpha.qq.com\nlogin cnb\npassword %s\n" "${CNB_TOKEN}" > ~/.netrc
        - name: upload
          script: curl --netrc "<REPO_URL>/<PACKAGE>?version=${CNB_BRANCH}" -T "<LOCAL_FILE_NAME>"
```

> `<REPO_URL>`、`<PACKAGE>`、`<LOCAL_FILE_NAME>` 请替换为实际值。建议使用 [语义版本号](https://semver.org/lang/zh-CN/)。

### 云原生开发中推送

1. 点击代码仓库页面右上角的 **「云原生开发」** 按钮进入开发环境
2. 配置凭据后，执行推送命令（同 [本地命令行推送](#本地命令行推送)）：

```shell
curl --netrc '<REPO_URL>/<PACKAGE>?version=<VERSION>' -T '<LOCAL_FILE_NAME>'
```

## 使用制品

### 拉取制品

如已配置 `.netrc` 凭据（见上方推送章节提示），可直接拉取：

```shell
curl -OfL --netrc '<REPO_URL>/<PACKAGE>?version=<VERSION>'
```

（`<REPO_URL>`、`<PACKAGE>`、`<VERSION>` 请替换为实际值）

### 删除制品

Generic 制品库暂不支持命令行删除，请参考 [删除制品](/zh/artifact/intro.md#删除制品)。

## FAQ

### Q1: 包名限制规则

> 包名指完整路径，例如 `a/b/c.txt`。

1. 最大长度 128 字符，层级深度不超过 5
2. 区分大小写：`a/b/c.txt` 与 `A/B/C.TXT` 是不同路径
3. 目录和文件不能同名：不允许 `a/b/c` 和 `a/b/c/` 同时存在
4. 路径片段不能以空格开头或结尾
5. 单独的 `-` 不能作为目录名或文件名
6. 包名字符需匹配正则：`^[a-zA-Z0-9\u4e00-\u9fa5._\\-/ ]+$`
