状态
本话题所属活动已经结束
投票数
3
看看都有谁投票了?

开源软件定制开发中的软件工程

worldhello于“2010年05月31日”创建了这个话题,计划在“2010年05月15日”的“柳燕隙阳”活动中演讲

分享到:

CoSign 是密歇根大学的一个开源项目,提供单点认证功能。我对该软件进行了改造,产品化,使之成为我们公司——群英汇 集中管理平台的一个模块。

本话题将涵盖:

开源软件宝藏图

我们Hack 过的开源软件

                     ProjectMgmt
             _,->    (Redmine)  -._                      * Redmine                 * CoSign
           _/                       \_                     trac
         _/                           \_                   mantis
      VCS                 CI             TestMgmt
 (SVN,pySvnMager   (CruiseControl)      (Testlink)       * Subversion              * GOsa
  Git ...)                                                 pySvnManager
                                                           Git (topgit,gitosis)
      o   o             \ o /              o   o
     /|\ /|\              |               /|\ /|\        * Testlink                * CruiseControl
     / \ / \             / \              / \ / \
|----------------------------------------------------|   * MoinMoin                * Nutch
|                   (Search Engine)                  |     MediaWiki                 Lucene
|----------------------------------------------------|
|   Knowledge Base                   Communication   |   * WordPress
|  (Moin+WordPress)                  (Mailman+IM?)   |     typo
|----------------------------------------------------|
|              (UserMgmt + Single Signon)            |   * Mailman
|____________________________________________________|     phpbb
                                                           smf

什么是 cosign

可以参考我们写的手册:

CoSign 组成

APPS --> Filter (IIS)------+
APPS --> Filter (Java)-----+
APPS --> Filter (Apache)---+
                       ./  |
                     ./    |
                   ./      V
login <---+       /  +--> Daemon (tcp/6663)
          |--> CGI --|
logout <--+          +--> Factors -> AuthSource(DB, LDAP)

CoSign 演示

产品定制需求

  • 不说中国话

    改说中国话也有问题

    参见 群英汇博客 : 从 CoSign 看开源软件本地化(1-7)

  • 增加邀请码认证

    • 为了让亲朋好友免注册
    • 邀请码也要输入 login,如果任意设置 login 导致安全风险
    • 改造应用还是改造CoSign?
  • 不支持邮件地址登录

    • 认证因子返回0 代表认证成功
    • 认证成功后,用户输入的登录ID即作为 REMOTE_USER
  • 双因子认证来自于 OpenSesame 的需求

    如何设置谁能够打开 22 端口?

  • 请求认证因子的或运算

    邮件列表管理认证:在请求列表审核操作,请求 admin_list_mod 或 admin_list 认证

  • 其它一些痒痒的小问题

    • 认证因子的本地化

需求管理

  • redmine.bj.ossxp.com
  • ossxp-3.1 里程碑
  • 需求

改造后的 CoSign

  • 邮件地址登录
  • 双因子认证
    • OpenSesame
    • Mailman
  • 邀请码认证
  • 多语言模板
  • 本地化(核心本地化以及模板本地化)

Hacking

  • 编译
  • 运行
  • Hacking
  • 验证
  • 代码修改了,如何版本控制?

开发中的版本控制

为什么 subverson 不是最佳选择

SVN 的 vendor branch 的问题:补丁越多,跟踪上游版本库越痛苦。这就是为什么很多基于开源定制软件无法及时跟踪上游的原因

    X try to merge..., but CONFLICT!
    |
58  O Import v3.x:     AMD /branches/upstream/*
    |
57  O hack 55:         M /trunk/src/zzz
    |
    ...
    |
 4  O hack 02:         A /trunk/include/bbb
    |
 3  O hack 01:         M /trunk/src/aaa
    |
 2  O Vendor branch:   cp /trunk /branches/upstream
    |
 1  O Import v2.x:     A /trunk/*

正确的与上游同步的方法在哪里?

  • 只有每个 Hack 拥有一个独立的分支,才能实现对上游的跟踪
  • 我们不需要所有 Hacking 都合并到一起的分支,因为徒增烦恼!

每个分支一个 Hacking:

     +--------------------O(v3.x)--------- upstream
    /                      \
---O(v2.x)..................\............. /trunk
    \``\``\                  \
     \   \  +--O--------------X----------- hack1
      \  +---O------O-+------O-X---------- hack2
       +--O------O-----\------\-X--------- hack3
                        \      \ \
                         +--O---Y-X------- hack4

Quilt 让你无须将分支合并一处:

  • Quilt 是一个 Patch Queue Management System
  • Quilt 使用方法:后面讲

我用 Hg/MQ 一段时间,但只适合个人

实际上是两个版本库完成的

  O'(patch2 cont.)
  |               \     series
  O (patch2)       \    + patch1
  |                 +-- > patch2
  O (patch1)            - patch3
  |                     - patch4
  O (v2.x)
 / \
O   O
|
O

Hg/MQ 的问题: 补丁的冲突!我的天!

群英汇采用 Git + Topgit 方案

     +--------------------O(v3.x)--------- master
    /                      \
---O(v2.x)                  \
    \``\``\                  \
     \   \  +--O--------------X----------- hack1
      \  +---O------O-+------O-X--+------- hack2
       +--O------O-----\--------X--\------ hack3
                        \           \
                         +--O--------Y---- hack4

附加文件: .topmsg, .topdeps
附加分支: top-bases/*

没有单元测试的教训

  • 当浏览器支持语种的数量达到某个值,可能导致异常。coredump
  • gdb 诊断异常
  • 增加单元测试

代码审核帮助消灭Bug

  • 一个明眼人能够看出的 Bug,常规测试不易发现
  • Redmine 的 code_review 插件,帮助消灭此类 Bug

开发中的缺陷跟踪

  • redmine

软件集成

  • 制作 deb 包
  • cdbs 实现无痛 rules 制作
  • cdbs 通过钩子任务进行集成过程的定制
  • quilt 补丁列表在集中过程的自动化管理

文档

关于文档的需求

  • 至少包括:用户手册和管理员手册
  • 软件不同版本的手册也会不同
  • 文档的输出格式:HTML, PDF

可选的文档格式

  • Markdown: Ruby 中常用的标识语言。例如 gitbook 用 markdown
  • Docbook: 老牌的基于 XML 的文档格式。例如: svnbook 用 Docbook
  • reST: Python 社区的发明,易用性最佳。

最终的方案

  • 采用 reST 格式
  • 文档和代码用同一个版本库/目录维护
  • 开发了 Docbones 项目
    • 使用 Rakefile 管理文档编译
    • 支持多种文档格式的编译:Docbook,Textile, Markdown, reST
    • 内置缺省文档模板
    • 用户可自定义文档模板
  • Hack 了 Python docutils 项目
    • HTML 输出增加灯箱效果
    • HTML 输出的样式表定制
    • PDF 输出的中文和格式规范化(进行中...)

后记

笔者本次活动纪实: 《北京五月柳燕隙阳》

开源软件定制开发中的软件工程的评论