构建,测试,交付!使用fastlane和Jenkins完整的iOS持续交付指南

iOS / macOS开发真的很有趣。
您可以在很多领域获得领域知识! 您可能会学习图形技术,例如Bezier或3D变换。 您需要了解如何使用数据库或设计有效的架构。 此外,您应该能够以嵌入式系统的方式管理内存(特别是对于那些处于伟大的MRC时代的人)。 所有这些使iOS / macOS的开发变得如此多样且充满挑战。

在本文中,我们将学习您可能需要了解的另一件事:持续交付(CD) 。 持续交付是一种软件方法,可帮助您随时可靠地发布产品。 CD通常带有术语持续集成(CI) 。 CI也是一种软件工程技术。 这意味着系统一直在不断将开发人员的工作合并到主线中。 CI和CD不仅对大型团队有用,而且对单人团队也有用。 而且,如果您是一个单人团队的唯一开发人员,那么CD对您可能意味着更多,因为每个应用程序开发人员都不可避免地需要交付。 因此,本文将重点介绍如何为您的应用程序构建CD系统。 幸运的是,所有这些技术也可以在CI系统的构建中采用。

假设我们正在开发一个名为Brewer的iOS应用,那么我们的工作流程将非常简单:

首先,我们发展。 然后,质量检查小组会帮助我们手动测试该应用。 质量检查批准测试版本后,我们发布(提交给AppStore进行审查)我们的应用程序。 在不同阶段,我们有不同的环境。 在开发过程中,我们会在临时环境中构建应用程序,以便每天/每晚进行测试。 质量检查小组进行测试时,我们准备了一个基于生产环境构建的应用程序。 这可能是专门针对质量检查团队的每周构建。 最后,我们使用生产环境提交该应用程序。 这样的最终版本可能根本没有预定义的时间表。

让我们更深入地研究交付部分。 您可能会发现我们在构建测试应用程序方面有很多重复的工作。 CD系统可以为您提供帮助。 具体来说,我们的CD系统需要:

  1. 在不同的环境(阶段/生产)中构建应用程序。
  2. 根据我们选择的环境对代码进行签名。
  3. 导出应用程序并将其发送到分发平台(例如Crashlytics和TestFlight)。
  4. 根据特定的时间表构建应用。

大纲

这是我们在本文中要做的:

  • 设置项目 :如何设置项目以支持不同环境之间的切换。
  • 手动签名代码 :如何手动处理证书和配置文件。
  • 独立环境 :如何使用Bundler隔离系统环境。
  • 使用fastlane进行构建🚀 :如何使用fastlane生成和导出应用程序。
  • Jenkins将是您今晚的服务器 :Jenkins如何帮助您安排任务。

在开始之前,您可能需要检查一下:

  • 什么是快车道
  • 詹金斯是什么
  • 什么是代码签名

如果您是一个忙碌的男孩/女孩,请放心,我将Brewer应用程序设为带有示例脚本的公共存储库!

科罗米科/布鲁尔
啤酒厂–我们每晚都酿啤酒! github.com

所以,让我们开始吧!

设置您的项目

我们通常在开发人员测试阶段连接到开发服务器或登台服务器。 将应用发布给质量检查小组或AppStore时,我们还需要连接到生产服务器。 通过编辑代码切换服务器可能不是一个好主意。 在这里,我们在Xcode中使用构建配置和编译器标志。 我们不会详细介绍该配置。 如果您对设置感兴趣,请查看Yuri Chukhlib撰写的这篇很棒的文章:

轻松管理Swift项目中的不同环境
medium.com

在我们的Brewer项目中,我们具有三种构建配置:

  • 分期
  • 生产
  • 发布

每个映射到一个特定的捆绑包标识符:

我们设置标志来帮助我们的代码知道我们正在使用哪个服务器环境。

因此,我们可以执行以下操作:

对于每个iOS / macOS开发人员来说,这是一个众所周知的红色按钮。 我们通过取消选中此框来启动每个项目。 但是为什么它如此臭名昭著? 您可能知道它下载了证书和配置文件,并将它们嵌入到您的项目和系统中。 如果丢失任何文件,它将为您创建一个新文件。 对于一个单人团队来说,这没错。 但是,如果您所在的团队很大,则可能会意外刷新原始证书,然后由于证书无效,建筑系统将停止工作。 对我们来说,这是一个藏有太多信息的黑匣子。

因此,在我们的Brewer项目中,我们想手工完成。 我们的配置中有三个应用程序ID:

  • work.sth.brewer.staging
  • 作品创作
  • work.sth.brewer

在本文中,我们将重点介绍前两个配置。 现在我们需要准备:

  • 证书 :.p12格式的临时/ App Store分发证书。
  • 供应配置文件 :两个应用程序标识符work.sth.brewer.stagingworks.sth.brewer.production的 临时分发供应配置文件。

请注意,我们需要证书文件的p12格式,因为我们希望它可移植到不同的机器上,并且仅.p12格式包含证书的私钥。 选中此项以查看如何将.cer文件(DEM格式)转换为.p12(P12格式)文件。

现在,我们的代码签名文件位于一个文件夹中:

这些文件由CD系统使用,因此请将该文件夹放在CD机上。 请不要将这些文件放在您的项目中, 也不要将它们提交到您的项目存储库中。 可以将代码签名文件托管在其他私有存储库中。 您可能需要检查匹配的安全性讨论-fastlane文档。

