更新时间:2021/10/11
最近我将 VSCode Server 从 AWS 迁移到了 Azure 云平台,并且集成了 OAuth2 。具体的实现见 Out-of-the-Box-CodeServer。新的实现方案可以做到:
1、关闭浏览器一定时间后自动关闭服务器以停止计费;
2、使用 GitHub OAuth2 登录;
3、使用自定义域名访问。
前不久 GitHub 官方 Twitter 发了一个如下的 Tweet:

只要你在任何 GitHub Repo 页面上按下.键会自动跳转到github.dev的网站,此网站是一个网页版的 VSCode 并且会自动克隆下这个 Repo 的代码。在这个网页版的 VSCode 里你甚至可以安装一些特定的插件(无法安装需要外部依赖的插件),能更方便的阅读代码。因为这个网站是官方出品,这个 VSCode 已自动绑定了你的 GitHub 账户,开发者可以在里面阅读、编辑及提交代码,整个过程行云流水,甚至全程不需要打开本地的 IDE。此举直接干掉了 github1s 这个具备类似功能的开源项目。
在浏览器写代码还能拥有桌面 IDE 的开发体验,是 IT 行业一直在追求的。VSCode 的团队负责人 Erich Gamma(JUnit 作者之一,《设计模式》作者之一,Eclipse 架构师) 在 2011 年入职微软后的工作内容就是:
Envision new paradigms for online developer tooling that will be as successful as the IDE has been for the desktop.
之后才有了 VSCode 的诞生。可以说 VSCode 从诞生之处就朝着云端 IDE 的方向去设计。
为什么要使用云端 IDE?这源于本地开发环境的一些问题,比如:
而解决这些问题的终极办法就是把开发环境搬到云端,而在云端开发最重要的就是需要一个好的 IDE 支持,这也导致了行业对云端 IDE 强烈的需求。
在说云端 IDE 前我们先了解下 IDE 的一些主要功能点,如下图所示:

一个优秀的 IDE 当然要让程序员写代码写的爽,看代码看的溜。而要达到这个目的,必不可少的要支持以下功能点:
在桌面级 IDE 里,这些功能都不是事,有很多 IDE 支持这些功能,比如 Visual Studio、Eclipse、IntelliJ IDEA、NetBeans 及 Xcode 等。但以支持在线使用的维度看,这些老牌 IDE 都不行。
早期行业里对云端 IDE 的要求也不高,所以有了大约三个大的类别的云端 IDE,如下图:

在上述功能受限的云 IDE 类别里面有一些基于 VSCode 而实现的云 IDE,比如 Github Codespaces 使用了 VSCode 结合 Azure 云服务器可以给予开发者桌面 IDE 的体验,也可以安装插件。同时在最受欢迎的开发者社区 StackOverflow 的一份 2021 Developer Survey 调查问卷里的 Integrated development environment(IDE) 部分中(共八万多个开发者调查反馈),VSCode 以 71% 的高票(2019 年这个占比已经到了 50%)当选最受欢迎的 IDE:

看起来 VSCode 达到了云 IDE 想要实现的终极目标:与桌面级 IDE 一样的开发体验。这里的问题是为什么是 VSCode 呢?
VSCode 远程开发模式如下图所示:

通过 CS 架构设计让 VSCode 具备使用远程服务器或容器的能力,本地的 VSCode 只负责 UI 界面与主题的显示,其他的如插件、程序运行、终端进程与调试器都运行在远程服务器上。界面显示与计算分离的设计,这也是实现云 IDE 很重要的一点。
CS 架构设计也体现在代码提示上,通过制定Language Server Protocol标准协议,VSCode 核心无需解析多种编程语言的 AST 或实现多个编程语言 Parser,而将这些功能委托给各语言的插件来实现,保证了核心非常小巧且稳定。
同样的设计也体现在了调试器(Debugger)与Debug Adaptor Protocol标准协议上。
更多的架构设计分析可以看我的这篇 VSCode插件开发小记。
VSCode 的前身是 monaco-editor 在线编辑器。作为一个 Web 软件,想要实现跨平台功能,就需要使用Electron技术。所以桌面级的 VSCode 和服务器端 Web 版的 VSCode 其实是一个代码库。
正因为其是一个 Web 软件,才有了 code-server 这个第三方 Repo 的出现,也才有了运行在浏览器里的 VSCode。这才导致了众多基于 VSCode 的云 IDE 的出现。
VSCode 如果没有开源,结局可能大不相同。正是有了微软华丽的转身,对开源的热情拥抱,才打开了 VSCode 走向世界的大门,否则结局可能是沦落为微软众多内部项目的一员。
由于 VSCode 的开源和 Web 特性,让我们可以快速搭建一个基于 VSCode 的个人云 IDE,功能对标 Github Codespaces,但比其便宜很多。
我的实现见这个 Repo。架构如下:

