本项目为基于云原生构建启动自定义云原生开发环境的插件,通过简单配置,即可实现对应功能。
效果如下图:

如果你想自定义选项参数列表,可参考如下说明。当前仓库已配置支持,通过两个配置文件来定义这个功能。
.cnb/web_trigger.yml参看当前仓库的: web_trigger.yml
迁移说明:下例展示的是 canonical snake_case 命名写法。在
.cnb/web_trigger.yml中,inputs下每个 key 本身就是 Web Trigger 变量名;workflow stage 里引用的${...}必须与这些 key 保持同名。
branch:
- reg: ".*"
buttons:
- name: 启动自定义开发环境
description: 云原生开发环境一键初始化
event: web_trigger_start_custom_environment
inputs:
create_orphan_branch:
name: 是否创建孤儿分支
description: 在已有主分支和内容的 Git 仓库中创建一个空内容的新分支(可选)
type: radio
required: false
default: "false"
options:
- name: 创建正常分支
value: "false"
description: 不创建孤儿分支
- name: 创建孤儿分支
value: "true"
description: 创建孤儿分支
repo_slug:
name: 绑定开发环境工作仓库
description: 输入您要启动的开发环境所对应的仓库库地址,如果不存在则会自动创建(可选)
type: input
required: false
default: zishuo/workspace@develop
environment_url:
name: 自定义环境变量
description: 自定义一个密钥仓库文件,将敏感信息注入到环境变量,可在开发环境中直接使用。
type: input
required: false
default: https://cnb.cool/zishuo/system-env/-/blob/main/envs/init.yml
cluster_tag:
name: 云原生开发构建集群
description: 选择构建集群架构或GPU环境
type: select
required: true
default: cnb:arch:amd64
options:
- name: AMD64 架构(通用)- 1~64核
value: cnb:arch:amd64
description: 通用AMD64架构,CPU可配置1-64核
- name: ARM64/v8 架构 - 1~16核
value: cnb:arch:arm64:v8
description: ARM64/v8架构,CPU可配置1-16核
- name: AMD64 + GPU(标准)- 16核固定,48GB显存
value: cnb:arch:amd64:gpu
description: AMD64架构+GPU,48GB显存共享,CPU固定16核
- name: AMD64 + GPU H20 - 32核固定,96GB显存
value: cnb:arch:amd64:gpu:H20
description: AMD64架构+GPU H20,96GB显存共享,CPU固定32核
- name: AMD64 + GPU L40 - 16核固定,48GB显存
value: cnb:arch:amd64:gpu:L40
description: AMD64架构+GPU L40,48GB显存共享,CPU固定16核
cpu_cores:
name: CPU 核心数
description: 选择所需的 CPU 核数(GPU集群将自动使用固定核数)
type: select
required: true
default: 4
options:
- name: 1 核(仅限非GPU集群)
value: 1
- name: 2 核(仅限非GPU集群)
value: 2
- name: 4 核(仅限非GPU集群)
value: 4
- name: 8 核(AMD64/ARM64默认)
value: 8
- name: 16 核(ARM64最大/GPU标准固定)
value: 16
- name: 32 核(仅限AMD64/GPU H20固定)
value: 32
- name: 64 核(仅限AMD64架构)
value: 64
selected_dev_container_image:
name: 开发环境镜像选择
description: 选择预定义的开发环境镜像
type: select
required: true
default: docker.cnb.cool/zishuo/default-dev-env
options:
- name: CNB 官方默认远程开发环境
value: cnbcool/default-dev-env
- name: 菜鸡御用 Go+Node+Python、AI(Claude/Codex) 开发环境
value: docker.cnb.cool/zishuo/default-dev-env
- name: 大佬御用 Go-1.24+Node-18 开发环境
value: docker.cnb.cool/znb/images/debian:all
- name: 大佬御用 Go-1.25+Node-22 开发环境
value: docker.cnb.cool/znb/images/debian:new
- name: CNB 官方提供 Python3 开发环境
value: docker.cnb.cool/examples/language/python-3
- name: CNB 官方提供 PHP-8.4 开发环境
value: docker.cnb.cool/examples/language/php-8.4
- name: CNB 官方提供 CUDA-12.4 开发环境(推荐GPU集群)
value: docker.cnb.cool/examples/language/cuda-12.4
- name: CNB 官方提供 dotnet-9.0 开发环境
value: docker.cnb.cool/examples/language/dotnet-9.0
- name: CNB 官方提供 Java-8 开发环境
value: docker.cnb.cool/examples/language/java-8
- name: CNB 官方提供 Go-1.24 开发环境
value: docker.cnb.cool/examples/language/golang-1.24
- name: CNB 官方提供 Rust-1.87 开发环境
value: docker.cnb.cool/examples/language/rust-1.87
- name: CNB 官方提供 Node-22 开发环境
value: docker.cnb.cool/examples/language/node-22
custom_dev_container_image:
name: 自定义镜像地址
description: 输入自定义镜像地址,优先级高于下拉选择镜像(可选)
type: input
required: false
placeholder: 例如:ubuntu:20.04 或 pytorch/pytorch:latest
clone_repository_url:
name: 迁移外部Git仓库
description: 输入需要迁移的仓库地址,迁移后会将原仓库的所有内容迁移到选定的仓库中(可选)
type: input
required: false
旧名迁移到新名:
orphan -> create_orphan_branch、repository -> repo_slug、image_select -> selected_dev_container_image、custom_image_url -> custom_dev_container_image、repository_address -> clone_repository_url。
其中的常用镜像列表,可根据自己的喜好自定义。
参看当前仓库的: ztools-environment.yml
内容如下:
"main":
web_trigger_start_custom_environment:
- services:
- docker
runner:
cpus: 1
imports: ${environment_url}
stages:
- name: 打印传入环境变量
script: |
if [ -z "$custom_dev_container_image" ]; then image="$selected_dev_container_image"; else image="$custom_dev_container_image"; fi;
echo -e "CPU核数: $cpu_cores \n构建集群: $cluster_tag \n工作仓库: $repo_slug \n环境变量: $environment_url \n云开发镜像: $image"
- name: 使用自定义云原生开发环境
if: |
[ "$custom_dev_container_image" != "" ]
image: ${CNB_DOCKER_REGISTRY}/${CNB_REPO_SLUG_LOWERCASE}:latest
settings:
start_type: "custom"
cpu_cores: "${cpu_cores}"
dev_container_image: "${custom_dev_container_image}"
cluster_tag: "${cluster_tag}"
create_orphan_branch: "${create_orphan_branch}"
repo_slug: "${repo_slug}"
environment_url: "${environment_url}"
clone_repository_url: "${clone_repository_url}"
cnb_token: "${CNB_TOKEN_USER_PASSWORD}"
wecom_hook_token: "${WECOM_HOOK_TOKEN}"
- name: 使用仓库内置云原生开发环境
if: |
[ "$custom_dev_container_image" == "" ]
image: ${CNB_DOCKER_REGISTRY}/${CNB_REPO_SLUG_LOWERCASE}:latest
settings:
start_type: "custom"
cpu_cores: "${cpu_cores}"
dev_container_image: "${selected_dev_container_image}"
cluster_tag: "${cluster_tag}"
create_orphan_branch: "${create_orphan_branch}"
repo_slug: "${repo_slug}"
environment_url: "${environment_url}"
clone_repository_url: "${clone_repository_url}"
cnb_token: "${CNB_TOKEN_USER_PASSWORD}"
wecom_hook_token: "${WECOM_HOOK_TOKEN}"
除了支持下拉选择镜像之外,还支持输入自定义镜像地址,优先级高于下拉选择镜像。
变量传递说明:这里真正生效的是
settings,不是env。Web 表单已经迁移到新命名,且.cnb/web_trigger.yml的inputskey 就是 workflow 中直接可用的变量名,因此这里统一使用create_orphan_branch、repo_slug、selected_dev_container_image、custom_dev_container_image、clone_repository_url。进入插件容器后,settings字段会转成PLUGIN_*环境变量,例如repo_slug -> PLUGIN_REPO_SLUG、dev_container_image -> PLUGIN_DEV_CONTAINER_IMAGE、clone_repository_url -> PLUGIN_CLONE_REPOSITORY_URL。Go 侧隐藏参数也同步提供 canonical 命名,如--repo-slug、--environment-url、--clone-repository-url、--selected-dev-container-image、--custom-dev-container-image,并兼容旧参数名。兼容性说明:当前 Go 侧仍兼容旧环境变量别名
PLUGIN_ORPHAN、PLUGIN_REPOSITORY、PLUGIN_IMAGE、PLUGIN_REPOSITORY_ADDRESS、PLUGIN_TAG、PLUGIN_CPU;但 Web 表单和 workflow 文档已统一迁移到新的 canonical snake_case 命名。预设补充:当使用
--preset且该预设声明了envVars时,这些键值不会转成PLUGIN_*,而是由ztools组装进StartBuild请求体的env字段。它们属于构建触发环境变量,会进入后续api_trigger生成的云原生开发 YAML/Stage 生命周期,可用于$VAR/${VAR}变量替换与脚本读取。当前内置预设默认会注入一组无副作用的自描述变量,例如PROJECT_PRESET、PROJECT_STACK、PROJECT_RUNTIME,便于后续脚本按预设识别环境。优先级说明:
preset.EnvVars作用于StartBuild.env;environment_url作用于生成 YAML 的imports;两者进入的是后续工作区构建链路而不是插件自身。若后续 YAML 中env与imports出现同名变量,按 CNB 规则env优先于imports。行为说明:
custom模式会把environment_url与clone_repository_url继续写入生成的 CNB YAML;default模式底层调用的StartWorkspaceAPI 只支持branch/ref,因此不支持传递自定义envs/clone/image/tag/cpu。安全提示:若需跳过 TLS 证书校验,必须显式设置
CNB_INSECURE_SKIP_VERIFY=true且同时设置CNB_DEBUG=true(或PLUGIN_DEBUG=true),仅建议在 debug 场景使用。权限提示:若
environment_url来自 private repo,风险不在“公开泄露”,而在作用域过宽。如果同一份文件同时承载开发环境变量与机器人 Token/敏感参数,这些值会一起进入工作区生命周期,不符合最小权限原则,建议将工作区变量与插件私密参数拆分管理。当前内置 workflow 中,克隆外部仓库 与 安装自定义脚本 失败会直接中止,避免生成半成品环境;
Claude Code/OpenAI Codex升级仍为非阻塞,但失败会在 stage 中明确标红。
内置 preset 默认注入变量表
| preset | 默认 envVars |
|---|---|
ai-pytorch | ML_FRAMEWORK=pytorch PROJECT_ACCELERATOR=gpu PROJECT_PRESET=ai-pytorch PROJECT_RUNTIME=python PROJECT_STACK=ai |
ai-tensorflow | ML_FRAMEWORK=tensorflow PROJECT_ACCELERATOR=gpu PROJECT_PRESET=ai-tensorflow PROJECT_RUNTIME=python PROJECT_STACK=ai |
arm64-go | PROJECT_ARCH=arm64 PROJECT_PRESET=arm64-go PROJECT_RUNTIME=go PROJECT_STACK=backend |
backend-go | PROJECT_PRESET=backend-go PROJECT_RUNTIME=go PROJECT_STACK=backend |
backend-java | PROJECT_PRESET=backend-java PROJECT_RUNTIME=java PROJECT_STACK=backend |
backend-python | PROJECT_PRESET=backend-python PROJECT_RUNTIME=python PROJECT_STACK=backend |
backend-rust | PROJECT_PRESET=backend-rust PROJECT_RUNTIME=rust PROJECT_STACK=backend |
frontend | PROJECT_PRESET=frontend PROJECT_RUNTIME=node PROJECT_STACK=frontend |
frontend-bun | PROJECT_PRESET=frontend-bun PROJECT_RUNTIME=bun PROJECT_STACK=frontend |
fullstack | PROJECT_PRESET=fullstack PROJECT_RUNTIME=ubuntu PROJECT_STACK=fullstack |
ubuntu | PROJECT_PRESET=ubuntu PROJECT_RUNTIME=ubuntu PROJECT_STACK=base |
环境启动成功后:可点击右上角头像 --> 点击我的云原生开发 列表中查看对应的环境登陆地址等信息。
此工具编写过程中,用了如下优秀的库,在此感谢。