原文地址:http://www.csdn.net/article/2015-05-26/2824771-continuous-integration-deployment-for-ios-projects
当实现新功能时,如果忽略可维护性而引入技术债务,那将会需要延迟解决它或导致增加维护成本。
最近我们已经思考通过哪些方式来提高代码的质量:
- 当代码的质量下降时,通过设置一些工具来马上提醒开发者;
- 文档化一些编码规范和思考在过去的几个项目中如何避免维护性差的问题。
我将会简单地概括我们需要设置什么才能自动监控代码质量。
基础
我们选择一个持续集成工具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来根据时间的推移提供单元测试结果的图表,同时会向我们显示我们的测试是否稳定。
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。
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。有了这些插件之后,你也可以在测试失败之前,设置每个警告的优先级(底,中,高)中一些限制。最初,我们设置这些限制为低,那么只要我们引入代码,就会被提醒,从而提高代码质量。
Static Analysis
自动部署
最后一个问题不是如何提高代码质量,而是如何节省时间。开发者通常都会将编译好的代码通过Crashlytics发送到设计师来设计审查,或在sprint结束演示时发给用户。发送一个已经编译好的App通常花一个开发者的10分钟左右时间,但它需要他们来切换任务和干扰他们的心流。
最近我们已经配置一个在夜晚构建系统,它会在早上自动发送一个新版本的App给每个人。
为了做到这样,我们使用fastlane。fastlane是一个定义lanes的一些操作来执行的强大工具集。现在我们有三个已经定义好的lanes,一个是用来发布给ribot开发者,一个是用来发布给在ribot的每个人,最后一个是发布给用户。
before_all do |lane| cert sigh end desc “Deploy a new build to ribot iOS developers over crashlytics” lane :dev do ipa crashlytics({ groups: ‘ribot-developers’ }) end desc “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_repo end desc “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_remote end after_all do |lane| clean_build_artifacts end
通过使用fastlane工具(通过Ruby Gems来安装)来运行一个lane。
fastlane internal
在开始使用所有的lanes之前,我们应该自动确保我们有一个有效的signing certificate和最新的provisioning profile。所有我们的配置都放在一个.env文件,它让我们有些默认配置,但当我们运行fastlane根据需要来覆盖它们。
在将来,我们会通过使用deliver操作来自动化App Store提交过程。
最后总结
到目前为止,我们已经尝试这些过程,并在工程中呈现出好的结果。我们期望看到只要适当地使用这些工具,就能提高代码的质量,这些报告将会让我们随着时间推移来量化代码质量。我们期待在下一个工程中适当地使用这些工具会发生什么。
相关推荐
Jenkins作为一个流行的持续集成工具,可以方便地与iOS项目相结合,实现自动化构建、测试和部署。本示例将探讨如何设置并运行iOS项目的Jenkins自动化集成测试。 首先,我们需要理解Jenkins的核心概念。Jenkins是一个...
15. **持续集成/持续部署 (CI/CD)**:通过Jenkins、Fastlane等工具实现代码的自动化构建、测试和部署,提高开发效率。 以上是iOS项目基本架构中的关键知识点,理解并掌握这些内容,可以有效地构建出高质量、易于...
2. **UI设计与Storyboard**:iOS项目通常使用Storyboard进行界面布局,它允许开发者通过可视化方式设计用户界面。在字典项目中,你需要了解如何创建和管理UIViewController,使用AutoLayout实现屏幕适配,以及添加...
面对复杂的工程结构(如iOS的多bundle工程)和有限的测试资源,持续集成显得尤为重要,因为它可以自动化流程,执行集成测试,并及时发现和修复问题,从而降低开发和测试成本,提升团队效率。 在iOS多bundle工程的...
7. **持续集成/持续部署(CI/CD)**:如Jenkins、Travis CI等,自动化构建和发布流程,提高效率。 8. **代码规范和版本控制**:遵循一定的编码规范,使用Git进行版本控制,保证代码整洁且易于协作。 通过学习和理解...
8. **单元测试与持续集成**:高质量的代码通常会有相应的单元测试和持续集成流程,例如使用XCTest进行测试,以及Jenkins或GitHub Actions进行自动化构建。 9. **国际化与本地化**:考虑到是“国外”餐饮项目,源码...
11. **持续集成与测试**:源码可能包含单元测试和自动化构建的实践,这对于保证代码质量和项目进度至关重要。 通过深入研究这90个实例源码,开发者不仅可以掌握Swift编程,还能了解到iOS开发的全貌,包括最佳实践、...
3. **Jenkins**:用于持续集成,自动化测试和构建过程。 总的来说,iOS项目开发涵盖了从项目创建、编码、界面设计、测试到发布的一系列过程。开发者需要熟练掌握Xcode的使用,理解项目结构,掌握源码管理,并能够...
总结,iOS项目框架搭建是一个系统性的工程,涉及到项目结构规划、宏定义、自定义控件、依赖管理、设计模式以及测试等多个方面。理解并熟练运用这些知识点,将对提升开发效率和产品质量起到关键作用。
**Swift:快速启动iOS项目模板集成最佳实践与工具** Swift是一种强大的、开源的编程语言,由Apple公司设计,主要用于开发iOS、iPadOS、macOS、watchOS和tvOS的应用程序。这个“swift-一个用于快速启动您的下一个iOS...
11. **持续集成与持续部署(CI/CD)**:对于大型项目,使用Jenkins、Fastlane等工具进行自动化构建和部署,能提高开发效率和质量。 这个视频教程可能会详细讲解以上各个步骤,帮助初学者掌握完整的iOS项目开发流程...
如果你需要批量生成IPA或者集成到持续集成(CI)流程中,可以使用Xcode的命令行工具`xcodebuild`。通过编写脚本,指定项目路径、目标、配置、证书和Profile,就能自动化打包IPA。 5. 证书描述文件: 在提供的压缩包中...
### 移动开发工程化实践——滴滴出行跨地域IOS构建优化与持续集成 #### 背景概述 在当前移动互联网高速发展的背景下,移动应用尤其是像滴滴出行这样的大型平台面临着日益增长的技术挑战。如何有效应对多地域开发...
使用Git作为代码管理工具,配合GitLab-runner实现持续集成/持续部署(CI/CD)的功能。这旨在解决开发人员频繁手动打包的问题,同时让测试团队能够清晰地了解他们正在测试的版本信息。 二、适用范围 该方法适用于...
### iOS Sonar集成流程详解 #### 一、Sonar简介及功能 ...综上所述,iOS项目与Sonar集成的过程涉及到多个工具和技术点的配合使用。通过对这些工具的学习和掌握,可以有效提升iOS项目的代码质量和自动化程度。
10. **持续集成/持续部署(CI/CD)**:为了提高开发效率和软件质量,DEMO可能采用了Git进行版本控制,并与GitHub或Bitbucket等服务集成,实现自动化构建和部署。 在VipManageSystem这个压缩包中,可能包含了项目的...
10. **单元测试与持续集成**:良好的源码管理还包括编写单元测试以验证代码功能,以及利用如Jenkins、Travis CI等工具实现持续集成,确保代码质量。 通过这个“简单的层管理”项目,开发者可以学习到如何组织和管理...
开发者可能会使用XCTest进行单元测试,或者集成CocoaPods和Carthage进行依赖管理和持续集成。 10. **国际化与本地化**:大型应用通常需要支持多语言。查看源码,我们可以学习如何实现应用的国际化和本地化。 通过...
以上是iOS上线项目的主要知识点,涵盖了从开发环境设置到上线后的维护管理,每个步骤都需要细心操作,以确保应用的成功发布和持续运营。对于“小雨点资讯”这样的应用,开发者可能还需要关注新闻内容的更新机制、...
6. **持续集成**:AutoPackage非常适合集成到持续集成(CI)系统,如Jenkins、Travis CI或GitHub Actions,实现每次代码提交后的自动测试和打包。 7. **ARKit相关**:对于包含ARKit的项目,脚本可能还需要处理特定...