2012年版本
http://saturn.yoozi.org/iTalk/#title-slide
初创团队工作流与开发模式探讨胡杨刚(a.k.a. Saturn)
Slides and Source on Github Me 2012/11/18 ku6.com, Beijing Video
主题 Walkthrough
初创团队协作工具选型及各自角色
高效协作开发三剑客:Basecamp、Github、QQ 企业邮箱
基于 Git-Flow 的 Web 开发模型
简单介绍 Git 及 Git-Flow 开发模型
使用 Git 对 CI 应用进行自动化部署
Case Study: 利用 Github Service WebHook 调用脚本执行自动化部署
协作/开发工具选型标准 Considerations
体验:是否简单易用?
降低因引入新的工作软件/模式所带来的学习成本。
协作:是否方便多人远程协作?
完全线上协作,集中资源闹革命;不必再为无法找到合适的本地人才而烦恼。
信息整合:是否支持丰富的 API 功能?
API 方便将团队所有工具信息流进行整合、归档,形成团队专属知识库/Bug集中营。
成本:是否需要花费精力维护?是否便宜?
选用在业界具有知名度的 SaaS 型工具,降低软件维护成本和财务成本。
推荐方案 Recommendation
适合 10~50 人之间的开发团队,每月固定财务花费约 200 USD(~ 1400 CNY)。
Basecamp:产品设计与规划执行
用例:产品功能讨论(Messages)、文档协同撰写(Writeboards)、待办事项(To-Dos)、团队日历(Calendar)和时间管理(Time Tracking)
Github:源代码管理与缺陷跟踪
用例:代码托管(Git)、产品功能路线图(Milestone)、代码审查(Code Review)、Bug 跟踪(Issues)
QQ 企业邮箱:信息中心与消息推送
用例:通过绑定 QQ 或微信,将开发相关任务即时、准确的传达到每位订阅成员。
工作信息流 A Workflow for startup
Basecamp:制定产品规划与开发分工
QQ企业邮箱:成员参与讨论与制定规划
微信/QQ:推送订阅信息到指定成员
Github:开发所需功能、缺陷跟踪
生产环境服务器:自动部署上线
Why Git?
Git – the stupid content tracker
Git Manual
相较集中式版本控制工具 CVS / SVN 等,Git 的特点主要包括:
分支(Branching)成本较低。
合并(Merging)操作简单直观。
分布式离线操作。
Why Git?
Photo credit to nvie.com.
Git-Flow:一个 Git 分支模型
Photo credit to nvie.com.
简单部署模型:架构
Photo credit to https://github.com/logsol/Github-Auto-Deploy.
开发人员将代码 push 到 Github 远程服务器(Remotes/Origin)时:
触发 Git Post-Receive Hook(Git Origin 接收并处理完当前 Push 请求后均执行此钩子)。
Github 将当前 push 信息以 HTTP POST 方式调用给事先定义好的 WebHook Url(s)。
WebHook Url(s) 对应一个或多个专门用于处理产品部署逻辑的 HTTP 服务。
HTTP 服务接收 POST 数据、执行部署逻辑(如压缩合并文件和重置缓存等)、完成部署。
简单部署模型:HTTP 服务配置
HTTP 部署服务需以 Daemon 形式长期驻留系统,推荐使用 Python/Node.js 编写。
{
“port”: 8001,
“repositories”:
[{
“url”: “https://github.com/cnsaturn/iTalk”,
“path”: “/your/local/path/on/target/server/here”,
“deploy”: “make deploy” // 自定义 makefile
}]
}
简单部署模型:HTTP 服务
采用 Python 编写、用于解析 Post-Receive Hook POST 请求的 HTTP 示例服务核心逻辑:
def pull(self, path):
if(not self.quiet):
print “\nPost push request received”
print ‘Updating ‘ + path
call([‘cd “‘ + path + ‘” && git pull’], shell=True)
def deploy(self, path):
config = self.getConfig()
for repository in config[‘repositories’]:
if(repository[‘path’] == path):
if ‘deploy’ in repository:
if(not self.quiet):
print ‘Executing deploy command’
call([‘cd “‘ + path + ‘” && ‘ + repository[‘deploy’]], shell=True)
break
简单部署模型:部署逻辑(1)
程序部署除代码直接更新外,通常我们还需要处理如下问题:
前端代码优化
如压缩合并 JavaScript/CSS 文件、压缩和优化图片、CDN 文件同步。
更新程序运行环境变量
如 CI 入口文件 index.php 中的 ENVIRONMENT 常量。
数据库结构变更
重置/预加载系统缓存等其他部署逻辑。
简单部署模型:部署逻辑(2)
为了解决此问题,通常会使用 Make / Ant / Maven 等 Build 工具来实现自动化操作:
前端文件的处理使用比如 uglifyjs(npm包)、jshint(npm包)、yuicompressor(jar包)来实现。
环境变量的替换可以事先制作成模板,然后按需替换。
数据库结构变更在 CI 中可使用 DB Migration 库轻松实现。