用fastlane构建

fastlane是使开发和发布工作流程自动化的工具。 例如,它可以在一个脚本中构建应用程序,运行单元测试,并将二进制文件上传到Crashlytics。 您无需手动逐步执行这些操作。

在这个项目中,我们将使用fastlane完成两项任务:

  • 生成并发布在临时环境中运行的应用程序。
  • 生成并发布在生产环境中运行的应用程序。

这两种方法之间的区别只是配置。 共享的任务是:

  • 使用证书和配置文件对代码签名
  • 生成并导出应用
  • 将应用程序上传到Crashlytics(或其他分发平台)

了解了我们的任务,我们现在就可以开始编写fastlane脚本了。 我们将使用Swift的fastlane在此项目中编写脚本。 Swift的Fastlane仍处于测试阶段,因此,除了以下各项之外,其他所有方面都运作良好

  • 它不支持插件
  • 它不会捕获异常

但是,用Swift编写脚本会使开发人员更容易阅读和维护。 而且您可以轻松地将Swift脚本转换为Ruby脚本。 因此,请尝试一下!

我们首先开始我们的项目(还记得Bundler吗?):

 捆绑程序执行器fastlane init swift 

然后,您可以在fastlane / Fastfile.swift中找到一个脚本。 在脚本中,有一个fastfile类。 这是我们的主程序。 在此类中,每个以后缀“ Lane ”命名的方法都是一个Lane。 我们可以向车道添加预定义的动作,并使用以下命令执行车道:

 捆绑exec fastlane 。 

让我们填写一些代码:

Jenkins获取项目的最新代码并定期为您运行任务。 在execute shell部分中,我们可以看到Jenkins实际上执行了之前部分中已经完成的任务。 但是现在我们不需要自己做它们,Jenkins可以无缝地为您做到这一点!

从每晚的构建工作开始,让我们开始创建Jenkins任务。 首先,我们创建一个“自由式项目”,然后进入它的“配置”页面。 我们需要配置的第一件事是“ 源代码管理 (SCM)”部分:

存储库URL是项目的源代码URL。 如果您的存储库是私有存储库,则需要添加凭据才能访问该存储库。 您可以在“ 分支”中将目标分支设置为build ,通常这是您的默认分支。

然后,在下面我们可以看到“ 生成器触发器”部分。 在本节中,我们可以决定将触发构建作业的原因。 根据我们的工作流程,我们希望它在每个工作日晚上开始。

因此,我们检查Poll SCM ,这意味着Jenkins将定期轮询指定的存储库。 在计划文本区域:

  H 0 * * 0–4 

这是什么意思? 让我们检查一下官方说明:

该字段遵循cron的语法(略有不同)。 具体来说,每行包含5个用TAB或空格分隔的字段:
分钟小时DOM DOW
MINUTE一小时内的分钟数(0–59)
HOUR一天中的小时(0–23)
DOM每月的一天(1-31)
月月(1–12)
DOW星期几(0–7),其中0和7是星期日。

它包含五个字段:

  • 分钟
  • 小时
  • 平日

该字段可以是数字。 我们也可以使用“ *”代表“所有”数字。 我们使用“ H”代表一个哈希,自动选择“一个”数字。

所以我们的时间表:

  H 0 * * 0–4 

表示:该工作在每天的晚上0点至凌晨1点(星期日至星期四)的特定时间运行。

最后但并非最不重要的一点,让我们检查下面的“ 构建”部分。 这是我们希望詹金斯执行的任务:

 出口LC_ALL = en_US.UTF-8; 
export LANG = zh_CN.UTF-8;
 导出CODESIGNING_PATH =” / path / to / cert”; 
出口CERTIFICATE_PASSWORD =“ xxx”;
导出KEYCHAIN_NAME =” XXXXXXXX”;
导出KEYCHAIN_PASSWORD =” xxxxxxxxxxxxxx”
 捆绑软件安装-路径供应商/捆绑商 
捆绑exec fastlane开发人员发布

前6行设置了我们之前介绍的环境变量。 第七行安装依赖项,包括fastlane。 然后,最后一行执行一个名为“ developerRelease”的通道。 总而言之,此任务在每个工作日晚上构建并上传一个developerRelease。 这是我们的第一个每晚构建! 🚀

您可以通过单击Jenkins项目页面侧面菜单中的内部版本号来检查建筑物的状态:

摘要

我们与您一起学习了如何使用fastlane和Jenkins创建CD系统。 我们了解了如何手动管理代码签名。 我们创建了一个自动为我们运行任务的通道。 我们还探讨了如何在不更改代码的情况下切换配置。 最后,我们构建了一个CD系统,该系统每天晚上都会构建一个应用程序。

尽管许多iOS / macOS应用程序是由一个人团队创建的,但自动化交付过程仍然是一项高杠杆的改进。 通过使过程自动化,我们可以降低使用错误配置交付的风险,避免被过期的代码签名所困扰,并减少构建上载的等待时间。

本文介绍的工作流程可能与您的工作流程不完全相同,但是了解每个团队都有自己的工作流程和进度非常重要。 因此,您必须创建自己的CD系统来满足团队的需求。 通过使用这些技术作为构建块,您必须能够自己构建一个新的定制且更合适的CD系统!