初创团队工作流与开发模式探讨

胡杨刚(a.k.a. Saturn)

Slides and Source on Github   Me   2012/11/18   ku6.com, Beijing   Video  

主题 Walkthrough

  1. 初创团队协作工具选型及各自角色

    高效协作开发三剑客:Basecamp、Github、QQ 企业邮箱

  2. 基于 Git-Flow 的 Web 开发模型

    简单介绍 Git 及 Git-Flow 开发模型

  3. 使用 Git 对 CI 应用进行自动化部署

    Case Study: 利用 Github Service WebHook 调用脚本执行自动化部署

协作/开发工具选型标准 Considerations

  1. 体验:是否简单易用?

    降低因引入新的工作软件/模式所带来的学习成本。

  2. 协作:是否方便多人远程协作?

    完全线上协作,集中资源闹革命;不必再为无法找到合适的本地人才而烦恼。

  3. 信息整合:是否支持丰富的 API 功能?

    API 方便将团队所有工具信息流进行整合、归档,形成团队专属知识库/Bug集中营。

  4. 成本:是否需要花费精力维护?是否便宜?

    选用在业界具有知名度的 SaaS 型工具,降低软件维护成本和财务成本。

推荐方案 Recommendation

适合 10~50 人之间的开发团队,每月固定财务花费约 200 USD(~ 1400 CNY)。

  1. Basecamp:产品设计与规划执行

    用例:产品功能讨论(Messages)、文档协同撰写(Writeboards)、待办事项(To-Dos)、团队日历(Calendar)和时间管理(Time Tracking)

  2. Github:源代码管理与缺陷跟踪

    用例:代码托管(Git)、产品功能路线图(Milestone)、代码审查(Code Review)、Bug 跟踪(Issues)

  3. QQ 企业邮箱:信息中心与消息推送

    用例:通过绑定 QQ 或微信,将开发相关任务即时、准确的传达到每位订阅成员。

工作信息流 A Workflow for startup

  1. Basecamp:制定产品规划与开发分工
  2. QQ企业邮箱:成员参与讨论与制定规划
  3. 微信/QQ:推送订阅信息到指定成员
  4. Github:开发所需功能、缺陷跟踪
  5. 生产环境服务器:自动部署上线

Why Git?

Git – the stupid content tracker

Git Manual

相较集中式版本控制工具 CVS / SVN 等,Git 的特点主要包括:

  1. 分支(Branching)成本较低。
  2. 合并(Merging)操作简单直观。
  3. 分布式离线操作。

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)时:

  1. 触发 Git Post-Receive Hook(Git Origin 接收并处理完当前 Push 请求后均执行此钩子)。
  2. Github 将当前 push 信息以 HTTP POST 方式调用给事先定义好的 WebHook Url(s)。
  3. WebHook Url(s) 对应一个或多个专门用于处理产品部署逻辑的 HTTP 服务。
  4. 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)

程序部署除代码直接更新外,通常我们还需要处理如下问题:

  1. 前端代码优化

    如压缩合并 JavaScript/CSS 文件、压缩和优化图片、CDN 文件同步。

  2. 更新程序运行环境变量

    如 CI 入口文件 index.php 中的 ENVIRONMENT 常量。

  3. 数据库结构变更

  4. 重置/预加载系统缓存等其他部署逻辑。

简单部署模型:部署逻辑(2)

为了解决此问题,通常会使用 Make / Ant / Maven 等 Build 工具来实现自动化操作:

  1. 前端文件的处理使用比如 uglifyjs(npm包)、jshint(npm包)、yuicompressor(jar包)来实现。
  2. 环境变量的替换可以事先制作成模板,然后按需替换。
  3. 数据库结构变更在 CI 中可使用 DB Migration 库轻松实现。

感谢大家!

Q & A

Slides and Source on Github   Me   2012/11/18   ku6.com, Beijing   Video  

/

#