制品库:镜像和包的私有仓库
CNB 自带制品库,不用自建 Registry,也不用买对象存储。支持 12 种类型。
一、谁归组织,谁归仓库
这个层级关系很容易搞混:
组织
├── maven ← 归组织
├── npm ← 归组织
├── pypi ← 归组织
├── nuget / composer / cargo / conan / ohpm / generic
└── 代码仓库
├── docker ← 归仓库(无需手动创建)
├── helm
└── docker model
记忆法:
- 语言包管理器(npm、pip、mvn…)→ 组织级,需要手动创建
- 容器相关(Docker、Helm、Docker Model)→ 仓库级,自动存在
二、Docker 制品库
登录:
docker login <CNB_DOCKER_REGISTRY> -u cnb -p ${CNB_TOKEN}
两种命名规则:
# 同名制品:路径 = 仓库路径
${CNB_DOCKER_REGISTRY}/${CNB_REPO_SLUG_LOWERCASE}:latest
# 非同名制品:路径 = 仓库路径/制品名
${CNB_DOCKER_REGISTRY}/${CNB_REPO_SLUG_LOWERCASE}/<IMAGE_NAME>:latest
流水线里推送要声明 services: docker:
.cnb.yml
main:
push:
- services:
- docker
stages:
- name: docker build
script: docker build -t ${CNB_DOCKER_REGISTRY}/${CNB_REPO_SLUG_LOWERCASE}:latest .
- name: docker push
script: docker push ${CNB_DOCKER_REGISTRY}/${CNB_REPO_SLUG_LOWERCASE}:latest
推上去之后,可以直接把镜像当流水线环境或开发环境用:
main:
push:
- docker:
image: ${CNB_DOCKER_REGISTRY}/${CNB_REPO_SLUG_LOWERCASE}:latest
:::tip 制品类型准入
Docker、Helm、Docker Model 三类互相隔离。把 Helm Chart 推到 Docker 地址会被拒:denied: artifact type "CHART" is not allowed to be pushed to a "docker" registry。
:::
三、Helm(OCI 格式)
helm registry login <CNB_HELM_REGISTRY> -u cnb -p ${CNB_TOKEN}
helm package chart-path
helm push chartname-version.tgz oci://<CNB_HELM_REGISTRY>/<路径>
只支持 Helm v3.8.0 以上的 OCI 格式。要注意一个反直觉的点:helm push 时 chart 名不出现在远程 URL 里,而是从 chart 包内读取。所以同名制品的 remote-url 用的是组织路径,不是仓库路径。
四、npm / PyPI
npm——三种配置任选,.npmrc 最省事:
registry=<REPO_URL>
always-auth=true
//<REPO_URL_SUFFIX>:_authToken=<YOUR_TOKEN>
PyPI——pip 源里直接内嵌凭据:
[global]
index-url = https://cnb:<YOUR_TOKEN>@<REPO_URL>
或用命令行:
pip config set global.index-url https://cnb:<YOUR_TOKEN>@<REPO_URL>
流水线里最省事的方式是直接用内置变量:
- name: install
script: pip install -r requirements.txt
因为 TWINE_USERNAME / TWINE_PASSWORD 已经内置好了。
五、权限模型
| 制品库 | 可见性取决于 | 操作权限取决于 |
|---|---|---|
| Docker / Helm / Docker Model | 所属代码仓库的可见性 | 在代码仓库中的角色 |
| Composer / Maven / npm 等 | 制品库自身的可见性 | 在制品库中的角色 |
行为与角色的对应:
| 行为 | 公开制品库 | 私有制品库 |
|---|---|---|
| 拉取 | 任何人,无需登录 | 访客及以上,需登录 |
| 推送 | 开发者及以上 | 开发者及以上 |
| 删除 | 管理员及以上 | 管理员及以上 |
六、清理
Docker/Helm 的过期标签用 artifact:remove-tag 按约定清:
- name: 清理临时标签
type: artifact:remove-tag
options:
# 仓库同名制品写仓库名;非同名制品写 repo/tag 形式
name: my-repo/my-image
tags:
- pr-123
- nightly
type: docker
其他类型进制品库详情页手动删,或者在「制品库设置」里删整个库(Docker/Helm 类型随仓库删除)。