前置条件:
使用非常简单(得益于 Pulumi 和 AWS CLI 的强大功能):
git clone https://github.com/bmpi-dev/code.bmpi.dev.git
cd code.bmpi.dev/server
pulumi up # 使用 Pulumi 设置 AWS EC2
./run work # 打开远程 VSCode
./run rest # 关闭远程 VSCode
如果./run open_tunnel因为服务器还在启动时通道无法连接,可在服务器启动后再次执行即可建立通道连接。
首次访问需要输入 VSCode 的登录密码,通过执行sh connect-server.sh登录服务器后执行cat ~/.config/code-server/config.yaml | grep password:获取登陆密码。
通过浏览器访问http://localhost:8888/后即可开始使用远端 VSCode:

如果暂时不需要这个环境了记得通过./run rest休眠这台云服务器,服务器在关闭后 AWS 就不对该 EC2 实例计费了,只对存储卷收取很便宜的费用。
如果你彻底不需要这个环境,想销毁所有资源免得 AWS 继续收费,只需要执行pulumi destroy即可删除所有 AWS 资源。
服务器因安全原因一般只会开启特定端口供客户端远程访问。Code Server 只开放了 8888 端口,但这对开发来说很不方便。我们在开发过程中,经常需要不同的端口来测试,比如通过多个端口连接多个 Web Server 或中间件服务等。
一种解决方案是通过临时端口转发来允许远端客户端访问,但这种方法需要不停的修改服务器防火墙配置,不是很方便。
另外一种方案可以通过建立客户端和服务器的 VPN 网络,以使客户端和服务器在同一个虚拟网络之中。我用 tailscale 来实现搭建一个本地电脑和远端服务器间的 VPN 网络。一旦配置好 tailscale 后,Code Server 就变成本地电脑可以直接访问的服务器了。同时安全性也有保障。
以AWS EC2 T2.Medium 实例(2 核 4GB 内存 + 50GB 存储)为例。每天开发 5 小时,每月 20 天共100小时,总成本为 $0.0464 * 100 + $0.1 * 50 = $9.64。相同的服务器配置 Github Codespaces 需要 21.5 美元,相差近 2.23 倍。
云 IDE 代表了一种研发模式的发展方向。这种研发模式可能的发展趋势有:
一句话总结就是:
Cloud IDE, Coding Anytime Anywhere.
更新时间:2021/10/11
最近我将 VSCode Server 从 AWS 迁移到了 Azure 云平台,并且集成了 OAuth2 。具体的实现见 Out-of-the-Box-CodeServer。新的实现方案可以做到:
1、关闭浏览器一定时间后自动关闭服务器以停止计费;
2、使用 GitHub OAuth2 登录;
3、使用自定义域名访问。
前不久 GitHub 官方 Twitter 发了一个如下的 Tweet:

只要你在任何 GitHub Repo 页面上按下.键会自动跳转到github.dev的网站,此网站是一个网页版的 VSCode 并且会自动克隆下这个 Repo 的代码。在这个网页版的 VSCode 里你甚至可以安装一些特定的插件(无法安装需要外部依赖的插件),能更方便的阅读代码。因为这个网站是官方出品,这个 VSCode 已自动绑定了你的 GitHub 账户,开发者可以在里面阅读、编辑及提交代码,整个过程行云流水,甚至全程不需要打开本地的 IDE。此举直接干掉了 github1s 这个具备类似功能的开源项目。
在浏览器写代码还能拥有桌面 IDE 的开发体验,是 IT 行业一直在追求的。VSCode 的团队负责人 Erich Gamma(JUnit 作者之一,《设计模式》作者之一,Eclipse 架构师) 在 2011 年入职微软后的工作内容就是:
Envision new paradigms for online developer tooling that will be as successful as the IDE has been for the desktop.
之后才有了 VSCode 的诞生。可以说 VSCode 从诞生之处就朝着云端 IDE 的方向去设计。
为什么要使用云端 IDE?这源于本地开发环境的一些问题,比如:
而解决这些问题的终极办法就是把开发环境搬到云端,而在云端开发最重要的就是需要一个好的 IDE 支持,这也导致了行业对云端 IDE 强烈的需求。
在说云端 IDE 前我们先了解下 IDE 的一些主要功能点,如下图所示:

一个优秀的 IDE 当然要让程序员写代码写的爽,看代码看的溜。而要达到这个目的,必不可少的要支持以下功能点:
在桌面级 IDE 里,这些功能都不是事,有很多 IDE 支持这些功能,比如 Visual Studio、Eclipse、IntelliJ IDEA、NetBeans 及 Xcode 等。但以支持在线使用的维度看,这些老牌 IDE 都不行。
早期行业里对云端 IDE 的要求也不高,所以有了大约三个大的类别的云端 IDE,如下图:

在上述功能受限的云 IDE 类别里面有一些基于 VSCode 而实现的云 IDE,比如 Github Codespaces 使用了 VSCode 结合 Azure 云服务器可以给予开发者桌面 IDE 的体验,也可以安装插件。同时在最受欢迎的开发者社区 StackOverflow 的一份 2021 Developer Survey 调查问卷里的 Integrated development environment(IDE) 部分中(共八万多个开发者调查反馈),VSCode 以 71% 的高票(2019 年这个占比已经到了 50%)当选最受欢迎的 IDE:

看起来 VSCode 达到了云 IDE 想要实现的终极目标:与桌面级 IDE 一样的开发体验。这里的问题是为什么是 VSCode 呢?
VSCode 远程开发模式如下图所示:

通过 CS 架构设计让 VSCode 具备使用远程服务器或容器的能力,本地的 VSCode 只负责 UI 界面与主题的显示,其他的如插件、程序运行、终端进程与调试器都运行在远程服务器上。界面显示与计算分离的设计,这也是实现云 IDE 很重要的一点。
CS 架构设计也体现在代码提示上,通过制定Language Server Protocol标准协议,VSCode 核心无需解析多种编程语言的 AST 或实现多个编程语言 Parser,而将这些功能委托给各语言的插件来实现,保证了核心非常小巧且稳定。
同样的设计也体现在了调试器(Debugger)与Debug Adaptor Protocol标准协议上。
更多的架构设计分析可以看我的这篇 VSCode插件开发小记。
VSCode 的前身是 monaco-editor 在线编辑器。作为一个 Web 软件,想要实现跨平台功能,就需要使用Electron技术。所以桌面级的 VSCode 和服务器端 Web 版的 VSCode 其实是一个代码库。
正因为其是一个 Web 软件,才有了 code-server 这个第三方 Repo 的出现,也才有了运行在浏览器里的 VSCode。这才导致了众多基于 VSCode 的云 IDE 的出现。
VSCode 如果没有开源,结局可能大不相同。正是有了微软华丽的转身,对开源的热情拥抱,才打开了 VSCode 走向世界的大门,否则结局可能是沦落为微软众多内部项目的一员。
由于 VSCode 的开源和 Web 特性,让我们可以快速搭建一个基于 VSCode 的个人云 IDE,功能对标 Github Codespaces,但比其便宜很多。
我的实现见这个 Repo。架构如下:

前置条件:
使用非常简单(得益于 Pulumi 和 AWS CLI 的强大功能):
git clone https://github.com/bmpi-dev/code.bmpi.dev.git
cd code.bmpi.dev/server
pulumi up # 使用 Pulumi 设置 AWS EC2
./run work # 打开远程 VSCode
./run rest # 关闭远程 VSCode
如果./run open_tunnel因为服务器还在启动时通道无法连接,可在服务器启动后再次执行即可建立通道连接。
首次访问需要输入 VSCode 的登录密码,通过执行sh connect-server.sh登录服务器后执行cat ~/.config/code-server/config.yaml | grep password:获取登陆密码。
通过浏览器访问http://localhost:8888/后即可开始使用远端 VSCode:

如果暂时不需要这个环境了记得通过./run rest休眠这台云服务器,服务器在关闭后 AWS 就不对该 EC2 实例计费了,只对存储卷收取很便宜的费用。
如果你彻底不需要这个环境,想销毁所有资源免得 AWS 继续收费,只需要执行pulumi destroy即可删除所有 AWS 资源。
服务器因安全原因一般只会开启特定端口供客户端远程访问。Code Server 只开放了 8888 端口,但这对开发来说很不方便。我们在开发过程中,经常需要不同的端口来测试,比如通过多个端口连接多个 Web Server 或中间件服务等。
一种解决方案是通过临时端口转发来允许远端客户端访问,但这种方法需要不停的修改服务器防火墙配置,不是很方便。
另外一种方案可以通过建立客户端和服务器的 VPN 网络,以使客户端和服务器在同一个虚拟网络之中。我用 tailscale 来实现搭建一个本地电脑和远端服务器间的 VPN 网络。一旦配置好 tailscale 后,Code Server 就变成本地电脑可以直接访问的服务器了。同时安全性也有保障。
以AWS EC2 T2.Medium 实例(2 核 4GB 内存 + 50GB 存储)为例。每天开发 5 小时,每月 20 天共100小时,总成本为 $0.0464 * 100 + $0.1 * 50 = $9.64。相同的服务器配置 Github Codespaces 需要 21.5 美元,相差近 2.23 倍。
云 IDE 代表了一种研发模式的发展方向。这种研发模式可能的发展趋势有:
一句话总结就是:
Cloud IDE, Coding Anytime Anywhere.