iOS项目的持续集成与管理(iOS 持续集成)

当实现新功能时,如果忽略可维护性而引入技术债务,那将会需要延迟解决它或导致增加维护成本。

最近我们已经思考通过哪些方式来提高代码的质量:

  • 当代码的质量下降时,通过设置一些工具来马上提醒开发者;
  • 文档化一些编码规范和思考在过去的几个项目中如何避免维护性差的问题。

我将会简单地概括我们需要设置什么才能自动监控代码质量。

基础

我们选择一个持续集成工具Jenkins,让它运行在一台放在我们工作室的Mac Mini。其实我不怎么喜欢Jenkins,但到目前为止,它是最稳定和最适合的工具来完成这些工作。

我们已经通过Homebrew和rbenv来分别安装Jenkins和Ruby,而rbenv能够为我们提供一个最新和稳定的Ruby Gems环境。有个Homebrew和Ruby Gems两个包管理工具之后,我们就几乎能够安装所有我们需要的工具,但很少会破坏与原有OS X系统更新提供的Ruby。

单元测试

我们使用Specta和Expecta来测试我们的iOS项目。

Specta让我们采用行为驱动开发(BDD)风格的语法来编写测试,相比于XCTest的语法,它更加易读。它还有一个强大的分组测试功能,在测试之前或之后运行一些代码块,这样的话,能够极大地减少重复代码。

Expecta是一个匹配器框架,我们可以在测试中使用它来创建断言。它的语法非常强大,与此同时,它比内建的XCAssert套件更加易读。例如:

expect(@\”foo\”).to.equal(@\”foo\”);expect(foo).notTo.equal(1);expect([bar isBar]).to.equal(YES);expect(baz).to.equal(3.14159);

我们在开发时,通过XCode来运行测试;而使用通过Homebrew来安装的Jenkins时,会借助XCTool。XCTool是一个可代替的选择来xcodebuild,它能让你通过命令行的方式来非常轻松地运行测试套件和生成JUnit风格的测试报告。

$ xctool -workspace Project.xcworkspace -scheme Project -reporter junit:junit-report.xml test

这些测试报告会发布在Jenkins上,而Jenkins会使用JUnit Plugin来根据时间的推移提供单元测试结果的图表,同时会向我们显示我们的测试是否稳定。

iOS项目的持续集成与管理(iOS 持续集成)

Unit Test

Pull Request测试

我们想我们的测试尽可能运行以至于如果我们破坏什么东西,我们就会马上知道。我们在feature branches做些修改,然后提交一个pull request到Github,那么代码就会被另一个开发者审查。只要被打开,我们就能运行所有的测试来确保没有任何东西被破坏。

当新的pull requst是开放状态时,为了管理这些,我们安装Github Pull Request plugin来将信息从Github发送到Jenkins。如果有任何测试失败,它将会显示在Github,然后我们就不将代码合并,直到代码被修复为止。

代码覆盖率

我们也会用Gcovr工具来生成代码覆盖率报告,Gcovr的安装方式也是Homebrew。你需要针对main target的debug congfiguration改变两个构建设置来配置项目。将Generate Test Coverage Files和Instrument Program Flow都设置为YES。

iOS项目的持续集成与管理(iOS 持续集成)

Code Coverage

当我们运行单元测试来生成代码覆盖率报告时,我们需要将OBJROOT=./build添加到XCTool命令行的尾部。

$ gcovr -r . — object-directory build/Project.build/Debug-iphonesimulator/Project.build/Objects-normal/x86_64 — exclude ‘.*Tests.*’ — xml > coverage.xml

Gcovr输出的代码覆盖率报告也会被插件Cobertura Jenkins plugin发布,这个插件会提供一种可视化的方式来根据时间的推移来显示代码覆盖率。

现在我们不仅可以看到测试是否通过,还可以看到代码的测试覆盖范围。

静态分析

在工具集中,其中一个强大并能够保持高质量的代码的工具就是静态分析工具。这些工具会扫描你的代码,然后生成一个报告,这个报告会告诉你破坏代码风格规则的代码位置。举几个规则的例子:

  • 未使用的变量或参数
  • 长变量名,方法名或代码行
  • 覆盖一个方法,但没有在这个方法调用super
  • 方法太长或方法过于复杂
  • 还更多的规格…

我们使用OCLint静态分析工具,这个工具能够支持C,C 和Objective-C语言。OCLint通过结合XCTool使用来生成json-compilation-database reporter,从而提供great integration特性。我们首先添加另一个reporter到我们的XCTool命令行,然后将那个report传递到OCLint来执行静态分析。

$ xctool -workspace Project.xcworkspace -scheme Project -reporter junit:junit-report.xml -reporter json-compilation-database:compile_commands.json test$ oclint-json-compilation-database -e Pods -report-type pmd -o oclint-pmd.xml

这个report以PMD的方式来生成,然后使用PMD Plugin被发布到Jenkins。有了这些插件之后,你也可以在测试失败之前,设置每个警告的优先级(底,中,高)中一些限制。最初,我们设置这些限制为低,那么只要我们引入代码,就会被提醒,从而提高代码质量。

iOS项目的持续集成与管理(iOS 持续集成)

Static Analysis

自动部署

最后一个问题不是如何提高代码质量,而是如何节省时间。开发者通常都会将编译好的代码通过Crashlytics发送到设计师来设计审查,或在sprint结束演示时发给用户。发送一个已经编译好的App通常花一个开发者的10分钟左右时间,但它需要他们来切换任务和干扰他们的心流。

最近我们已经配置一个在夜晚构建系统,它会在早上自动发送一个新版本的App给每个人。

