跳到主要内容

制品库:镜像和包的私有仓库

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 类型随仓库删除)。