Chinaunix首页 | 论坛 | 博客
  • 博客访问: 471309
  • 博文数量: 95
  • 博客积分: 2117
  • 博客等级: 大尉
  • 技术积分: 2301
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-16 21:10
个人简介

辽宁铁岭人,现居大连。1970年生。 先后供职于 中国国际海运网、大连学堂科技、大连华仁视线网络科技有限公司、大连中科海云科技有限公司,任职技术总监。 精通PHP、JAVA、Javascript、HTML、CSS等网络编程技术及Linux操作系统。 精通面向对象编程、设计模式、重构及互联网产品设计。

文章分类

全部博文(95)

文章存档

2013年(31)

2012年(2)

2011年(34)

2010年(25)

2008年(3)

分类: LINUX

2011-10-11 15:39:10

软件代码库和版本控制是软件产品开发管理的核心。目前,虽然集中式代码库工具仍是企业应用主流,例如 CVS,Subversion等,但是越来越多的企业已开始采用分布式版本控制工具,以支持更灵活、更敏捷的软件开发工作流。基于分布式版本控制的团队协 同不一定需要统一的服务器代码库。但是笔者相信,企业级的软件开发团队为了支持测试和发布,一般都需要有某种方式集中管理所有代码/软件功能以及产品的各 种分支版本。

本文介绍基于Mercurial构建的、支持统一/集中式代码管理的一个方案。基于分布式版本控制的团队软件开发工作流不是本文重点,您可参考了解Mercurial的基本操作,参考A Guide to Branching in Mercurial一文了解Mercurial的分支与合并策略,这份讲稿通过对比Mercurial与Subversion介绍Mercurial的工作流和基本使用。

与传统的集中式代码库系统(例如:CVS, Subversion等)相比,分布式版本工具(DVCS,例如:Mercurial和Git)支持十分灵活的软件开发工作流,越来越多的项目、产品团队 以及需要自主开发软件的企业/组织希望可以利用分布式版本控制带来的好处。但是,很多开发部门决策者对分布式版本工具在企业环境的部署和应用存在误解,特 别是对分布式版本控制的安全性和权限控制心存疑虑。企业级软件开发与开源软件的开发模式不同,企业级软件开发对源代码版本控制一般有以下需求:严格的用户 身份认证、按角色分配代码权限、按职责分工安排工作流,以及安全性等其它方面都有特别的要求(例如详细的访问日志等)。

集中式代码库中包含所有软件源代码提交(commit)的历史,因为每个被认为是合适的代码改动都会集中提交到代码库服务器分布式代码库则可分别由各个开发人员、测试人员、发布工程师、开发经理等各自掌握,每个人手头的拷贝都可以是一个独立的分支(branch)和代码库(包括人为地指定的“服务器版本”代码库),都有各自的版本历史,这是因为分布式代码库支持本地提交—— 任何能独立思考、喜欢创造性地解决问题的程序员都喜欢此功能。本地提交形成的版本历史也许只对开发人员或变更的所有者有意义,而只有在集成测试时,才需要 将所有人的、各自测试好的代码变更集中起来,方便更高级别的功能测试。此时,部署一个能汇总所有人的代码变更的代码库就十分必要。从这个角度看,分布式版本控制工具是可以兼容和满足软件代码的集中管理需求的

本文以Mercurial这款比较流行的分布式版本工具为例,通过服务器端管理工具mercurial-server的安装配置实例介绍如何安装、配置适合企业级部署的、集中式的Mercurial代码库。下面的实例中所采用的软件环境如下,如你的环境不同于本文实例,请自行准备对应平台上的同类工具软件:

  • 服务器操作系统是Ubuntu Server,但是Debian等其它*nix类的操作系统也同样适用;
  • 客户机Windows XP,安装TortoiseHG,并准备好puttygen.exe;
  • 为了简洁,实例中所有通过TortoiseHG图形界面完成的操作都用同等作用的Linux命令行表示。
1. 背景知识和准备工作

要理解本方案并能跟随下面的指引完成服务器端的配置,你必须首先:

  • 对公钥基础设施(非对称加密)的有基本的常识;
  • 已通过puttygen.exe生成你自己的RSA密钥对(公钥+私钥),配置代码库其他用户之前则需要先获得他们的公钥;
  • 熟悉基本的Linux命令行工具。
2. 安装mercurial和mercurial-server

首先,更新你的软件包并安装mercurial和mercurial-server。

$ sudo apt-get update $ sudo apt-get install mercurial mercurial-server

Mercurial-server安装完毕后,系统将自动新建系统用户hg,用于管理所有代码库用户与服务器端的Mercurial代码库直接的互动。

3. 配置mercurial-server管理员(root)帐号

刚安装好的mercurial-server默认不接受任何SSH登录的用户,你必须为自己创建一个管理员帐号。因为所有的身份认证和权限都是通过 密钥完成,你必须通过Ubuntu Server的root权限来复制你自己的公钥到mercurial-server管理员的密钥目录下。

