注意:这里没有提供截图,在学期末会在文中上传pdf版本报告。
持续规划与设计
敏捷项目规划
首先登录华为云官网,进入控制台内的规定区域,搜索DevCloud并登陆,单击页面上方右侧"新建项目"。在弹窗中选择"DevOps全流程样例项目",输入项目名称"凤凰商城"(可自定义),单击"确定",完成项目创建。
项目规划
相关知识
- Epic:史诗,是项目的愿景目标。通过Epic的落地达成,使公司可以获得相应的市场地位和回报,具有战略价值。通常需要数月完成。
- Feature:可以带来价值的产品功能和特性。相比Epic,Feature更具体,更形象,客户可以感知,具有业务价值。通常需要数周,多个Sprint才能够完成。
- Story:通常所说的用户故事,是User Story的简称。Story是从用户角度对产品功能的详细描述,承接Feature,并放入产品Backlog中,持续规划,滚动调整,始终让高优先级Story交付给客户,具有用户价值。Story要符合INVEST原则(Idependent、Negotiable、Valuable、Estimable、Small、Testable),通常需要数天,并在一个Sprint中完成。
- Task:是团队成员要完成的具体任务。在Sprint计划会议上,将Story分配给成员,然后由成员分解为Task,并预估工时,通常在一天内完成。
具体操作
这一部分需要构建由epic、feature、story以及task构成的思维导图,这里除了手册中规定的两个stories,我在初始状态设置了会员管理、门店网络查询功能、账号系统三个特征。
在后续的操作中,我发现之前的迭代已经完成了会员系统的相关功能实现,结果如下图所示。同时在账号系统的story部分中,除了手册中要求的作为用户可以登录和注册账号,我认为还需要有作为管理员可以注销账号的功能。
迭代开发
相关知识
Backlog 英文意思为“积压的工作“,Product Backlog 其实就是一个具有优先级的需求列表, 并对每个需求进行了粗略的估算。
迭代定义为:如果算法的定义没有包含算法本身,则叫做迭代法。 迭代式开发 也被称作 迭代增量式开发 或 迭代进化式开发 ,是一种与传统的 瀑布式开发 相反的 软件开发过程 ,它弥补了传统开发方式中的一些弱点,具有更高的成功率和生产率。
每日站立会议(晨会) 这是在每个工作日特定的时间举行的短小(15分钟)的会议,开发团队的每一成员都将参与,通常可以选择在早上或者下午下班前进行。为了保证其短小精悍,与会成员都保持站立(所以叫“站立会议”)。以此提供给开发团队机会来汇报交流成果和阐述任何存在的障碍。
具体操作
这一部分需要对backlog进行编辑。在市场部门的施压下,Story"作为用户应该可以查看、查询所有门店网络"被指定为最高优先级处理,因为许多客户需要通过它来查询最近的门店网络地址,从而获取服务。这里选择story"作为用户应该可以查看、查询所有门店网络",编辑得到如下结果:
此外还实现了设置业务优先级、业务选择过滤、自定义业务过滤器等等,具体操作结果如下:
然后创建迭代4,这里需要注意观察之前的迭代实现了哪些功能,避免和新的迭代产生冲突。
迭代的具体要求:步骤1 迭代名称"迭代4"、设置迭代计划时间,单击"新建"。本练习中,设置迭代设置迭代的开始日期为本周一,结束日期为下周五。按照同样方式创建迭代5,并设置迭代周期为下一个周期。然后进行迭代规划:步骤1 接下来我们需要对当前迭代(近两周)的工作进行规划,其中最重要的工作"作为用户应该可以查看、查询所有门店网络"需要在本迭代完成并上线。在迭代页面,单击"未规划工作项",找到Story"作为用户应该可以查看、查询所有门店网络",鼠标拖拽工作项至"迭代4"。单击"迭代4"的"作为用户应该可以查看、查询所有门店网络",可以设置Story的预计开始日期与预计结束日期。 按照同样的方式,添加以下两个Story添加至迭代4:作为用户可以登录账号;作为用户可以注册账号。
得到的结果如下:
Story分解。接下来我们需要将Story"作为用户应该可以查看、查询所有门店网络"拆分到开发任务级别,并指派给对应的负责人。单击工作项列表最右侧"操作"列中的图标 ,添加子工作项。输入Task标题"前端展示-添加门店网络菜单",并选择处理人,单击"确定"完成。按照同样的方式,添加Task"后台管理-添加门店网络管理维护模块"。
更换视图对各工程项进行观察:
每日站立会议的事务项记录:
跟踪项目状态
相关知识
燃尽图(英语:burn down chart)是用于表示剩余工作量的工作图表,由横轴(X)和纵轴(Y)组成,横轴表示时间,纵轴表示工作量。这种图表可以直观的预测何时工作将全部完成,常用于软件开发中的敏捷软件开发方式,也可以用于其他类型的工作流程监控。
具体操作
通过迭代图表,团队可以方便的统计当前迭代的进度情况,包括需求完成情况、迭代燃尽图、工作量等。本次实验的迭代图表如下:
项目仪表盘提供了强大的项目进度跟进能力、包括需求进度统计、燃尽图、工作完成度、工时统计等等。下图给出了本次实验的报表列表以及新版仪表盘:
项目管理配置
维护项目基本信息
通过本章节我学会了如何对 "凤凰商城" 进行基本信息等维护,以及团队成员管理,并学习如何通过定制站内消息通知以及邮件通知来跟进项目进度。
首先是项目成员管理。单击页面左侧菜单“成员管理”,进入“成员管理”页面。点击添加成员,在下拉菜单中选择“邀请其他企业用户”,在弹出窗口的“企业用户”文本框输入小组成员账号进行添加。重复该步骤直到小组全部成员添加完毕。
然后根据需要选择栈内通知以及邮件通知设置:
最后添加模块和管理模块,具体操作如添加负责人、输入描述以及名称。
定制项目工程流程
通过本节,我学会了如何使用"自定义工作项模版"功能来定制个性化的工作项表单,以及工作流程定制。
首先将验收标准作为必填项:
然后增加工作项,改变当前项目的属性为进行中:
添加并勾选验收中的选项,保存设置后调整各个状态的顺序,即将验收中的状态放置在测试中这一状态之后:
持续开发和集成
代码托管
使用CloudIDE修改和提交代码
相关知识
**CloudIDE:**面向云原生的轻量级WebIDE,通过浏览器访问即可实现云端开发环境获取、代码编写、编译调试、运行预览、访问代码仓库、命令行执行等能力,同时支持丰富的插件扩展。
具体操作
登录DevCloud,记录story"作为用户应该可以查看、查询所有门店网络"的编号。
进入cloudide服务,新建实例。自定义IDE实例名称,其他项可保持默认设置,项目名称选择您在DevCloud创建的样例项目名称,仓库地址选择“phoenix-sample.git”。
等待CloudIDE加载完毕后,打开"/vote/templates/index.html",进行以下编辑,即在179行添加菜单"门店网络":
然后使用Git命令将修改的代码提交到代码仓库中。在新版本的cloudide中,只需要选择对应文件后选择对钩图表以及push选项即可,对于提交信息,注意工作项编码为上述记录的编码。
然后查询代码是否更改成功,查询代码托管的历史记录即可:
同时,可以在story页签中的代码提交记录中观察到提交结果:
使用CloudIDE运行代码
相关知识
Pylint 是一个 Python 代码分析工具,它分析 Python 代码中的错误,查找不符合代码风格标准(Pylint 默认使用的代码风格是 PEP 8,具体信息,请参阅参考资料)和有潜在问题的代码。
具体操作
回到CloudIDE页面,打开index.html,预览前端页面:
安装依赖项:Linter pylint和python 3.7.x。这里本机已经安装了python3.9,因此没有安装python 3.7.x的解释器,这里就不再进行赘述。运行所需模块的安装过程如下:
然后替换部分代码,使之符合Python2.7.x的特性,最后在app.py程序中运行
由于对应网站的安全证书存在问题,很多浏览器为保证用户隐私而拒绝不安全连接,因此这里使用扫描url的方法使用安卓手机验证,得到如下结果:
后续发现对不安全网站输入“thisisunsafe”命令然后回车即可。
添加登录系统
相关知识
Flask中的jsonify被定义为Python能力中的一种功能,通过包装用于添加增强功能的转储函数。
具体操作
这里首先在cloudide中填补缺失代码,在/vote/template目录下新建登录界面模板login.html
导入需要的函数库,即jsonify、redirect、url_for:
在/vote/app.py文件的47行和/vote/app.py文件的 main入口前添加必需的程序块。最后将修改后的代码传输到代码仓库,调试新生成的代码,登录凤凰商城,得到如下的登录状态:
使用Git分支+合并请求方式提交代码并进行代码检视
相关知识
Git 是基于Linux内核开发的版本控制工具。与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持(wingeddevil注:这得分是用什么样的服务端,使用http协议或者git协议等不太一样。并且在push和pull的时候和服务器端还是有交互的。),使源代码的发布和交流极其方便。 Git 的速度很快,这对于诸如 Linux kernel 这样的大项目来说自然很重要。 Git 最为出色的是它的合并跟踪(merge tracing)能力。
具体操作
这里需要提升分支的稳定性以及使用拉取请求的方式完成用户故事的开发。
首先将master分支设置为受保护分支。进入代码托管服务。单击仓库名称,进入代码仓库,选择相关页签,进入保护分支管理,进行相关参数的配置,得到如下的结果:
然后对分支进行管理合并策略,这里需要选择允许分支合并的最低评分:
然后创建分支进行新功能开发,在代码仓库中新建分支(分支名称"feature工作项编号")
用cloudide打开代码仓库,选择新创建的分支进入
合并请求(登录模块)
- 创建合并请求,在代码托管中新建合并请求,选择新建的分支,入标题、描述(选填),选择合并人、评审人,提出请求。
- 评审人进入代码仓库找到需要评审的合并请求,查看合并请求详情,对合并请求进行评分。(PS:这里拒绝合并,防止后续产生冲突。当然这里也可以在文件变更页签,针对某一行代码发表讨论。评论与讨论的区别在于:评论无需回复并解决。而讨论是一个需要解决的问题。在评论记录里,可以看到差别。)
- 评审成员提交评分,合并人进入代码仓库后,在"合并请求"页签中找到需要评审的合并请求,单击该请求即可完成合并。对于被拒绝的请求,合并人需要分析审理人提出的问题以及评价,给出更好的合并方案。
代码检查确保编码规范
为示例项目配置代码检查任务并执行
在代码检查部分选择"phoenix-codecheck-worker"任务进行代码检查。
修改规则集。首先步骤1 重新获取代码仓库语言,在刷新的列表中将Python语言对应的开关打开。
然后启动代码检查任务,观察检查结果:
可以看到代码中存在着11个问题,代码的平均复杂度为17.7%,有效代码行数为324。
分析代码检查结果并修复问题
分析代码检查报表,查看检查结果。这里需要设置质量门禁,观察不满足门禁的问题,"代码问题"页签中列出问题的严重级别、状态、所属文件等信息,可以根据需要对代码进行修改,及时解决代码存在的相关问题。对于不是很重要的问题,可以选择将其状态设置为“已解决”或者“已忽略”。
配置和管理代码检查规则集
这里我们需要学习自定义规则集的设置以及自定义代码检查的设置。
在代码检察服务中设置新的规则集"phoenix-java-rule-set"
系统自动进入新建规则集的"规则集配置"页面,此时需要取消"Loops should not be infinite"规则的选择。
然后启动自定义检查规范,进入代码检查任务"phoenix-codecheck-worker"的"代码检查详情"页面,勾选规则集"phoenix-java-rule-set"。
启动代码检查任务,任务成功执行后,再次查看检查结果。检查出来的问题是团队关心的问题,应该尽快修复掉。
使用自动化编译提高代码质量验证速度
通过本节,我们需要学习如何通过"编译构建"服务完成应用的Docker镜像打包以及推送。
首先查看编译构建任务,单击"phoenix-sample-ci"进入"编译构建编辑任务"页面。在源码选择"栏,"仓库分支"选择"master"。然后配置SWR服务,进入到"容器镜像服务"主页,在登录指令中找到对应指令。本次实验的指令如下:
docker login -u cn-north-4@452RN6W0V1686CMHXZVO -p 3880b9568aa05a263f3c8d6a6b164f098fb7b91ab6cf818f5b2346b3bfe57823 swr.cn-north-4.myhuaweicloud.com
返回DevCloud页面,选择"参数设置"页签,编辑dockerOrg和dockerServer:
然后修改镜像为swr容器上的镜像地址,启动编译构建任务。编译构建完成后,进入发布服务。列表中找到相关文件夹。然后进入SWR控制台,选择"我的镜像"
在列表中单击"worker"查看镜像详情。
配置持续集成并通过提交代码触发自动化编译
持续集成配置。进入编译构建任务"phoenix-sample-ci"的"编译构建编辑任务"页面,选择"执行计划"页签,打开"提交代码触发执行"开关,持续集成执行计划配置。
使用开源镜像站服务改进自动化编译
如何使用开源镜像站服务提高依赖包获取速度,提高自动化编译效率呢?这里使用了手册中的方法二,即分别配置python、npm、nuget:
持续测试与反馈
使用追溯视图进行驱动的测试
进入项目选择测试计划,新建测试计划,填写测试计划名称、处理者、计划周期,选择手工测试、接口自动化、性能自动化测试,在添加需求页面勾选“作为用户应该可以查看、查询门店网络信息”工作项。
新版本的测试计划高级配置和旧版本存在差异,不需要选择测试类型,分为手工测试、接口自动化以及性能自动化,同时初始设置为最初思维导图中设置的工作项和子工作项。具体参数设置如下:
然后设计功能测试用例:
接着,设计接口测试用例并执行。新建迭代4接口测试计划,添加需求“作为用户可以登录账号”Story,并为该需求设计测试用例。l 编写测试脚本,在新建步骤中选择“URL请求”。请求选择“POST”,URL地址使用部署服务器的ip地址/api/login。这里作为测试,我们可以选择CloudIDE调试运行时访问的URL\api\login。填写好请求信息后,添加“表单参数”。在请求体中填写username和password。
点击右上角“保存”,进行调试,查看结果:
性能测试
编写性能测试计划
部署测试环境应用
测试工具搭建
获取AOM服务,安装ICAgent。在安装过程中,需要获取AK/SK密匙,然后复制ICAgent安装命令,使用PuTTY等远程登录工具,以root用户登录待安装主机(主机为刚所购买的云主机),执行复制到的命令
当显示“ICAgent install success”时,表示安装成功。安装成功后,在左侧导航栏中选择“Agent管理”,查看ICAgent状态。
然后通过AOM查看当前主机的状态
接着获取云性能测试CPTS,安装CPTS录制插件
这里出现了程序包无效的问题,此时需要右击下载链接,将插件安装包另存为桌面。下载成功后,将后缀更改为rar后解压在某一个文件夹中,然后再谷歌浏览器中的插件开发者模式中选择加载录制插件,最终安装成功,安装结果如上图所示。
最后购买CCE资源,创建CCE集群,集群规模50节点,控制节点数1,虚拟私有云默认网段。
性能测试资源准备及执行
使用步骤1 CPTS录制脚本,点击开始录制,打开凤凰商城的官网,录制工具自动访问操作过程中的HTTP,观察录制结果:
将需要的数据导出得到json文件。在CPTS中添加测试资源,添加刚刚创建好的CCE节点;
等待其运行成功:
接着创建测试工程并添加任务:
添加测试用例以及多节点:
将脚本导入,并发参数以及压力配置如下图所示:
启动压力测试,注意CCE资源对于性能的要求,在本次实验中我首先选择了2核4GB的节点,但是这种节点并不适合压力测试,性能较低、在本次试验中最适合的节点为4核8GB。
压测实验结束后,观察各项测试指标,这里对各项测试指标和响应状态分布进行了研究,得到了如下的结果:
可以看出,压测实验的结果较为成功。然后再devcloud云测界面中执行相关的性能测试,发现测试结果十分成功。
使用测试套件进行迭代测试规划
这里在项目中选择测试执行,选择新建测试套件,在迭代4中添加新的实验用例,同时对用例进行筛选:
用例自定义
首先进入项目,在云测设置中使用功能用例自定义,输入已分配选项:
返回设计测试,选择新建的测试用例,保存已分配状态:
使用测试用例和测试套件视图进行用例驱动测试
进入项目选择测试执行,在测试套件部分查看测试套件的执行情况:
对于测试失败的用例,可以选择分析内部失败的原因,记录其中的缺陷信息,消除项目关联的bug,最后执行成功。
使用测试总览跟踪测试进度和质量
分析测试的执行结果,对迭代4的需求覆盖率、缺陷、用例通过率等相关统计进行分析。
自定义测量报表,通过统计度量可以量化高效管理测试团队和测试项目,自定义报表可以帮助创建个性化的统计报表。
持续部署与发布
购买并配置弹性云服务器
在前面已经购买了相关的弹性云服务器,这里就不再赘述,只标出云服务器的配置:
返回控制台,单击云主机名称,进入主机管理页面。选择"安全组"页签,单击安全组名称,展开详情,单击"更改安全组规则",选择"入方向规则"页签,单击"添加规则",添加一条入方向规则"允许访问5000以及5001端口"。
然后添加授信主机。
当出现以下提示时,表示主机添加成功。
使用DevCloud部署服务配置主机环境
进入项目,选择部署服务,新建关于docker的部署任务,等待安装:
使用自动化部署实现一键部署
持续部署配置。进入项目,单击页面上方导航"构建&发布 > 部署",进入部署服务。找到部署任务"phoenix-sample-standalone",单击此任务对应操作列中的图标,进入"编辑任务"页面。
选择"部署步骤"页签,单击部署步骤"选择部署来源",编译相关信息。
选择"参数设置"页签,根据SWR服务登录指令填写参数。登录指令通过SWR控制台获取。
单击"保存并执行",启动部署任务。系统自动跳转至"部署详情"页面,可以查看任务执行进展。当出现以下页面时,表示任务执行成功。
持续交付流水线
配置流水线串接代码检查,编译构建和自动化部署步骤
创建并触发持续交付流水线。进入项目,单击页面上方导航"构建&发布 > 流水线",进入流水线服务,选择新建流水线。
单击图标,在右侧滑出框中输入名称"代码检查",单击"保存"。
在"代码检查"后面,按照同样方式,添加构建任务"phoenix-sample-ci"。
在"测试"后添加阶段"部署",并在该阶段中添加部署任务"phoenix-sample-standalone",单击"保存"。
步骤1 流水线任务阶段设置完成后点击右上角"保存并执行",启动流水线。当出现以下页面时,表示任务执行成功。
添加质量门禁。为了控制代码的质量,我们要求代码必须经过扫描,并且错误数量控制在合理范围内,才允许发布。
保存流水线,返回"流水线详情"页面。启动流水线任务,待任务执行结束可看到:由于代码检查问题数大于5,因此流水线任务执行失败。
更新流水线配置,实现代码变更触发的持续交付流水线
步骤1 进入项目,单击页面上方导航"构建&发布 > 流水线",进入流水线服务。找到流水线任务"phoenix-sample-pipeline",单击此任务对应操作列中的图标,进入"流水线配置"页面。点击"代码源"页签,在"更多设置"中勾选所需触发分支,单击"保存"。
流水线配置高级功能
添加人工审核,DevCloud支持在流水线任务中加入人工审核设置,在某个阶段任务执行完成时,需要人工审核通过才能继续执行。
资源释放
为了避免不必要的费用,如果您在项目课程实践完成后,无需再使用这些资源,建议您参考以下操作释放弹性云服务器资源。返回ECS控制台,选择phoenix-test(自定义主机名)云主机,然后点击"更多删除"。在弹出的对话框中勾选"释放云服务器绑定的弹性公网IP地址"和"删除云服务器挂载的数据盘",然后点击"是",删除云主机,释放ECS资源。
回到CloudIDE服务,删除IDE实例:
实验总结
通过本次实验,我对软件项目开发、测试、维护的一系列流程有了更为深入的了解。总的来说,软件项目开发分为六个阶段,即项目启动阶段、需求阶段、设计阶段、开发阶段、测试阶段、常规文档。
在项目启动阶段,产品经理和项目内的干系人确定项目的方向,公司确定项目组的团队组成,同时需要明确项目管理制度,输出《需求调研》以及《业务梳理》的相关文档。在本次实验中,由于是直接从迭代四开始做起,因此不需要项目启动这一阶段(因为项目启动已经发生在第一次迭代中,可以看到凤凰商城的项目启动方向就是售卖汽车零件的网络平台)
在需求阶段,产品经理提供最简单也最接近成品的《产品原型》,线框图形式即可。在这个过程中还可能产生的包括业务流程图和页面跳转流程图。业务流程图侧重在不同节点不同角色所进行的操作,页面跳转流程图主要指不同界面间的跳转关系。在本次实验中,我们的需求就是在开始阶段绘制的思维导图,其中story就是需要实现的具体功能。与此同时,团队内部的分工也是需要在需求阶段确定的。结合scrum模式的特点,每日站立会议也是一个小的需求阶段,它需要你明确实现功能的过程中需要面对的问题,根据问题的难易程度去略微改变需求的实现方法,也是一种需求变化的阶段。
在设计阶段,UI设计师根据产品的原型,输出《界面效果图》,并提供界面的标注,最后根据主要的界面,提供一套《UI设计规范》。UI设计规范主要是明确常用界面形式尺寸等,方便研发快速开发。UI设计常涵盖交互的内容。研发工程师完成《概要设计》、《通讯协议》及《表结构设计》,及完成正式编码前的一系列研发设计工作。在本次实验中,我们对项目的前端页面和后端的接口进行了修改,利用代码仓库的存储功能,将代码使用git命令传输到云端。虽然在调试过程中遇到了许多问题,但是整体的过程还算得上顺利,同时提升了我的编程水平,对python中的各个函数库有了更为深入的了解。
在开发阶段,研发工程师正式进入编码阶段,这个过程虽然大部分时间用来写代码,但是可能还需要进行技术预研、进行需求确认(每日站立会议、代码自动化检查)。编码过程一般还需进行服务端和移动端的联调等,在凤凰商城新功能测试中,使用的cloudide能够给出网站的二维码,从而使得双端的程序测试更加便捷。
在测试阶段,测试工程师按阶段设计《测试实例》,未通过的流程测试提交至开发组,分配给相应的开发人员调整。在本次实验过程中,华为云系统可以实现审批人和申请人的互通有无,通过打分的方式确定申请项目是否通过测试。
在常规文档阶段,项目组根据开发得到的软件,输出内部的技术文档以及客户使用的操作文档。
总而言之,通过本次实验,我掌握了如何使用华为云平台进行软件项目开发的流程,希望在之后的软件开发学习过程中,继续使用华为云平台进行软件的创新,和团队队员一同创造价值。