一个项目,如何让你在CNB天天起飞#3
在 CNB 中,构建以及开发都是基于云原生环境构筑的,因此镜像成为这些操作的底层环境支撑,默认情况下,官方会以 cnbcool/default-dev-env:latest 作为拉起环境的基础镜像,但这个镜像只做了通用的基础封装,我们可以自己封装一些镜像,来作为开发与构建的基础环境。
cnbcool/default-dev-env:latest
打造一个趁手的基础镜像,这是我从接触CNB一开始就在做的事情,经过长时间的打磨与优化,我做出了一个近乎完美的云开发环境,它容纳了大量的效率实践,能涵盖你开发过程中的各种场景,下边我会逐一介绍,带你领略优雅的运维魅力。
项目主页图:
可以点击视频快速了解项目:
视频号视频ID:export/UzFfAgtgekIEAQAAAAAAWo44dUo6kAAAAAstQy6ubaLX4KHWvLEZgBPE-aJsdVUDWeqIzNPgMJqFMYFM7O116mRyPV5gLEao
export/UzFfAgtgekIEAQAAAAAAWo44dUo6kAAAAAstQy6ubaLX4KHWvLEZgBPE-aJsdVUDWeqIzNPgMJqFMYFM7O116mRyPV5gLEao
第一步:Fork 项目
访问开源项目地址:https://cnb.cool/znb/qifei,点击右上角 Fork 按钮,将项目复制到你的组织下。
Fork
第二步:点击起飞
点击右上角起飞按钮,即可享受该项目。
在 CNB 中,你可以通过 .cnb/settings.yml 配置文件,自定义项目的一些基础信息。我这里定义了Fork和Issue以及启动云开发的自定义背景图,配置如下:
.cnb/settings.yml
Issue
云开发
workspace: launch: button: name: 🛫 起飞 description: 💪 逐步迈向运维的四个现代化:规范化,标准化,高效化,优雅化 hoverImage: .cnb/qifei.gif cpus: 16 disabled: false autoOpenWebIDE: false issue: button: description: 🙋🏻♀️ I Have A Question hoverImage: ".cnb/jushou.jpg" fork: button: description: 🫵 年轻人,你很眼光 hoverImage: ".cnb/trump.gif"
更多配置,详见官方文档:UI 定制
三个按钮的效果如下:
项目镜像默认提供了 golang 和 nodejs 的开发环境,对应版本信息分别如下:
因个人常用开发语言是这两个,因此默认集成了这两个语言,欢迎使用其他语言开发的同学,参考当前项目,定制贡献其他语言的环境。
即便是临时使用的 VScode 终端,也不能将就。
于是,经过一番探索,我把本地终端提效利器 Oh My ZSH 集成到了云开发环境中。
Oh My ZSH
配置定义如下:
# set bash to zsh RUN sh -c "$(wget -O- https://github.com/deluan/zsh-in-docker/releases/download/v1.2.1/zsh-in-docker.sh)" -- \ -t https://github.com/skylerlee/zeta-zsh-theme \ -p https://github.com/paulirish/git-open \ -p git -p ssh-agent -p 'history-substring-search' -p z -p wd \ -p sudo -p extract -p hitokoto -p colored-man-pages -p docker -p docker-compose \ -p https://github.com/zsh-users/zsh-autosuggestions \ -p https://github.com/zsh-users/zsh-syntax-highlighting \ -p https://github.com/zdharma-continuum/fast-syntax-highlighting \ chsh -s /bin/zsh root RUN echo 'exec zsh' >> /root/.bashrc &&\ echo '# custom alias' > ~/.aliases.zsh &&\ echo 'alias src="source ~/.zshrc"' >> ~/.aliases.zsh &&\ echo 'alias cl="clear"' >> ~/.aliases.zsh &&\ echo 'alias bash="zsh"' >> ~/.aliases.zsh &&\ echo 'alias gop="git-open"' >> ~/.aliases.zsh &&\ echo 'alias dp="docker ps"' >> ~/.aliases.zsh &&\ echo 'alias di="docker images"' >> ~/.aliases.zsh &&\ echo 'alias cdw="cd /workspace"' >> ~/.aliases.zsh &&\ echo 'alias docker-compose="docker compose"' >> ~/.aliases.zsh &&\ echo 'alias ll="ls -lhtr"' >> ~/.aliases.zsh &&\ echo 'alias ..="cd .."' >> ~/.aliases.zsh &&\ echo 'alias ...="cd ../.."' >> ~/.aliases.zsh &&\ echo 'alias g="git"' >> ~/.aliases.zsh &&\ echo 'alias ping="docker run --rm --network host docker.cnb.cool/znb/images/alpine ping "' >> ~/.aliases.zsh &&\ echo 'alias gping="docker run --rm -ti --network host docker.cnb.cool/znb/images/gping "' >> ~/.aliases.zsh &&\ echo "alias openw='python3 -m webbrowser \"\$CNB_VSCODE_WEB_URL\"'" >> ~/.aliases.zsh &&\ echo "alias openv='python3 -m webbrowser \"\$CNB_VSCODE_REMOTE_SSH_SCHEMA\"'" >> ~/.aliases.zsh &&\ echo 'open() { python3 -m webbrowser "http://localhost:$1"; }' >> ~/.aliases.zsh &&\ echo 'openr() { python3 -m webbrowser "$(echo "${CNB_VSCODE_PROXY_URI//\{\{port\}\}/$1}")"; }' >> ~/.aliases.zsh &&\ echo "alias opendoc='python3 -m webbrowser https://cnb.cool/znb/qifei/-/issues/3'" >> ~/.aliases.zsh &&\ echo 'source ~/.aliases.zsh' >> ~/.zshrc # 添加以下RUN命令来填充历史命令 RUN echo ': 1751940881:0;vim Dockerfile' >> /root/.zsh_history && \ echo ': 1751940882:0;vim docker-compose.yaml' >> /root/.zsh_history && \ echo ': 1751940883:0;docker-compose up -d' >> /root/.zsh_history && \ echo ': 1751940884:0;docker ps -a' >> /root/.zsh_history && \ echo ': 1751940885:0;open 8888' >> /root/.zsh_history CMD [ "/bin/zsh" ]
我在定义环境时集成了一些 alias 快捷命令,具体内容可看上边内容,这里捡一些比较典型的介绍下,让你了解并用起来:
cl
gop
di
dp
cdw
..
...
openw
个人头像
我的云原生开发
openv
open
open 8888
http://localhost:8888
openr
openr 8888
https://parye2fki0-8888.cnb.run/
当前,在WebIDE中打开远程访问端口,还需要进行二次确认,这个问题会在不久的将来发版中解决,让你真正一键打开。关于此功能的讨论,详见:cnb/feedback#1183
opendoc
默认安装了这些插件:git-open, git, ssh-agent, history-substring-search, z, wd, sudo, extract, hitokoto, colored-man-pages, docker, docker-compose, zsh-autosuggestions, zsh-syntax-highlighting, fast-syntax-highlighting,挑一些比较有代表性的来介绍下。
git-open
git
ssh-agent
history-substring-search
z
wd
sudo
extract
hitokoto
colored-man-pages
docker
docker-compose
zsh-autosuggestions
zsh-syntax-highlighting
fast-syntax-highlighting
z 关键字
之所以把这个终端环境打造的如此舒服,就是因为 CNB 的优势在于,它不仅给我们提供了临时的开发环境,还几乎给我们提供了一台随时可用的服务器,如果想要做什么实验,或者搭建什么临时环境,都可以在这个临时服务器上完成,用完销毁即刻,也不用担心因为不熟悉把本地环境搞坏。
一个优雅的开发环境,怎能少了常用的数据库等环境,别急,qifei 仓库已为你贴心集成。
假如你现在开发的项目需要一个 MySQL 环境,只需如下命令:
只需要两条命令,依赖的 MySQL 环境,就已到位。
除了 MySQL,还集成了 Redis,MongoDB,PostgreSQL 几个数据库,均可在 README 中看到:
再分享下我是如何实现拉起环境,就能快速跳转的,上文介绍过 z 这个插件,并且 z 还提供了一个 --add 指令,用于将指定目录填写到列表中,于是,我在 .cnb/vscode.yml 中做了如下定义:
--add
.cnb/vscode.yml
stages: - name: start script: | current_time=$(date +%s) find /workspace/letsfly -mindepth 1 -maxdepth 2 -type d | while read dir do echo "$dir|1000|$current_time" done >> /root/.z
用于把提供的工具快捷方式写入到列表,使得这些项目均可以通过 z 关键字 的方式,跳转到对应目录。目录列表如下:
上边介绍了数据库的拉起,同时我也在环境中集成了 mysql 等命令行客户端,但这仍然非常低效,不符合我们高效的宗旨。
别急,vscode 的插件 database 解你忧,它支持如下截图中的中间件连接管理,几乎涵盖了你开发场景中能遇到的所有存储。
插件提供付费订阅的计划,不过免费版限制最多 3 个连接,对我们临时开发环境来说,足够使用了。
除了开发环境的集成,项目还内置了一批个人感觉很不错的开源项目的 compose,可供一键拉起,快速体验。
目前配置的项目列表如下:
你如果还有更好玩的项目,欢迎提交 PR 贡献你的项目。
除了如上介绍的各种摆在面上的可以利用的提效工具之外,qifei 还内置了不少优秀的工具,奉献给懂的人。
air:go 语言编写的热加载工具,开发 go 语言项目的时候,可以直接使用。 upx:优秀的二进制压缩工具,无论是在云原生开发还是云原生构建环境中,都可以直接使用。 gox:go 语言多架构平台二进制并发交叉编译的工具。
air
upx
gox
gping:更强大的 ping 检测命令。(这个工具通过如上展示过的 alish 命令定义)
gping
运行 gping cnb.run tencent.com eryajf.net,执行效果如下:
gping cnb.run tencent.com eryajf.net
dufs:让云开发过程中产生的制品,在本地下载。
dufs
CNB 是一个开启程序员开发构建新篇章的一个产品,善用各种效率工具,借助其提供的能力,可以实现各种玩法。
欢迎大家来仓库交流更多优秀的玩法。
牛啊,cnb 开发环境届的瑞士军刀。
@sixther 拥有它,开发调试无忧。
@eryajf z 挺有意思的,感觉可以维护一个 cnb 的包管理系统,类似于 brew, yum,apt, z 可以列出有哪些中间件可以安装
z search z list z install
@eryajf z 挺有意思的,感觉可以维护一个 cnb 的包管理系统,类似于 brew, yum,apt, z 可以列出有哪些中间件可以安装,比如 z search z list z install
@eryajf z 挺有意思的,感觉可以维护一个 cnb 的包管理系统,类似于 brew, yum,apt, z 可以列出有哪些中间件可以安装,比如
@sixther 我没太明白你表达的场景呢,z 在这里应该主要是模糊匹配要 cd 的目录,更多是一个cd的增强,和包管理还不太一样吧。
cd
@eryajf 嗯,不一样,我看你这个也算是一个小型的包管理系统了, 包格式就是 docker-compose.yaml, 如果把定义一个贡献机制,用一个仓库来维护这些软件包,再配合一个命令行工具比如 cna (cloud native application), 似乎一个小型的cnb包管理体系就能建立起来了。
@sixther 是一个不错的思路,我思考思考看看怎么往这个方向进化一下
点赞,已Fork
请教个问题,cnb的开发环境如何 ssh-remote 连接到 Trae 等编辑器上呢?最近的VSCODE-预览版好像也看不上了
@dave_wang(王鹏_Dave) 我也遇到了类似的问题,但是官方默认的云原生开发镜像可以通过ssh-remote连接到vs-code,对比了下发现该项目的镜像默认shell是bash,官方的是zsh。然后我在webIDE执行chsh -s /usr/bin/zsh之后,ssh-remote就可以连接上了
chsh -s /usr/bin/zsh
调整 vscode.yml 配置:增加 HISTFILE 环境变量并延长超时时间至 24h。 cnb不是最多就支持最长16小时待机时间嘛,这个配置的作用是来干嘛呢
@cnb.aQvzaj44QGA(Xyz) 超过16小时只是随便配了一个更大阈值,满足启动之后可用一天就可以了
背景
在 CNB 中,构建以及开发都是基于云原生环境构筑的,因此镜像成为这些操作的底层环境支撑,默认情况下,官方会以
cnbcool/default-dev-env:latest作为拉起环境的基础镜像,但这个镜像只做了通用的基础封装,我们可以自己封装一些镜像,来作为开发与构建的基础环境。打造一个趁手的基础镜像,这是我从接触CNB一开始就在做的事情,经过长时间的打磨与优化,我做出了一个近乎完美的云开发环境,它容纳了大量的效率实践,能涵盖你开发过程中的各种场景,下边我会逐一介绍,带你领略优雅的运维魅力。
详解项目
简介
项目主页图:
可以点击视频快速了解项目:
视频号视频ID:
export/UzFfAgtgekIEAQAAAAAAWo44dUo6kAAAAAstQy6ubaLX4KHWvLEZgBPE-aJsdVUDWeqIzNPgMJqFMYFM7O116mRyPV5gLEao如何使用
第一步:Fork 项目访问开源项目地址:https://cnb.cool/znb/qifei,点击右上角
Fork按钮,将项目复制到你的组织下。第二步:点击起飞点击右上角起飞按钮,即可享受该项目。
自定义按钮
在 CNB 中,你可以通过
.cnb/settings.yml配置文件,自定义项目的一些基础信息。我这里定义了Fork和Issue以及启动云开发的自定义背景图,配置如下:workspace: launch: button: name: 🛫 起飞 description: 💪 逐步迈向运维的四个现代化:规范化,标准化,高效化,优雅化 hoverImage: .cnb/qifei.gif cpus: 16 disabled: false autoOpenWebIDE: false issue: button: description: 🙋🏻♀️ I Have A Question hoverImage: ".cnb/jushou.jpg" fork: button: description: 🫵 年轻人,你很眼光 hoverImage: ".cnb/trump.gif"更多配置,详见官方文档:UI 定制
三个按钮的效果如下:
开发语言环境
项目镜像默认提供了 golang 和 nodejs 的开发环境,对应版本信息分别如下:
因个人常用开发语言是这两个,因此默认集成了这两个语言,欢迎使用其他语言开发的同学,参考当前项目,定制贡献其他语言的环境。
终端支持 Oh My ZSH
即便是临时使用的 VScode 终端,也不能将就。
于是,经过一番探索,我把本地终端提效利器
Oh My ZSH集成到了云开发环境中。配置定义如下:
# set bash to zsh RUN sh -c "$(wget -O- https://github.com/deluan/zsh-in-docker/releases/download/v1.2.1/zsh-in-docker.sh)" -- \ -t https://github.com/skylerlee/zeta-zsh-theme \ -p https://github.com/paulirish/git-open \ -p git -p ssh-agent -p 'history-substring-search' -p z -p wd \ -p sudo -p extract -p hitokoto -p colored-man-pages -p docker -p docker-compose \ -p https://github.com/zsh-users/zsh-autosuggestions \ -p https://github.com/zsh-users/zsh-syntax-highlighting \ -p https://github.com/zdharma-continuum/fast-syntax-highlighting \ chsh -s /bin/zsh root RUN echo 'exec zsh' >> /root/.bashrc &&\ echo '# custom alias' > ~/.aliases.zsh &&\ echo 'alias src="source ~/.zshrc"' >> ~/.aliases.zsh &&\ echo 'alias cl="clear"' >> ~/.aliases.zsh &&\ echo 'alias bash="zsh"' >> ~/.aliases.zsh &&\ echo 'alias gop="git-open"' >> ~/.aliases.zsh &&\ echo 'alias dp="docker ps"' >> ~/.aliases.zsh &&\ echo 'alias di="docker images"' >> ~/.aliases.zsh &&\ echo 'alias cdw="cd /workspace"' >> ~/.aliases.zsh &&\ echo 'alias docker-compose="docker compose"' >> ~/.aliases.zsh &&\ echo 'alias ll="ls -lhtr"' >> ~/.aliases.zsh &&\ echo 'alias ..="cd .."' >> ~/.aliases.zsh &&\ echo 'alias ...="cd ../.."' >> ~/.aliases.zsh &&\ echo 'alias g="git"' >> ~/.aliases.zsh &&\ echo 'alias ping="docker run --rm --network host docker.cnb.cool/znb/images/alpine ping "' >> ~/.aliases.zsh &&\ echo 'alias gping="docker run --rm -ti --network host docker.cnb.cool/znb/images/gping "' >> ~/.aliases.zsh &&\ echo "alias openw='python3 -m webbrowser \"\$CNB_VSCODE_WEB_URL\"'" >> ~/.aliases.zsh &&\ echo "alias openv='python3 -m webbrowser \"\$CNB_VSCODE_REMOTE_SSH_SCHEMA\"'" >> ~/.aliases.zsh &&\ echo 'open() { python3 -m webbrowser "http://localhost:$1"; }' >> ~/.aliases.zsh &&\ echo 'openr() { python3 -m webbrowser "$(echo "${CNB_VSCODE_PROXY_URI//\{\{port\}\}/$1}")"; }' >> ~/.aliases.zsh &&\ echo "alias opendoc='python3 -m webbrowser https://cnb.cool/znb/qifei/-/issues/3'" >> ~/.aliases.zsh &&\ echo 'source ~/.aliases.zsh' >> ~/.zshrc # 添加以下RUN命令来填充历史命令 RUN echo ': 1751940881:0;vim Dockerfile' >> /root/.zsh_history && \ echo ': 1751940882:0;vim docker-compose.yaml' >> /root/.zsh_history && \ echo ': 1751940883:0;docker-compose up -d' >> /root/.zsh_history && \ echo ': 1751940884:0;docker ps -a' >> /root/.zsh_history && \ echo ': 1751940885:0;open 8888' >> /root/.zsh_history CMD [ "/bin/zsh" ]我在定义环境时集成了一些 alias 快捷命令,具体内容可看上边内容,这里捡一些比较典型的介绍下,让你了解并用起来:
cl:执行 clear 命令,清除当前屏幕终端上的任何信息。gop:执行git-open命令,功能是在CNB打开当前项目。顺便说一句,这个功能是我提交的反馈,详见:cnb/feedback#450di,dp:docker 相关的一些快捷别名。cdw:无论你在环境中去了哪里,执行之后让你回到工作目录。..,...:无需写入 cd,直接往上层和上上层目录返回。openw:表示打开当前项目的WebIDE界面,如果你当前在vscode界面中,想要跳转打开WebIDE界面,通常需要先到CNB中点击个人头像然后点击我的云原生开发,找到项目的WebIDE按钮,点击跳转。而有了这个别名,一条命令就让你实现跳转。openv:如上同理,如果你当前所在位置是WebIDE中,此时想要打开vscode远程开发,那么可以直接执行openv命令进行跳转,而不用再去个人主页查找。(实测发现对应变量的渲染需要通过vscode打开过之后才会生成)open:表示从本地打开要访问的端口。比如执行:open 8888则表示在浏览器打开http://localhost:8888。openr:表示从远程监听打开要访问的端口。比如执行:openr 8888则表示在浏览器打开https://parye2fki0-8888.cnb.run/opendoc:打开当前文档。如果你想详细了解这个项目有哪些最佳实践,可以通过opendoc打开文档来浏览。默认安装了这些插件:
git-open,git,ssh-agent,history-substring-search,z,wd,sudo,extract,hitokoto,colored-man-pages,docker,docker-compose,zsh-autosuggestions,zsh-syntax-highlighting,fast-syntax-highlighting,挑一些比较有代表性的来介绍下。zsh-autosuggestions:一个提供输入建议的插件。因为输入建议是基于历史命令来渲染的,为了让你新开环境时可以直接用一些常用操作,我把一些常用的几个 docker 拉起项目的操作写到了历史命令,这样打开终端之后,你可以直接执行,获得提醒,如下图,灰色部分是智能提示的候选内容。extract:任何压缩包,都可以在终端中,用 x 命令解压。zsh-syntax-highlighting:终端美化效果,自动对不同内容着色。z:zsh中强大的跳转插件,它自动解析历史执行过的cd命令,当你下次想要切换到哪个目录,通过z 关键字就能跳转。之所以把这个终端环境打造的如此舒服,就是因为 CNB 的优势在于,它不仅给我们提供了临时的开发环境,还几乎给我们提供了一台随时可用的服务器,如果想要做什么实验,或者搭建什么临时环境,都可以在这个临时服务器上完成,用完销毁即刻,也不用担心因为不熟悉把本地环境搞坏。
丰富的开发工具
一个优雅的开发环境,怎能少了常用的数据库等环境,别急,qifei 仓库已为你贴心集成。
假如你现在开发的项目需要一个 MySQL 环境,只需如下命令:
只需要两条命令,依赖的 MySQL 环境,就已到位。
除了 MySQL,还集成了 Redis,MongoDB,PostgreSQL 几个数据库,均可在 README 中看到:
再分享下我是如何实现拉起环境,就能快速跳转的,上文介绍过
z这个插件,并且z还提供了一个--add指令,用于将指定目录填写到列表中,于是,我在.cnb/vscode.yml中做了如下定义:stages: - name: start script: | current_time=$(date +%s) find /workspace/letsfly -mindepth 1 -maxdepth 2 -type d | while read dir do echo "$dir|1000|$current_time" done >> /root/.z用于把提供的工具快捷方式写入到列表,使得这些项目均可以通过
z 关键字的方式,跳转到对应目录。目录列表如下:database 插件
上边介绍了数据库的拉起,同时我也在环境中集成了 mysql 等命令行客户端,但这仍然非常低效,不符合我们高效的宗旨。
别急,vscode 的插件 database 解你忧,它支持如下截图中的中间件连接管理,几乎涵盖了你开发场景中能遇到的所有存储。
插件提供付费订阅的计划,不过免费版限制最多 3 个连接,对我们临时开发环境来说,足够使用了。
各种优秀开源项目即刻体验
除了开发环境的集成,项目还内置了一批个人感觉很不错的开源项目的 compose,可供一键拉起,快速体验。
目前配置的项目列表如下:
你如果还有更好玩的项目,欢迎提交 PR 贡献你的项目。
one more thing
除了如上介绍的各种摆在面上的可以利用的提效工具之外,qifei 还内置了不少优秀的工具,奉献给懂的人。
air:go 语言编写的热加载工具,开发 go 语言项目的时候,可以直接使用。upx:优秀的二进制压缩工具,无论是在云原生开发还是云原生构建环境中,都可以直接使用。gox:go 语言多架构平台二进制并发交叉编译的工具。gping:更强大的 ping 检测命令。(这个工具通过如上展示过的 alish 命令定义)运行
gping cnb.run tencent.com eryajf.net,执行效果如下:dufs:让云开发过程中产生的制品,在本地下载。结语
CNB 是一个开启程序员开发构建新篇章的一个产品,善用各种效率工具,借助其提供的能力,可以实现各种玩法。
欢迎大家来仓库交流更多优秀的玩法。