如何优雅的在本地环境用 VSCode 管理 GitHub 仓库
![长治网络安全等级保护,长治等保,长治网安备案,网站制作,网站建站,网站运维,Linux系统运维,Windows系统运维,服务器运维,环境部署,环境搭建,私有云存储 长治网络安全等级保护,长治等保,长治网安备案,网站制作,网站建站,网站运维,Linux系统运维,Windows系统运维,服务器运维,环境部署,环境搭建,私有云存储](../upload/202208/1660539440.jpeg)
Gitpod[1]是一个可以直接打开 Github 项目的的网页版 VSCode, 我一开始使用的时候, 它仅提供了网页版, 使用起来十分不便. 前些天再去试用时, 发现已经可以直接打开本地的 VScode, 类似 remote ssh 的功能, 感觉这个工具潜力很大, 有兴趣的读者可以找个 Github 项目探索下. 这里我就简单分析下使用方式和原理, 后半部分是对于开发模式和开发工具未来方向的探讨.
我是 Python 后端的程序员, 主要负责 PaaS 平台的治理, 博客中的描述仅仅是自己的一些见解.
简单使用
安装Gitpod 插件[2], 或是直接用 Github 帐号登录Gitpod[3] 找个 Github 项目打开
![长治网络安全等级保护,长治等保,长治网安备案,网站制作,网站建站,网站运维,Linux系统运维,Windows系统运维,服务器运维,环境部署,环境搭建,私有云存储 长治网络安全等级保护,长治等保,长治网安备案,网站制作,网站建站,网站运维,Linux系统运维,Windows系统运维,服务器运维,环境部署,环境搭建,私有云存储](../upload/202208/1660539383.png)
网页端效果
![长治网络安全等级保护,长治等保,长治网安备案,网站制作,网站建站,网站运维,Linux系统运维,Windows系统运维,服务器运维,环境部署,环境搭建,私有云存储 长治网络安全等级保护,长治等保,长治网安备案,网站制作,网站建站,网站运维,Linux系统运维,Windows系统运维,服务器运维,环境部署,环境搭建,私有云存储](../upload/202208/1660539364.png)
现在也支持了在本地 VSCode 中打开, 打开后的效果就和普通的 remote ssh 一致
![长治网络安全等级保护,长治等保,长治网安备案,网站制作,网站建站,网站运维,Linux系统运维,Windows系统运维,服务器运维,环境部署,环境搭建,私有云存储 长治网络安全等级保护,长治等保,长治网安备案,网站制作,网站建站,网站运维,Linux系统运维,Windows系统运维,服务器运维,环境部署,环境搭建,私有云存储](../upload/202208/1660539390.png)
跳转过去之后, 会先安装 Gitpod 插件, 然后再打开
如果你想用本地的 ssh 登录, 也可以, 看这里就能看到具体的 ssh 配置
![长治网络安全等级保护,长治等保,长治网安备案,网站制作,网站建站,网站运维,Linux系统运维,Windows系统运维,服务器运维,环境部署,环境搭建,私有云存储 长治网络安全等级保护,长治等保,长治网安备案,网站制作,网站建站,网站运维,Linux系统运维,Windows系统运维,服务器运维,环境部署,环境搭建,私有云存储](../upload/202208/1660539561.png)
这是登录命令:
ssh -F /tmp/gitpod_ssh_config-216243-zxK2tQ5tHG0H moccasin-capybara-78upia72
Pod 内部信息以及 ssh 工作工作原理解析
![长治网络安全等级保护,长治等保,长治网安备案,网站制作,网站建站,网站运维,Linux系统运维,Windows系统运维,服务器运维,环境部署,环境搭建,私有云存储 长治网络安全等级保护,长治等保,长治网安备案,网站制作,网站建站,网站运维,Linux系统运维,Windows系统运维,服务器运维,环境部署,环境搭建,私有云存储](../upload/202208/1660540083.png)
Pod 内部是用 supervisor 来启动, sshd, vscode web 服务是比较正常的, 令人比较意外的是它支持了 docker 内部运行 docker.
# 系统是`Ubuntu 20.04`
gitpod ~ $ cat /etc/*-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.2 LTS"
# 可以直接切换到root用户
gitpod ~ $ sudo su
# 用visudo来看的话, 可以看到在sudo组里的用户不需要root权限密码
# gitpod ~ $ visudo
# %sudo ALL=NOPASSWD:ALL
# 这个地址是来自于GCP
gitpod ~ $ curl ip.sb
34.127.117.8
# 这个workspace目录是挂载进来的, 所以上面的内容应该会保留
# 我有点奇怪, 为什么不把它挂到 /home/gitpod/workspace, 感觉可能更加合理
gitpod ~ $ df -Th
/dev/md42 xfs 30G 114M 30G 1% /workspace
# 本地启动了sshd服务, 不过端口不是默认22, 而是23001, 但是这里权限给的太大了, 这个sshd监听127.0.0.1就可以了
gitpod / $ sudo ss -tunlp
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
tcp LISTEN 0 128 10.0.2.100:40799 0.0.0.0:* users:(("supervisor",pid=1,fd=38))
tcp LISTEN 0 511 127.0.0.1:40799 0.0.0.0:* users:(("node",pid=1084,fd=19))
tcp LISTEN 0 128 *:22999 *:* users:(("supervisor",pid=1,fd=10))
tcp LISTEN 0 511 *:23000 *:* users:(("node",pid=348,fd=19))
tcp LISTEN 0 128 *:23001 *:* users:(("supervisor",pid=1,fd=8))
supervisor 进程
我一开始以为这个 supervisor 是 Python 的那个, 后来我去Github 官网[4]找了找代码, 发现它是一个自己写的 Golang 服务:
![长治网络安全等级保护,长治等保,长治网安备案,网站制作,网站建站,网站运维,Linux系统运维,Windows系统运维,服务器运维,环境部署,环境搭建,私有云存储 长治网络安全等级保护,长治等保,长治网安备案,网站制作,网站建站,网站运维,Linux系统运维,Windows系统运维,服务器运维,环境部署,环境搭建,私有云存储](../upload/202208/1660539592.png)
VScode 远程连接方式
使用本地的 VScode 打开时, 可以看到这里有一个ssh target
![长治网络安全等级保护,长治等保,长治网安备案,网站制作,网站建站,网站运维,Linux系统运维,Windows系统运维,服务器运维,环境部署,环境搭建,私有云存储 长治网络安全等级保护,长治等保,长治网安备案,网站制作,网站建站,网站运维,Linux系统运维,Windows系统运维,服务器运维,环境部署,环境搭建,私有云存储](../upload/202208/1660540251.png)
其中的配置文件类似如下:
Host moccasin-capybara-78upia72
HostName 127.0.0.1
User gitpod
Port 36129
IdentityFile /tmp/gitpod_bb1491a6-d26d-4e40-b0ae-d0b34a2d19f3_id_rsa
看起来它是直接连接了一个本地的端口, 具体这个端口是谁创建的呢, 找了一下是gitpod-local-co
, 这个操作应该是类似 frp 的 stcp 模式, 把远程的 ssh 端口映射到了本地.
$ ss -tunlp | grep 36129
tcp LISTEN 0 4096 127.0.0.1:36129 0.0.0.0:* users:(("gitpod-local-co",pid=217415,fd=14))
su root
visudo 可以看到%sudo 组的用户可以不需要密码直接切换到 root, gitpod 属于这个组, 所以 sudo 命令直接可以用.
需要考虑的问题
VScode 当前只允许添加一个 ssh 配置文件, 因此会令用户自己的配置文件失效, 很坑
![长治网络安全等级保护,长治等保,长治网安备案,网站制作,网站建站,网站运维,Linux系统运维,Windows系统运维,服务器运维,环境部署,环境搭建,私有云存储 长治网络安全等级保护,长治等保,长治网安备案,网站制作,网站建站,网站运维,Linux系统运维,Windows系统运维,服务器运维,环境部署,环境搭建,私有云存储](../upload/202208/1660539801.png)
pod 内部的 ssh 端口, 应该仅监听 127.0.0.1, 因为这个端口是被映射出去使用的, 避免 Pod 直接被外部访问
pod 的 ssh key 要注意, 每次生成 pod 时要重新产生
pod 的生命周期一点要短, 最好 VScode 关闭时就马上退出, 也许有人认为 pod 应该一直在后台运行, 但是这样其实加大了风险, 如果想要运行后台类型的任务, 应该用在线的容器, 而不是开发工具中的容器, 而且这个容器一旦出现安全问题, 可能会影响这个用户的所有仓库.
每个用户的每个应用都要有自己单独的 pod, 避免互相影响.
鉴权很重要, 需要在穿透建立连接时就把权限控制做好, 只有有权限的用户才会在本地建立连接端口, 内网穿透时, 没有权限的用户就不给做
如何防止被用户滥用, 我们提供了一个完整功能的 root shell, 别有用心的用户一定会薅羊毛挖矿.
几个短期优化点
抽离主要代码: Gitpod 中当前服务端, 应该做成一个单独的服务. 启动之后, 可以直接在 Gitpod 网页后台中看到, 并且可以直接调用 VScode 打开工作区, 这样, 可以在用户自己的容器中运行服务端, 解决用户自建容器的内网穿透和 VSCode web 版无法使用的功能, 这个才是个人用户想要的功能
自定义镜像功能: 针对某个仓库, 应该允许用户自定义 Dockerfile, 或是自定义镜像, 间接实现开发环境规范化
实现秒开: 因为 Pod 需要在 VScode 关闭后停止服务, 那么用户下次打开时, 如何做到秒开呢? 我认为可以在关闭时, 删除 ssh key, 动态的调整 cpu 到 0.01 核, 确保无法访问, 无法对外服务. 用户重新打开时, 再生成新的 key, 调大 cpu 限制, 相比于重新启动容器应该会快很多.
服务对外访问: 对于后台代码, 修改之后能够立刻看到效果是最重要的, 可以利用 VSCode 的端口映射功能转给本地. 需要给别人演示时, 也可以将端口临时映射到公网或是功能开发环境中.
本地开发环境的劣势
每个人的开发环境很容易不一致, 即使有详细的代码规范, 每个人需要针对代码在本地重新配置一份环境
代码提示工具对性能的要求越来越高, 我在本地上用 TabNine, 一个项目内存会占到 10 多个 G, 我 16G 的电脑不够用的. 还有 Copilot, 我本地也不敢用
个人的电脑很少会考虑磁盘冗余技术, 备份很可能也不经常进行, 可能存在代码文件丢失问题
开发环境上云应该是一种趋势, 无论是 VScode 的 remote ssh 功能, 还是 JetBrains 新推出的Fleet[5], 都传达出了这么一种信号.
Gitpod 未来发展
确立主要用途: 从我个人角度来看, Gitpod 十分适合于远程调试开发和调试非编译型语言, 尤其适合于
Python
,Ruby
,NodeJS
, 甚至对于Python
应用, 完全可以把线上环境容器打包重新启动, 在 Gitpod 中的环境中进行开发调试, 相当于拥有了一个与线上环境完全一致的开发环境.个人版与企业版分离: 针对个人开发者, 提供公有云服务, 可以考虑计费. 针对企业应该提供企业版, 因为未来即使有远程开发环境的功能一定是企业内部自建的, 因为它们不太可能将内部代码放在公有云环境中, 如果能提供一套适合企业的解决方案, 并且有人用, 应该能长久运营.
总结
我之前就有在使用github1s
和github.dev
来读代码, 直到发现了 Gitpod. 相比于前两个仅能读代码的功能, Gitpod 提供了更加完善的体验, 你可以利用它 push 代码, 可以完整的接手开发工作, 这一点带给用户的体验会很好. 希望社区版能长久的存活下去吧, 我的开源项目不多, 如果真的有需要, 我很愿意进一步使用这个工具并且付费.
我不是产品经理, 后面的内容单单就我自己的看法探讨一下项目未来的发展趋势, 可能就是在瞎扯吧.
引用链接
Gitpod: https://www.gitpod.io/
[2]Gitpod 插件: https://www.gitpod.io/docs/browser-extension
[3]Gitpod: https://www.gitpod.io/
[4]Github 官网: https://github.com/gitpod-io/gitpod
[5]Fleet: https://www.jetbrains.com/remote-development/
原文链接:https://tinyurl.com/m5ux8pzy
本文转载自:「云原生实验室」,原文:https://tinyurl.com/mr2wh66a,版权归原作者所有。