为了做到这样,我们使用fastlane。fastlane是一个定义lanes的一些操作来执行的强大工具集。现在我们有三个已经定义好的lanes,一个是用来发布给ribot开发者,一个是用来发布给在ribot的每个人,最后一个是发布给用户。

before_all do |lane| cert sighenddesc “Deploy a new build to ribot iOS developers over crashlytics”lane :dev do ipa crashlytics({ groups: ‘ribot-developers’ })enddesc “Deploy a new build to people at ribot over crashlytics”lane :internal do ensure_git_status_clean append_build_time ipa crashlytics({ groups: ‘ribot’ }) reset_git_repoenddesc “Deploy a new build to everyone over crashlytics”lane :external do ensure_git_status_clean increment_build_number ipa crashlytics({ groups: [‘ribot’, ‘client’] }) commit_version_bump add_git_tag push_to_git_remoteendafter_all do |lane| clean_build_artifactsend

通过使用fastlane工具(通过Ruby Gems来安装)来运行一个lane。

fastlane internal

在开始使用所有的lanes之前,我们应该自动确保我们有一个有效的signing certificate和最新的provisioning profile。所有我们的配置都放在一个.env文件,它让我们有些默认配置,但当我们运行fastlane根据需要来覆盖它们。

在将来,我们会通过使用deliver操作来自动化App Store提交过程。

最后总结

到目前为止,我们已经尝试这些过程,并在工程中呈现出好的结果。我们期望看到只要适当地使用这些工具,就能提高代码的质量,这些报告将会让我们随着时间推移来量化代码质量。我们期待在下一个工程中适当地使用这些工具会发生什么。

译者简介:刘耀柱(@Sam_Lau_13),iOS Developer兼业余Designer,参与开发技术前线iOS项目翻译,个人博客:http://www.jianshu.com/users/256fb15baf75/latest_articles。

CSDN移动将持续为您优选移动开发的精华内容,共同探讨移动开发的技术热点话题,涵盖移动应用、开发工具、移动游戏及引擎、智能硬件、物联网等方方面面,如果您有想分享的技术、观点,可通过电子邮件(tangxy#csdn.net,请把#改成@)投稿。

第一时间掌握最新移动开发相关信息和技术,请关注mobilehub公众微信号(ID: mobilehub)。

iOS项目的持续集成与管理(iOS 持续集成)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

(0)
上一篇 2022年7月23日 上午10:20
下一篇 2022年7月23日 上午10:34

相关推荐

  • 「经典案例」房屋建筑与市政公用工程总承包企业:浙江中大建设

    浙江中大建设介绍 01 浙江中大建设工程有限公司于2002年04月30日成立。公司经营范围包括:房屋建筑工程、市政公用工程施工;室内装饰;水电安装服务;土石方工程施工;园林绿化服务…

    科研百科 2022年9月8日
    244
  • 科研项目会议纪要模板(科研项目会议费一般是多少)

    科研项目会议费一般是多少 科研项目会议费是科研项目中的一个重要组成部分,用于参加学术会议、研讨会和交流活动。这些会议通常是学术研究领域的专家和学者们交流、分享研究成果和探讨学术问题…

    科研百科 2024年8月6日
    42
  • 科研技术来源怎么写

    科研技术来源怎么写 科研技术的来源是科研过程中至关重要的一部分,它决定了研究成果的质量和可靠性。在科研技术的来源方面,研究人员可以从各种途径获得所需的技术,包括购买、租赁、开源和自…

    科研百科 2024年11月10日
    0
  • 科研项目延期的原因有哪些

    科研项目延期的原因有哪些 科研项目的延期是许多科学家和研究人员所面临的一个普遍问题。一个项目延期的原因可能有很多,以下是其中一些常见的原因: 1. 资金不足 在申请资金时,一些项目…

    科研百科 2024年10月3日
    26
  • 装饰公司ERP系统

    装饰企业管理系统全面整合了装饰企业在工作中涉及到的设计预算、施工管理、审计管理、客服管理、材料管理、统计报表、预算管理等十多个方面的分类项目,无论你是设计师、材料员、市场人员,还是…

    科研百科 2023年5月29日
    149
  • 科研项目中承担的工作

    在科研项目中承担的工作 科研项目是推动科学技术发展的重要力量。在这些项目中,研究人员需要花费大量的时间和精力来研究问题、解决问题和实现目标。作为参与科研项目的一员,我们需要承担各种…

    科研百科 2024年10月12日
    11
  • 科研课题级别认定标准(科研项目最高级别是几级)

    科研项目最高级别是几级? 科研项目的最高级别通常由政府机构或学术机构确定。这些机构通常会根据项目的规模和复杂程度来评估项目的难度和级别。其中,最高级别的项目通常被称为“超级项目”或…

    科研百科 2024年4月3日
    106
  • 怎么查导师的项目

    如何查导师的项目 在研究生阶段,导师是非常重要的人物,他们会影响我们的研究方向和未来的职业发展。因此,了解导师的项目是非常重要的。那么,如何查导师的项目呢?下面是一些方法。 1. …

    科研百科 2024年10月30日
    3
  • 武冈市交通运输局开展党建业务培训活动

    红网时刻新闻9月20日讯(通讯员 沈程军 董远波)9月20日,武冈市交通运输局组织交通运输系统2023年党建业务培训活动。系统各支部书记、支委成员和单位党建专干共20余人参会。 培…

    科研百科 2023年10月23日
    53
  • 科研项目管理机制合理

    科研项目管理机制是保证科研项目顺利实施、达到预期目标的关键。合理的科研项目管理机制可以提高科研项目的效率和质量,为科学家们提供更好的研究环境。本文将探讨科研项目管理机制的合理性,并…

    科研百科 2024年11月10日
    0