logo
3
0
WeChat Login

ZTools

🎭 基于云原生构建启动自定义云原生开发环境

🔔 可直接 fork 本仓库,即刻拥有基于云原生构建启动自定义云原生开发环境的功能!

ℹ️ 项目简介

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

效果如下图:

🗣️ 用法介绍

如果你想自定义选项参数列表,可参考如下说明。当前仓库已配置支持,通过两个配置文件来定义这个功能。

  1. 定义 .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_branchrepository -> repo_slugimage_select -> selected_dev_container_imagecustom_image_url -> custom_dev_container_imagerepository_address -> clone_repository_url

其中的常用镜像列表,可根据自己的喜好自定义。

  1. 定义按钮触发对应任务

参看当前仓库的: 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.ymlinputs key 就是 workflow 中直接可用的变量名,因此这里统一使用 create_orphan_branchrepo_slugselected_dev_container_imagecustom_dev_container_imageclone_repository_url。进入插件容器后,settings 字段会转成 PLUGIN_* 环境变量,例如 repo_slug -> PLUGIN_REPO_SLUGdev_container_image -> PLUGIN_DEV_CONTAINER_IMAGEclone_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_ORPHANPLUGIN_REPOSITORYPLUGIN_IMAGEPLUGIN_REPOSITORY_ADDRESSPLUGIN_TAGPLUGIN_CPU;但 Web 表单和 workflow 文档已统一迁移到新的 canonical snake_case 命名。

预设补充:当使用 --preset 且该预设声明了 envVars 时,这些键值不会转成 PLUGIN_*,而是由 ztools 组装进 StartBuild 请求体的 env 字段。它们属于构建触发环境变量,会进入后续 api_trigger 生成的云原生开发 YAML/Stage 生命周期,可用于 $VAR / ${VAR} 变量替换与脚本读取。当前内置预设默认会注入一组无副作用的自描述变量,例如 PROJECT_PRESETPROJECT_STACKPROJECT_RUNTIME,便于后续脚本按预设识别环境。

优先级说明:preset.EnvVars 作用于 StartBuild.envenvironment_url 作用于生成 YAML 的 imports;两者进入的是后续工作区构建链路而不是插件自身。若后续 YAML 中 envimports 出现同名变量,按 CNB 规则 env 优先于 imports

行为说明:custom 模式会把 environment_urlclone_repository_url 继续写入生成的 CNB YAML;default 模式底层调用的 StartWorkspace API 只支持 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-pytorchML_FRAMEWORK=pytorch PROJECT_ACCELERATOR=gpu PROJECT_PRESET=ai-pytorch PROJECT_RUNTIME=python PROJECT_STACK=ai
ai-tensorflowML_FRAMEWORK=tensorflow PROJECT_ACCELERATOR=gpu PROJECT_PRESET=ai-tensorflow PROJECT_RUNTIME=python PROJECT_STACK=ai
arm64-goPROJECT_ARCH=arm64 PROJECT_PRESET=arm64-go PROJECT_RUNTIME=go PROJECT_STACK=backend
backend-goPROJECT_PRESET=backend-go PROJECT_RUNTIME=go PROJECT_STACK=backend
backend-javaPROJECT_PRESET=backend-java PROJECT_RUNTIME=java PROJECT_STACK=backend
backend-pythonPROJECT_PRESET=backend-python PROJECT_RUNTIME=python PROJECT_STACK=backend
backend-rustPROJECT_PRESET=backend-rust PROJECT_RUNTIME=rust PROJECT_STACK=backend
frontendPROJECT_PRESET=frontend PROJECT_RUNTIME=node PROJECT_STACK=frontend
frontend-bunPROJECT_PRESET=frontend-bun PROJECT_RUNTIME=bun PROJECT_STACK=frontend
fullstackPROJECT_PRESET=fullstack PROJECT_RUNTIME=ubuntu PROJECT_STACK=fullstack
ubuntuPROJECT_PRESET=ubuntu PROJECT_RUNTIME=ubuntu PROJECT_STACK=base
  1. 在 .cnb.yml 中引用如上流水线文件即可实现完美且优雅的自定义云原生开发环境。

环境启动成功后:可点击右上角头像 --> 点击我的云原生开发 列表中查看对应的环境登陆地址等信息。

🥰 感谢

此工具编写过程中,用了如下优秀的库,在此感谢。

About

🎭基于云原生构建实现的仓库、分支、自定义云原生开发环境的一键创建及启动

10.15 MiB
3 forks0 stars2 branches0 TagREADMEMIT license
Language
Go95.9%
Makefile3.5%
Dockerfile0.6%