用Docker和Git搭建在线开发环境

jopen 8年前


免责声明

以下分享的内容是个人在业余时间的一些经验,并不代表IBM的观点。

为什么要在云端搭建开发环境

如今,在传统的开发模式下,版本控制,自动化测试,持续集成都已经陆陆续续放到的云端。
  • 测试工程师,可以用过自动化测试脚本在云端做大规模的回归测试
  • 运维工程师,可以通过自动化的部署工具在云端快速部署应用
  • 产品负责人,可以通过版本控制工具控制产品的发布


唯独开发工程师还在利用手中的电脑,笔记本等设备来完成开发工作。
在项目开发阶段,我们通常面临下面几个问题:
  1. 在项目启动阶段,如何让开发工程师快速搭建,并配置开发环境,来缩短项目启动时间和成本。
  2. 在项目开发阶段,如何让开发工程师有:
    • 完全相同的开发环境,来降低调试成本。
    • 近似于产品环境的架构,来降低部署时因环境差异带来的风险。
    • 降低对开发设备性能和种类要求,来降低设备成本。
    • 灵活的分配开发资源(CPU,内存,存储),让需要大量开发资源的工程师快速拿到资源。


云端开发环境要解决的问题总结

基于以上思考,我总结了以下4个云端开发环境要解决的问题:
  • 保证每个开发工程师都能快速的获得一致的“开箱即用”的开发环境
  • 开发环境摆脱开发设备的种种限制,例如操作系统,设备性能
  • 让开发环境尽可能模拟产品环境的结构。
  • 灵活的分配开发资源


在云端搭建开发环境的挑战

一个“开箱即用”的开发环境应该包括:功能完备的代码编辑器, 一个应用运行环境,一个调试工具箱。
  • 为了摆脱设备的限制,集成开发环境可以用HTML5等主流浏览器兼容技术实现。
  • 为了灵活的分配资源和模拟产品环境,可以将应用运行环境放在云端,并使用容器技术配置。
  • 调试工具包括日志的输出,断点等功能。


技术难点总结

  • 在线的集成开发环境:兼容各大主流浏览器
  • 隔离的运行环境:隔离,可定制,高效
  • 调试代码:查看日志,可设置跟踪断点


潜在的可选技术

基于技术难点,我做了一些调查研究,选择了几个备选的开源技术。


目前,只确定了使用Docker来实现运行环境。

集成在线开发环境,我使用Git来解耦代码运行环境和编辑环境,并代码同步。

代码调试,我使用独立的fluentd服务收集日志,通过SSH登录到虚拟机查看fluent收集的Docker日志。

云端开发环境的架构概要

下面这张图是一个简单的架构说明。首先,使用Git来解耦代码的编辑和运行环境。
我在云端,使用Docker搭建了Git裸库,裸库中用Git hook来同步代码。使用Docker来运行应用,通过浏览器来检查结果。

因为,代码的编辑和运行环境的分离,开发工程师可以灵活的选择开发工具。开发工具可以是在线编辑器,也可以是本地的编辑器。
借助于Docker的灵活性,开发工程师可以快速配置出应用运行环境,并分享给开发团队成员。
Architecture_Overview.png

概念验证

  • 在本地编辑代码
  • 用Git同步到云端
  • 用docker运行代码查看结果


一小段视频录像,演示如何在云端使用开发环境

视频演示如何在云端进行Django项目开发

详细步骤

参考 在线开发环境实践

Q&A

Q:那么多的开发者,域名怎么分配?

A:目前,我是通过Nginx的反向代理来分配不同的子域名给不同开发人员。
Q:在这个体系中开发与测试是如何联系?

A:这套体系主要专注于开发的部分,测试与开发的互动并没有在这套体系中体现出来, 不过有很多成型的DevOps体系可以作为参考。
Q:云端开发是不是开发环境放在云上,开发者SSH到自己的开发环境,提交代码后Compose是自动执行还是人为执行?

A:理想状况下,是将一下三个部分都放倒云端, 目前我只实现了运行环境在云端。 Compose现在也是手动之行的, 但是可以通过脚本做到自动化
  • 功能完备的代码编辑器
  • 一个应用运行环境
  • 一个调试工具箱。
Q:云端开发会不会减少开发者的工作量,让其更专注于代码上,而不是流程的应用上?

A:云端开发会让开发人员更少的经历去学习了解中间件, 用更多的时间专注于业务功能的实现,从而做到让开发更关注需求本身,而不是技术本身。
另外在线开发环境可以提高协作性。因为运行环境和代码都在云端,开发人员可以很快的切换其他人的开发环境和代码。
Q:在线IDE在实际使用中的体验,可被开发人员的接受程度如何,对各类语言的支持情况呢?

A: 目前的尝试在线IDE受网络,和功能的制约,不能完全和本地的IDE相比较。 不过因为Git的解耦,开发人员可以选择使用本地的IDE编辑代码
Q:Git还是比较复杂,有没有更简单的工具?

A:除了Git之外还有一种sshfs的技术,可以直接映射远端代码到本地。 不过考虑到版本的回溯,甚至将来利用大数据来分析开发人员的开发行为。 Git会是一个比较好的选择。 Git现在的复杂是因为相应的自动化脚本没有建立,在建立之后,开发人员可以忽略Git同步的部分。
Q:代码提交到云端后,容器中是怎么生效的,是把代码目录作为挂载点还是容器中有进程实时去拉?

