大公司也没你说的那么吓人,我以前在的几家公司,很多部门开发流程其实也很原始。不过我们当时实践过一些方案,应该业内还比较通用,分享一下。
你提的问题我们当时是通过实施CI(持续集成)来解决的,使用的工具是Hudson,这里强烈推荐一下,比Curise Control要好用不少。
对于Java Web项目,我们一般会搭建三套服务器,分别是:test、alpha、product,对应:日常测试环境、alpha测试环境、线上环境(可能多台)。
日常开发流程大致为:
- 程序员提交代码
- Hudson每天凌晨会自动从Git/SVN上检出代码进行自动编译构建(通过Maven,Ant或脚本),并发布到test服务器上。(期间会用脚本自动替换相应的环境配置文件,如DB连接等)
- 第二天程序员过来查看Hudson上的构建结果,其中包含:编译是否成功、单元测试结果(由Maven或Ant执行)、单元测试覆盖率(Cobertura、Emma或Clover等生成)、功能测试结果(如Selenium)、静态代码检查结果(Checkstyle、Findbugs、PMD等)
- 测试人员对test服务器进行测试。测试中若有问题,开发人员可以随时修改提交代码,并立即触发重新构建部署到test(一键完成),一分钟后测试人员即可继续测试。
- 产品经理和Leader随时从test服务器上看到产品状态和团队进度。
当项目进入alpha测试阶段时,我们会在每日构建时多部署一份到alpha环境上(例如可能是一台有外网IP的服务器),这样测试人员以及用户测试员就可以在更接近真实线上环境的alpha环境中测试了。
最后,当一切测试都OK准备上线时,手工触发一次部署到product服务器的构建(脚本里必须做好足够的备份工作)即可做到一键上线,当然相应的还有一键回滚(如果上线失败的话),不过一般来说上线过程都有运维人员在场,万一有个三长两短也来得及补救。
之后我们做Android开发项目,也类似如此,只是将部署到Java Web服务器改为了发布apk包到一个ftp/http下载服务器,由测试人员去下载最新版本到手机进行测试。
这里面当然还有很多细节的东东,比如项目间依赖管理、部署必须做到out-of-box、环境配置文件切换等,但大致来说整个流程如此。