背景
作为一名开发者,每加入开发一个新项目,或者接手老项目也好,避不开需要搭建开发环境。开发环境的搭建避不开两个重要环境,语音环境搭建和网络环境搭建。以Nodejs开发的服务为例,本人在CSIG的DNSPod相关的Nodejs服务开发过程中,需要依赖腾讯云官网的各种不同环境的接口来完成业务,如登录态校验,CAPI等,还需要依赖Redis进行开发。在依赖devcloud开发机,使用本地开发服务,几乎不可能。因为本地办公网络与后端服务网络不通,需要搭建跳板机等手段来实现互通。整体的开发成本很高,希望有一套完善的方案来解决网络问题,以及降低搭建环境成本。 另外在疫情反复的环境下,随时在家隔离、居家办公;办公电脑忘记携带遇到紧急问题,同时自家电脑不具备开发环境的情况下,可能导致的无法顺利继续开发工作的情况,希望有一个方案能支持在这种特殊或者极端的情况,依然能继续完成开发工作的方案。
目标分析
收集中心各个业务Nodejs服务的开发情况,得出以下结论:
- 本地开发成本较高;对于后端依赖办公网络不通,如需调通需要部署跳板机,或者后端服务开通相关白名单。
- 设备成本高;有一些开发同学,会自行申请devcloud的机器,在机器上搭建vscode server来实现远程开发。但是每个开发同学去申请devcloud的机器,成本偏高,而且如果开发同学同时负责多个业务,可能存在因环境兼容问题,需要申请多个devcloud机器。
总体来说,本地开发或者自行搭建开发机是可行,但是部署开发环境的人力和费用成本较高,在降本增效的前提下,当前的方案并非最优选。到这里其实优化的目标已经非常明确了,新的方案需要满足以下诉求:
- 需满足各个依赖服务的网络调用问题;如腾讯云官网接口测试环境,后端服务测试环境(TKEx或者cvm)部署的测试环境服务,redis测试环境等。
- 低成本创建开发环境;不需要每一个开发人员对于每一个项目都需要做大量的配置和调试,来完成开发环境的安装。
- 较低的设备要求;可以在不同的设备(办公或者自用)上,无缝并安全的进行临时开发或者调试,避免因客观因素导致无法正常开展工作的问题。
- 按需使用;在降本的大前提下,对于开发机资源应该要做到按需的实时的创建资源来满足开发需要,而并非像devcloud申请的开发机属于常驻资源。对于使用完毕的资源及时回收,减少资源空置率。
解决方案
技术选型
对于接入Coding CI的过程中,留意到Coding CI提供一个非常好的远程开发工具Cloudstudio,Cloudstudio是基于容器化的远程vscode服务。通过与工蜂关联,能实现在工蜂创建开发分支时,自动创建对应的工作环境。经过一段时间的调研和试用,总结Cloudstudio具备以下特性:
- 原生网络互通;因为Cloudstudio的实例运行在devcloud中,基本上对于现有的腾讯云官网,CAPI,Redis(devcloud版)等测试环境服务。当出现服务无法连通的时候,可以联系被调服务负责人在iGate注册对应的ip和端口,对devcloud开发即可。
- 基于容器化技术,对于工作环境自动创建,自动回收,满足降低资源闲置率。
- 与Coding CI配置结合,模板化配置,可自定义开发环境镜像。通过统一配置,基本可以做到无需配置任何开发环境的信息,即可快速使用远程开发能力。
- 根据配置自动生成对应的访问链接和远程开发中的服务端口绑定,满足调试需要。
更多的信息可查看文档链接:远程开发
架构设计
基于Coding CI继承式集成远程开发配置
首先远程开发的配置与Coding CI一致,那么可以通过配置统一的远程开发配置模板,通过include的方式集成到项目中。并且对于远程开发配置模板的变更对于业务项目无感。可实现一处修改处处生效。
通过在项目中的.orange-ci.yml中引入远程的远程开发配置文件完成依赖:
定义远程开发模板统一配置:
代码语言:javascript复制# 远程开发
(**):
branch.create:
- name: vscode
services:
- git-clone-yyds # 实现秒级克隆
- vscode # 声明使用 vscode
- docker
docker:
build: .tide/Dockerfile
endpoints:
- 9527
wework:
title: TIDE远橙开发
stages:
- name: 设置host
script:
- cp /etc/hosts /etc/hosts.back
- if [ -f "./tide/hosts" ]; then cat ./tide/hosts >> /etc/hosts; fi;
- name: 执行自定义脚本
script:
- npm install
- name: ready
type: vscode:go
远程开发模板会默认完成一些常规步骤:
- 定义在创建分支的git hook时,触发vscode插件,来完成远程开发的vscode环境。
- 定义远程开发时的基础镜像使用的dockerfile。
- 可以通过直接使用image使用开发环境镜像
- 可以通过使用build使用的开发环境dockerfile来满足更丰富的自定义选项
- 定义镜像默认暴露9527端口作为服务访问入口
- 通过规定的hosts文件,在开发环境容器启动后,自动注入项目所需的相关hosts信息到开发环境内。
- Nodejs需要自动安装相关的项目依赖。
大致流程如下:
统一开发环境镜像
为了降低开发者使用远程开发,单独封装了一系列的不同语言以及不同版本的开发环境镜像。并且封装了一个集成常用的vscode插件的vscode-plugin-image,提高开发者的开发体验。
开发者可以根据项目的实际情况,在项目中的.tide/Dockerfile编写相应的扩展镜像的命令,从而达到灵活的扩展能力。
默认提供一些常用的vscode插件,通过组合镜像构建的方式,最终生成的开发镜像可以根据语言和语言版本的维度,分别构建对应开发环境镜像,并且内置一些vscode service依赖的linux软件、开发常用软件以及vscode插件等。
成果
快速接入
经过上面的统一开发环境镜像设计,以及Coding CI的公共模板继承策略,开发者只需要在已经授权了Coding CI的项目中,添加include对应tide.yml模板(远程开发模板)。只需1分钟,即可完成远程开发能力的接入。
通过创建分支,即可自动开始创建远程开发环境:
畅通无比的开发体验
基本上中心Nodejs服务所依赖的后端测试环境网络通畅,并且得益于vscode service的能力,可以通过web浏览器打开或者本地vscode远程连接。并且方便完成各种调试断点,极大的提升开发调试BUG的效率。
自动回收资源
当我们vscode断开连接,或者web编辑器关闭后,默认10分钟内系统将会回收分配的工作空间;并且在销毁前如果代码并没有提交到远程仓库,cloudstudio将会自动帮你提交一个commit到远程分支。并在下一次启动远程开发时自动将代码还原到新的工作空间中。
总结
Cloudstudio以面向Git仓库的方式,实现分支即环境的理念,并以声明式语法通过Coding CI进行集成。同时解决因为网络环境复杂,导致无法在本地进行有效开发所带来的痛点。值得一提的是,基于容器化技术,将开发资源做到按需化,能很好的起到降本的作用。
这一些都是个人开发机难以做到的事情,在经过一段时间使用和团队的推送试用,明显感觉到这种便捷高效的开发模式,才是未来日常开发该有的样子。
Coding CI文档链接:http://oci.woa.com/
远程开发文档链接:http://oci.woa.com/tide/quick-start.html