$ sudo cp my_rsa_public_key.ppk /etc/mercurial-server/keys/root/MYUSERNAME $ sudo -u hg /usr/share/mercurial-server/refresh-auth

上面第二行命令的作用是:告诉mercurial-server你已复制自己的公钥到管理员密钥目录,并授权此公钥所代表的用户作为mercurial-server管理员。

4. 管理mercurial-server 通过hgadmin库管理用户和权限

只要通过上面步骤配置好第一个(系统管理员)用户后,mercurial-server的其他用户和代码库权限分配只需要通过管理配置hgadmin代码库即可完成!下面是(第一次)从你的mercurial-server服务器获取hgadmin代码库的命令(当然,你也可通过TortoiseHG完成等价的操作)。

$hg clone ssh://hg@my_mercurial_server/hgadmin 添加新用户

当你作为管理员用户把用于管理的hgadmin代码库clone到本地机器后,即可通过把代码库用户的公钥导入到此库的对应目录中来实现用户授权,以及相关代码库的权限配置。

$ cd hgadmin $ mkdir -p keys/users/ $ cp ~/li_ming_RSA_pub_key.ppk keys/users/liming $ hg add adding keys/users/liming $ hg commit -m "Added Li Ming's public key" $ hg push

当然,每个代码库用户也可以有多个不同的公钥。例如你们公司允许开发人员李明同时在家或公司办公室上班,好让他可以边开发软件边给自己刚出生的女儿喂奶,因为他的太太韩梅梅没有空。此时,你可以把属于李明的不同公钥复制到以他名字命名的密钥目录下:

$ cd hgadmin $ mkdir -p keys/users/liming $ cp ~/li_ming_RSA_pub_key.ppk keys/users/liming/home $ cp ~/kurt-work.pub keys/users/liming/work $ hg add adding keys/users/liming/home adding keys/users/liming/work $ hg commit -m "Added keys for Li Ming's home and work computers" $ hg push 添加新代码库

作为代码库管理员,如果你要在mercurial-server服务器端新建一个Mercurial代码库,你只需要把本地的一个代码库clone到服务器。例如:

$ cd my_hg_project $ hg clone . ssh://hg@my_mercurial_server/my_hg_project

于是,你的同事们即可对此新建代码库按hgadmin里的access.conf的权限进行对应的clone,pushpull操作。例如:

$ hg clone ssh://hg@my_mercurial_server/my_hg_project

提示:你的Ubuntu服务器上,所有属于mercurial-server管辖的代码库都保存在这个位置下面/var/lib/mercurial-server/repos 。

管理代码库权限

到了这一步,你应该已在服务器端创建了代码库,添加了相关的用户,接下来你将需要管理用户访问这些代码库的权限。mercurial-server通过hgadmin代码库中的access.conf权限配置文件实现对用户/代码库权限的管理。请参考官方文档Using access.conf了解更详细的用户/代码库权限控制方法。

不知你是否有留意,为何mercurial-server有两套方法来实现用户身份认证和权限控制?1)通过/etc/mercurial-server下面的配置文件;或者2)通过hgadmin。作者Paul Crowley在官方文档中也解释了一下,十分有道理。

5. 致谢

本技术辅导到此结束,鸣谢Paul Crowley,你结合自己公司的实践为全世界提供了mercurial-server这个有用的、适合企业级部署的工具,我代表我自己和所有本文的读者向你致以最崇高的敬意。同时,鸣谢Kurt Grandis,我这篇东西的内容大部分是从你的博客偷来的。

6. 附录:TortoiseHG安全通信的RSA私钥及安全问题

上述方案主要特点是:TortoiseHG客户端与HG“中央”服务器之间实现无密码输入的安全身份认证。不难 看出,此方案的安全薄弱环节与其它非对称加密方案一样——由代码库用户个人负责保管的RSA私钥(有打开密码保护)。例如:公司系统管理员A统一生成一批 私钥,再由开发经理B负责将私钥复制到一个只读USB记忆棒交给开发人员(员工),并通过对应的保密协议或信息安全操作规程来明确安全保密责任。

TortoiseHG依赖其内置的TortoisePlink.exe实现SSH2加密通信,要实现免密码输入,必须同时下载外部工具Pageant.exe。Pageant.exe的作用是把你的(用户的)代码库身份认证RSA私钥缓存到本地计算机的内存中,以便TortoiseHG在每次与服务器通信时通过服务器的hg用户以及事先已录入到hgadmin代码库对应的公钥进行自动匹配。每次退出Pageant.exe时私钥信息自动从内存中删除。下次启动后必须重新导入一次私钥,用于和中央代码库的身份认证。

在一个软件功能确认完成或通过QA测试前,开发与测试人员之间有必要在相互的代码库之间进行代码变更集(changeset)的交换、代码融合(merge)等常规代码库操作。具体操作方法不是本文重点,有兴趣的用户可参考Joel Spolsky写的Hg Init: a Mercurial tutorial一文或者是Mercurial用户手册

7. 参考资料: 本文转载自 http://www.bookandman.com/2010/08/07/mercurial-server/
阅读(2196) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~