借助Git实施医疗设备软件版本控制
2016-02-11韩华华润万东医疗装备股份有限公司北京100015
韩华 华润万东医疗装备股份有限公司 (北京 100015)
借助Git实施医疗设备软件版本控制
韩华 华润万东医疗装备股份有限公司 (北京 100015)
由于医疗软件系统及其开发环境的复杂性日益增加,结合软件配置管理的软件开发过程已然成为保证医疗软件质量的基础,而版本控制是软件配置管理最基本的任务。本文介绍了万东医疗装备股份有限公司(下文简称万东)的医用X射线影像设备的软件(影锐2.0)的基于Git的版本控制技术,并阐述了如何利用Git达到多分支管理、可视化易操作的版本标记的要求。本文介绍的方法和技巧是具有通用性的,可供大家参考。
软件配置管理 医用X射线影像设备 基于Git的版本控制
万东在医用X射线影像设备领域是个知名的老企业,成立60多年来,早已拥有完整的自主研发的数字化医学X线影像产品线,包括X线胃肠机和数字DR,近几年又增加了MRI磁共振成像设备。万东的产品目前已经广泛运用于国内和国外多个国家的医疗单位。
万东医用X射线影像设备所采用的软件经历了外包到自主研发的发展历史。最初采用的软件几乎都是外包的,成本很高,也无法灵活地满足客户多样化的需求,后来经过不懈努力,逐步实现了软件的自主研发。目前万东已注册登记的医用X射线影像设备的软件是“InvaRay 2.0”(影锐2.0),其不仅有采集图像功能,还具有图像后处理、与DICOM系统(例如医院PACS系统)通信、出诊断报告、打印胶片和图像发送存储功能。
医疗信息化、数字化的发展离不开医疗软件的支持,所以开发出高质量的医疗软件对于医疗行业的发展至关重要。万东在影锐2.0软件质量管理过程中,采用了Scrum模式的开发过程管理、流程化的变更管理和基于Git的版本控制技术。
版本控制是软件质量管理的一个重要环节。版本控制之所以重要,是因为软件开发是一个长时间的工作,而且多人参与,极易出现版本混乱的情况,尤其是后期维护,没有一个好的版本管理,简直就是一场噩梦。
实现版本控制,除了要配置专门的版本管理人员,还要考虑使用何种工具。万东以前用过微软的Visual Sourcesafe软件做版本管理,发现其具有很多问题,不能满足要求。影锐2.0软件是给多个机型(数字X线机DR、胃肠X线机、乳腺机)使用的综合平台,每种机型的功能要求不同,却使用同一套代码,而且多人开发,如此复杂的情况,用Git软件比用Visual Sourcesafe做版本管理要好很多。
Git是一款免费、开源的分布式版本控制系统[1],用于敏捷高效地处理任何或小或大的项目,我们对其分支功能最感兴趣。
如图1所示,程序员在主分支上做开发(签入签出),在某个时刻,需要做指定版本的补丁,此时从主分支上找到指定版本对应的代码,生成一个新的分支,例如取名为分支1,在分支1上,程序员修改代码完成补丁,同时,主分支上的开发工作也在同步地持续进行(主分支代码与分支1上的不同),等分支1上的修改完成而且发布后,把分支1合并到主分支上,并做好版本标记(第一个黄色的圆圈,标记为V1.05.X-X为数字1、2、3…)。类似的,另外一个分支-分支2上的修改完成后,也合并到主分支上,并做好版本标记(第三个黄色的圆圈,标记为V2.05.Y-Y为数字1、2、3…)。还有一个版本标记(第二个黄色的圆圈,标记为,例如DR产品,版本V2.06),表示此时发布了一个新的DR版本。后期要得到指定版本或者补丁,就是去Git上找指定版本标记,然后获取代码。Visual Sourcesafe没有这种多分支和分支合并的功能,而且历史记录不如Git强大,所以被淘汰掉了。
图1.Git分支逻辑示意图
图2.Git存储库里影锐2.0的各个分支
图3.Git日志历史中的标记
图4.版本标记记录表的截图
图5.程序属性中的SHA-1值
上面分析的只是一种情况,其实,各种分支之间是可以相互合并的,并不一定就是要子分支并入主分支。其实,子分支形成后,就是一个独立的分支,功能上和原来的主分支是一样的。如图2所示,Git存储库里可以为一个库创建若干个分支[2]。
除了多分支的功能,我们用Git做版本标记感觉操作容易,且一目了然。例如图3所示,黄色的是标记,发布版本或补丁后由软件版本管理员添加上去,Message列里的黑色
文字是备注,由程序员迁入数据(各种文件,包括代码、文档、图片,以及文件夹目录结构)时写入或者分支合并时Git自动添加的信息。新的版本标记一旦迁入了Git库,每个更新了Git库的人都可以在本地看到新的版本标记。
此外,软件版本管理员对黄色的版本标记信息也要单独做记录。因为Git日志历史会随着时间增长变长(例如十页以上),导致翻页寻找标记很困难,而通过记录表可以更快找到标记的时间信息,然后再去Git日志历史里寻找标记和代码,就会缩短时间。记录表就是起个存档和辅助作用,看起来会像图4所示。
图表中的外部版版号是硬件产品团队命名的版本号,内部版本号是软件团队命名的阶段性版本号,系列表示的是设备的类型(数字X线机为DR、胃肠为RF、乳腺机为MG)。
除此之外,我们在软件的执行程序文件属性中,也写入了文件版本和Git库里的SHA-1值(哈希值,代码的唯一标识值,共40位,取前7位即可)。此小技巧能辅助我们更精准地在日志记录里找到代码版本。
万东的影锐2.0软件是用VC++开发的,VC++实现此技巧的方法如下:先在项目.rc文件的宏定义VS_ VERSION_INFO VERSIONINFO中使用一个占位符_ GIT_VERSION_,然后在软件项目的预生成事件中,执行一段脚本,让它调用Git命令将SHA-1值赋值给_GIT_ VERSION_,最后软件编译的时候,版本有关的信息就被写入执行程序属性中。脚本内容如下所示:
脚本内容被保存在批处理文件(例如取名为get-gitversion.bat)中,在项目的预生成事件设置中,调用命令行执行此.bat:
上面的脚本中用到了GeneratedVersion.h文件,此文件就是干一件事情:定义_GIT_VERSION_。软件项目编译之时,该占位符会被赋值,GeneratedVersion.h文件的内容,看起来会像这样:
注:此处的“bd9ab37”就是从Git日志历史读出来的某个SHA-1值的前7位。
在软件的执行程序Invaray.exe的属性中,我们不希望动用文件版本和产品版本信息(已经设置成内部版本号),所以选择将SHA-1的值存在原始文件名后面,当然,大家也可以根据自己的要求放在其他属性值中,这个没有多大影响。要修改原始文件名属性,大家可用文本编辑软件打开项目.rc文件,找到VS_VERSION_INFO VERSIONINFO后面的BLOCK "StringFileInfo",然后添加占位符__GIT_ VERSION__:
结果如图5所示。
如果软件不是用VC++而是用的其他语言开发的,那么实现方法会不一样了,但是结果是一样的就行。
Git还有一些其他的功能,例如Git bash可以通过命令行来操作Git库,效率甚至比通过可视化界面操作还要好;还有TortoiseGit工具可以更加方便的操作Git库等等……感兴趣的读者可以在网上查找到大量资料,Git安装程序也可以从网上下载,本文对此不做赘述。
[1] Git的下载:https://git-scm. com/
[2] 开源中国社区 https://www. oschina. net/search?scope=project&q=git
1006-6586(2016)07-0116-03
TP311.5
A
韩华,现任万东医疗装备有限股份公司的测试主任工程师,负责软件质量保证工作。