A:是的,现在代码作为卷挂载到容器中的。
Q:但是如果是以挂载的方式,怎么能重现Commit镜像时保证代码的同步呢?

A:我想这个问题回到了“这个体系关注的问题到底是什么”上。 我分享的这套体系专注于项目中的开发部分,并不专注版本控制,测试和部署。
通常情况下,项目应该有另外一个Git仓库来做版本控制,然后会有专门的build体系,来自动build指定的代码。
Q:Commit镜像时的镜像里并没有代码啊?打算任何环境都是以挂载的方式吗?这样可移值性会不会很差?

A:首先Container是通过项目路径下的dockerfile生成的, 只是在运行环境中又挂在了一次代码。 当开发结束后, 可以通过项目的dockerfile,整体build代码和环境,并部署。
Q:例如采用git flow 这样的多分支并行开发,每个分支都要有一套对应的docker container 吗?如何来关联分支和容器?

A:这是个好问题,首先Docker只提供代码的运行环境,如果代码的不同分支使用的是不同的运行环境,docker container是应该是多套的,而且,不同的dockerfile是应该跟代码在一起的。
如果运行环境是相同的,可以使用同一套docker container。只需要把代码切换到Container里即可。
Q:当先就目前来说,在云上部署确实很好,可是关于一些生产的私有性环境是不是在本地比云端更靠谱?

A:我理解这个问题应该是问将云端开发环境部署到公有云,还是私有云。 我个人的理解是, 目前来看,应该部署在企业内部的私有云上,来避免代码的泄露。
Q:当前来说搭建一个统一的环境使用Kubernetes or SHIPYARD 搭建起来会更方便,而且现在物理设备的价格也更便宜,可控程度更高,在云端真的比在内部控制好么?

A:同第一个问题一样,云端指的可以是私有云,也可以是公有云。 我赞同提问者的考量,私有云会更好一些。
Q:是不是先提交代码,触发hook,在容器里同步代码并编译和执行。这样效率会更高吗?

A:将代码编辑环境和运行环境解藕, 使用Git来同步,效率受两个因素制约:
  • I/O也就是网络速度和盘速度。 保证网络速度的前提下,这个因素是可以忽略的
  • Git本身的效率,因为每一次保存都会提交Git,Git本身是增量存储,所以效率也不会太低。
Q:对私有仓库是否也能同样生效?对于容器不能被外部访问的话,hook机制还能同步代码吗?

A: 目前这套体系建议整体部署在私有云中。
Q:每位开发者都具有相同的开发环境,该开发环境是用Container么,网络是如何解决的?也就是说在开发者眼里使用的就是虚拟机,具有故定的IP。

A:应该说每位开发者都有相同的代码运行环境,这部分是通过Container实现的。目前明没有对网络有太多的考量, 在规划中会有一个网络分配的组件,为开发人员分配不同的子域名,并自动将域名路由到container上,这样可以更灵活的分配主机资源,管理Container。
Q:代码放在云端怎么保证安全,防止企业代码泄漏?

A:部署在私有云上, 需要公网访问时,使用V*N。
Q:我公司主要需要是C++研发电信行业,不通的省份,不同的机型都要搭理一套开发测试环境,你们讲的主要是Web开发,C++是否适合云端开发?

A:我主要研究Web方向。 只能简单的说一下思路, C++的docker image是有的,主要是看你需要一个什么样的调试环境。如果可以通过Web查看结果。我觉得是可行的。
Q:关于使用Git搭建持续集成环境有一个疑问,就是如何处理在开发环境和生产环境下,个别文件不同的情况应该如何处理?例如一些配置文件,Django中的settings.py,在生产和开发环境下,其内容是不同的。

A:通常情况下,配置文件是要独立在代码之外的,用Django举例, 可以使用.env。 在开发环境,和生产环境使用不同的配置文件,而不是直接写在代码里面。
如何配置产品环境和开发环境,可以参考一些好的实践文章。 分离运行环境和代码的实践文章,业界比较认同的是“ The 12-Factor App”这个设计思路。
Q:如果后端采用集群方式进行管理,请问您对后端容器资源使用的预估,以及对整个集群的负载能力的判断,是如何考虑的?项目不同,对后端资源影响挺大。

A: 目前项目还处在概念验证阶段。 对于中型的Web项目,单个开发人员分配1CPU资源,1GB内存是完全可以满足需要的。
Q:本地开发可以快速切换本地Git的不同代码版本查看,远程运行的话,想要查看之前代码的运行结果需要真的将代码在远程共享本库中回滚吗?

A:是的,因为每个开发都自己的远程代码代码库。 所以,回滚并不会影响其他人,也不会丢失自己的代码。
以上内容根据2015年12月29日晚微信群分享内容整理。分享人: 王延祺,IBM助理架构师,主要负责web应用设计和架构。 最近几年,关注云技术对Web应用架构和开发方式的影响。 从2015年初开始学习并关注容器技术,并在个人业余项目中实践用Git和Docker搭建在线开发环境。Github: @yanqiw、推ter: @yanqiwfrankwang.cn DockOne每周都会组织定向的技术分享,欢迎感兴趣的同学加微信:liyingjiesx,进群参与,您有想听的话题可以给我们留言。

    来自: http://dockone.io/article/930