Tag: 持续集成

Xcode Server:iOS持续交付的XCS的十大限制

原始文章:原始文章已发布在我的个人博客XCBlog上,继续阅读 此处 以获得更好的图形。 要阅读有关iOS DevOps和iOS CI / CD的更多有趣文章,请 在此处 访问我的博客 。 在苹果公司宣布Xcode 9内置Xcode Sever(又名XCS)之后,我写了一篇详细的文章,介绍如何设置Xcode Server以实现iOS与Xcode 9的持续集成。 该帖子提到了一些关键功能,包括内置服务器,无头和并行测试,自动代码签名和设备置备。 该帖子最初发布在我的个人博客上,并重新发布在Medium和DZone上。 但是,不久之后,我开始收到有关Xcode Server的局限性的评论,以实现iOS应用程序的持续交付。 使用Xcode Server for CI时,我也遇到了一些问题。 其中有些是已知的,有些是未知的。 我认为在这篇文章中值得分享,我们将讨论Xcode Server的主要限制。 这里列出了与Xcode Server相关的各种问题,但我们将介绍Xcode 9和Xcode Server的前10个问题。 请注意,下面提到的所有这些问题都是在撰写本文时。 目前,尚无法测试Github拉取请求。 一旦创建了Pull请求,许多TravisCI之类的CI服务器就可以构建iOS项目,以便开发人员可以及早获得反馈。 但是,对于Xcode Server,目前尚无法实现。 我印象深刻的是,Xcode Server不仅是为Github构建的,而且还发现了Xcode 9与Github紧密集成的事实。 苹果也应该考虑这个问题。 这是Xcode Server中严重错过的功能。 没有该功能,该产品将不完整。 以前,有一些工具可提供解决方法。 诸如Buildasaur或XBot Builder之类的工具可用于监视GitHub存储库中的拉取请求。 一旦创建请求请求,这些工具就会用于创建Xcode Bot并使用结果更新GitHub。 但是,情况发生了很大变化。 这些工具不再与最新版本的Xcode Server一起使用。 另一个解决方法是创建一个GitHub Webhook来监视请求请求,使用Xcode Server API创建Xcode […]

iOS CI,增压

当Skyscanner看到为其iOS代码库做出贡献的开发人员的数量大大增加时,它便着手重建其私有Mac云。 这是发生了什么事。 为iOS开发-不像Apple Pie那样简单 在过去的五年中,我一直是Skyscanner的iOS工程师,致力于塑造我们的移动应用程序的功能。 后来我加入了移动DevOps团队。 这使我可以利用自己的移动体验来改善我们的iOS平台基础结构。 业内许多人认为可以简化针对iOS的开发。 在构建一致且可扩展的iOS CI系统时,这一点更加明显。 当我第一次加入DevOps团队时,Skyscanner将Jenkins CI与本地Mac Minis和Mac Pros结合使用。 这些负责运行Android和iOS作业,我们一一管理。 如果要增加工作执行者的数量,则需要购买新的Mac。 这是因为Apple EULA声明您只能在正版Mac硬件上构建iOS代码。 如果还希望使执行程序保持一致,则可以选择创建NetRestore映像或使用JAMF。 无论哪种方式,您都必须手动关闭Mac,并忍受在配置Mac时无法使用它们。 如果您在所有这些方面都认识到当前的CI系统,或者遇到类似的问题,请继续阅读。 我们有一个解决方案供您考虑。 通往云的阶梯 在2018年初,我们看到为iOS代码库做出贡献的开发人员数量呈上升趋势。 具有CI资源修复的更多开发人员意味着更长的队列和等待时间。 我们需要尽快实现动态的负载平衡资源。 对于Android,我们的任务相对简单。 Skyscanner Web堆栈位于AWS上,因此我们已经拥有必要的云知识和工具。 在先前的研究中,我们已经定义了配置虚拟机所需的命令。 使用HashiCorp的Packer,我们可以生成Amazon Machine Image。 Jenkins可以使用Jenkins EC2插件实例化它们。 在此过程中,我们学到了很多有关如何在虚拟机上呈现必要状态(例如缓存)的知识。 最后,我们可以将并行作业从4个增加到30个。 对于iOS,我们必须多走一些路:我们在知识上有些不足,需要在皮带上添加一些新工具。 在开始该项目后不久,我们遇到了Veertu提供的虚拟化技术Anka。 由于其性能和易用性,它成为了我们的私有Mac云的核心。 这是您如何使其工作的方法: 设置Anka控制器和注册表Docker容器。 前者接受对新Mac虚拟机的请求。 后者管理不同版本的VM。 在Mac硬件上安装客户端。 将客户端连接到控制器和注册表。 通过Anka Jenkins插件集成控制器并进行配置。 例如,您需要设置控制器应为其触发新VM的Jenkins标签。 开始在自由式和管道作业中使用标签。 这里没有银弹,我们所做的更改涉及权衡: 🤩可以在单个Mac Pro上运行多个VM,这意味着CI环境中可以使用更多资源。 有了Anka,我们不必在过渡期间牺牲速度。 完整的项目存档大约需要18分钟才能在裸机Mac […]

Xcode Server:启用代码诊断工具

原始文章:原始文章已发布在我的个人博客XCBlog上,继续阅读 此处 以获得更好的图形。 要阅读有关iOS DevOps和iOS CI / CD的更多有趣文章,请 在此处 访问我的博客 。 Xcode提供了一些很酷的工具,可以用来检测一些手动或功能自动测试难以捕获的疯狂错误。 除非它们对应用程序产生影响,否则很难找到与内存和线程相关的问题。 在我以前的有关在iOS CI上激活代码诊断工具的文章中,我们看到了如何在CI服务器上启用Apple的代码诊断工具,例如TravisCI或使用xcodebuild命令行工具的任何其他第三方CI服务器。 在这篇简短的文章中,我们如何使用Apple自己的Continuous Integration服务器(也称为Xcode Server)启用这些工具。 回顾一下代码诊断工具,Xcode具有四种不同类型的运行时工具,也称为代码诊断工具来查找问题。 这些工具是 地址消毒剂 Address Sanitizer(又名ASan)报告了与内存相关的问题,例如内存损坏和其他与内存相关的安全漏洞问题。 您可以在此处阅读有关Address Sanitizer的更多信息。 线程消毒剂 Thread Sanitizer aka TSan可检测数据争用问题。 它还检测其他与线程相关的问题,例如线程泄漏。 在Apple的官方文档中有关于Thread Sanitizer的详细文档。 主线程检查器 主线程检查器是随Xcode 9一起推出的新工具,该工具可检测到Apple框架(如UIKit,AppKit等)的无效使用,这些框架本应在主线程中使用,但意外地在后台线程中使用。 未定义的行为消毒剂 未定义行为Sanitizer aka UBSan在运行时检测代码中未定义的行为。 这些行为包括除以零,从未对齐的指针加载内存或取消引用空指针。 您可以在此处阅读有关UBSan的更多信息。 Apple在代码诊断的官方文档页面上提供了所有这些工具的简要文档。 我们可以通过“编辑方案”->“运行/测试”->“诊断”从Xcode方案设置中启用所有这些工具 您可以看到所有这些工具都可以通过使用复选框来激活。 需要注意的一件事是,您不能同时启用线程清理程序和地址清理程序。 从Xcode 9开始,Xcode Server内置了Xcode应用程序,因此无需获取macOS服务器即可启动Xcode Server。 我们可以直接从Xcode启动服务器并开始创建Bot。 在Xcode 9中,创建Bot时,我们有一个名为Arguments的选项卡,并且在arguments中,我们可以找到该部分以添加其他参数Arguments传递给xcodebuild 我们可以使用该部分来启用代码诊断工具。 我们可以传递不同的参数来启用地址清除器,线程清除器或未定义的行为清除器。 […]

使用Fastlane从疯狂中拯救您的手机

当您开始编写iOS应用程序时,通常会专注于构建和交付该应用程序。 这意味着要编写代码,也许要进行一些单元测试以确保您的逻辑能够按预期工作,并需要一个或两个脚本来在持续集成系统中构建和运行您的应用程序。 然后,如果碰巧,您的应用程序将受到青睐,您将获得很多客户。 很多很多很多客户。 也许像我们一样,您的客户将需要您的应用以自己的艺术品品牌化。 因此,您编写了一个小的Bash脚本,可以在需要时将其替换为您的图稿。 然后,您的某些客户需要其他客户不想要的特殊一次性功能。 这些客户对您的公司至关重要,因此您可以编写功能并通过特殊的属性文件与另一个启用或禁用该功能的小型Bash脚本组合来对其进行管理。 一段时间后,您的客户群将增长,您的团队将像我们一样增长,并且小型Bash脚本的规模和复杂性将会增长。 很快,其他团队成员将无法理解所有内容如何融合在一起,一个小的更改可能以意想不到的方式破坏其他内容,并且每当需要在构建中进行某些更改时,每个人都会畏缩。 使用Bash构建的复杂构建系统就是这种痛苦。 在Appian,我们的构建系统陷入了这种悲惨的境地。 在几次事件要求我们争先恐慌地修复构建系统更改以重新启用我们无意间破坏的功能之后,我们对系统的信心一直处于低位,压力水平超出了预期。 退后一步,我决定必须做些事情。 我们的构建系统需要修复。 我在团队中提出来,我们考虑使用Python,Swift或Ruby构建我们自己的系统,以便获得高级语言的好处。 我们决定不这样做,因为我们不想重新发明轮子,这将花费很长时间。 那就是我们开始寻找更好的东西的时候。 值得庆幸的是,我的一位同事找到了快车道。 我马上就知道快车道很特别。 它为安装不同版本的Xcode提供了支持; 它承诺会自动上传到TestFlight; 它使自动化测试的输出看起来如此简洁明了。 它是用高级语言Ruby编写的,它使我们能够构建模块化,可理解且可测试的构建系统。 我使用Appian的IndieTime(类似于Google的20%的时间)将整个构建系统转换为使用fastlane,结果是纯粹的欢乐 。 现在,我们可以依靠为所有不同的构建选项获得正确的结果。 我们的开发人员发现,它更易于理解和更改构建系统,而复杂的项目更改则更容易实现。 使用新系统,我们获得了很多好处。 这三个最突出: 1.使用RSpec的自测试构建系统 当我们在构建系统中使用Bash脚本时,很难确保仍正确构建所有配置。 当我们添加新功能或修改系统时,很容易犯一个错误并引入一个错误,该错误有时几个月都不会出现,直到我们需要向客户提供其自定义版本为止。 当确实出现此类错误时,可能需要很长时间才能确定根本原因,然后正确解决。 有了基于Ruby的fastlane工具集和RSpec,我就能够对整个系统进行单元测试。 现在,每当我们添加涉及对构建系统进行更改的新功能时,我们都会添加单元测试。 我们的持续集成系统运行160多个测试,以确保我们正确构建不同的iOS配置。 2.使用快速通道的简化逻辑 使用Bash,为了不破坏我们现有的构建脚本并节省时间,开发人员将复制Bash脚本并调整副本。 我们的iOS代码库最终以许多几乎相同的脚本以及晦涩,纠结和难以理解的代码为结尾。 过渡到Fastlane时,我们的一位开发人员建议将每个构建都视为自定义构建。 因此,现在,每个构建都遵循相同的自定义路径: 我们的App Store应用, 我们内部的应用程序 我们的HockeyApp 和为我们的客户定制品牌的应用程序。 这样,我们可以确保我们所有的构建工作正常进行,或者我们可以很快发现是否损坏了某些东西。 例如,这对我们有何帮助:Apple刚刚添加了一项新要求,即我们需要将iTunes图稿与应用程序捆绑在一起。 为了进行更改,我们仅添加了6行以支持所有不同的版本: 我们的产品经理无法相信为我们提供的所有构建配置支持此功能多么容易 。 3.使用Xcodeproj进行简单但复杂的项目操作 通过对自定义属性(也称为功能切换)进行运行时检查,可以轻松管理客户在应用程序中所需的一些独特功能,而其他功能则需要对项目进行更基本的更改。 有时,这些更改与我们其他客户的需求不兼容。 […]

在Pinterest上开发快速可靠的iOS版本(第一部分)

Rahul Malik | iOS平台技术主管 在Pinterest,我们专注于帮助人们发现启发性的想法,从晚餐食谱到尝试,从家庭和时尚产品到购买,再到旅行的地方。 构建最佳的移动产品是其中的关键部分,所有Pinner的80%通过移动应用访问Pinterest。 特别是在iOS团队中,我们一直在不断努力,以尽可能高效和迅速地改善这种体验,而为我们的团队提供最佳的开发和测试环境是其中的关键一步。 最近,我们研究了简化该过程的方法,并着手提高基于本地和持续集成环境的iOS构建的速度和可靠性。 此外,我们开始将应用程序模块化为独立的框架,并需要一个系统来支持该迁移。 我们回顾了多种工具,包括Xcode,Cocoapods,Buck和Bazel。 我们希望为未来引入更稳定的基础,这对于我们快速迭代并向Pinners发布新功能的能力至关重要。 通过比较Xcode,Cocoapods,Buck和Bazel,我们发现Bazel最适合我们的目标,即为性能提高一个数量级,消除构建环境中的可变性并逐步采用该基础。 因此,我们现在使用Bazel交付我们所有的iOS版本,这些版本已经取得了成功,其中包括: 当地发展 更快的构建:将干净的构建时间从4m 38s减少到3m 38s,提高了21%。 本地磁盘缓存允许即时重建您之前构建的任何内容(其他分支,提交等)。 CI和本地环境之间的环境相同,因此生成问题很容易重现。 自动化程度更高:代码生成等任务已包含在构建图中。 持续集成 每个构建都是增量构建:由于Bazel具有可复制性,因此一年多来我们一直没有在CI上执行任何全新构建。 一次构建,可在任何地方重复使用:引入远程构建缓存后,由于我们不需要重新构建任何机器上已构建的任何内容,因此构建时间减少了不到一分钟且低至30秒 缩短着陆时间:将构建时间从10m 24s减少到7m 34s,提高了27%。 缩短更改Beta测试人员的时间:Beta的构建时间从1400万32秒减少到700万52秒,提高了45%。 更快的测试执行:如果修改后的代码不影响测试,则测试运行是即时的。 更高的构建成功率:使用Bazel运行构建任务时,构建成功率从大约80%提高到97%-100%。 迈向快速可靠构建的未来 由于我们使用的是编译语言(Objective-C / C ++),因此构建速度一直是开发人员的瓶颈。 但是构建速度很难量化。 它包括在不同环境中的构建,例如持续集成或本地开发。 我们还处理各种工作流程方案,例如全新构建,增量构建,分支切换,变基,还原更改等。 您无法改善无法衡量的内容,因此,提高构建速度需要跟踪各种方案,以使我们能够准确地确定回归并集中精力进行性能工作。 我们可以通过减少工作量或提高工作效率来加快构建速度。 这可能涉及使用不同的工具,改善并行化或更新项目的体系结构以需要更少的源文件。 围绕维护模块化体系结构以及清除未引用的代码或与已完成的实验相关的无效代码,采取有力的实践将有助于维护/提高构建速度。 我们使用各种内部工具和脚本来识别无效代码。 对于实验,我们利用自动化功能添加了clang批注以弃用与实验相关的方法和常量,从而允许编译器警告开发人员实验已结束且应删除代码。 开发人员通过定期运行工具来检查未引用的代码,即定期运行工具来检查标头包含我们构建的图形,并递归查找零引用的文件。 我们的构建过程必须既快速又可靠。 如果构建是可复制的,则它们是可靠的。 可重现的构建不仅对于重现错误很重要,而且对于确保我们提供经过开发和测试的应用程序的确切版本也很重要。 只有构建环境(输入和输出)一致,我们才能实现这一目标。 环境的变化会极大地影响最终产品并引入可变性。 一致的环境可确保应用程序的行为相同,而不管它是在开发人员的计算机上构建还是通过持续集成构建而成,并且消除了花时间弄清楚构建为何在一个环境中成功而在其他环境中失败的时间。 尽管这些想法和探索都围绕iOS进行,但快速且可复制的构建目标是我们所有人共同的目标,并将使我们能够扩展客户端工程。 挑战性 专注于改善构建过程的决定植根于它对开发人员生产力的影响。 随着我们团队和产品的增长,投资于开发人员使用一致且快速的构建系统的能力至关重要。 规模:随着我们扩展客户工程的规模,花费在支持开发人员,维护或减少构建时间以及提高可靠性规模上的时间也有所增加。 […]

Bitrise上的Pivotal iOS自动配置步骤更新

自从第一个版本的iOS Auto Provision在Bitrise上推出以来,我们收到了很多反馈; 谢谢,你们都! 今天,我们发布了一个具有大量更新的新版本,其中进行了两个强制性更改(请参见6.)。 较旧版本的codesigndoc可能也已收集了较旧版本或已撤销的Codesign标识,并且在这些情况下,该步骤记录了已提供多个开发/发行证书。 从此版本开始,该步骤将处理具有相同公共名称的最新版本的证书,并且还将能够处理多个开发/发行身份。 该步骤的先前版本为项目中定义的Developer Portal应用程序设置了每个服务,无论是否已设置服务。 例如,启用推送通知功能会在每次运行iOS Auto Provision步骤时再次吊销推送证书。 从此版本开始,该步骤将检查所需的服务是否已启用。 使用Scheme输入( 必填 ),您可以限制哪些目标,使用Configuration输入,可以定义要处理的构建配置。 通过使用这些新输入,您可以确切指定要自动配置哪些属性的目标。 以前,您可能会遇到以下错误消息:在某些情况下, Multiple profiles found with the name … 。 从现在开始,如果出现此类问题,该步骤将在5秒内重试配置文件管理功能,这很可能会消除该问题。 此版本将打印更多描述性的错误消息以及可能的解决方案。 现在处理来自Apple Developer Portal的响应,结果显示了用户友好的错误消息。 distributon_type输入已重命名为: distribution_type –不幸的是,输入的键包含拼写错误。 如果您更新步骤(或使用最新版本),请检查此输入的值,因为更新将删除先前版本的值 。 新的所需输入连接到: scheme (请参阅上面的第3条) 我们希望这些更新会派上用场,让我们知道您的想法! 🙂 建设愉快! 🏢 最初发布在 Bitrise博客上 。

Xcode Server + Slack =适用于iOS CI / CD的Rockstar Combo

原始文章:原始文章已发布在我的个人博客XCBlog上,继续阅读 此处 以获得更好的图形。 要阅读有关iOS DevOps和iOS CI / CD的更多有趣文章,请 在此处 访问我的博客 。 Xcode Server是Apple提供的持续集成服务,用于分析,构建,测试和存档iOS应用。 Xcode Server最近内置了Xcode 9,只需单击几下鼠标,即可进行iOS应用程序的持续集成和持续交付。 在撰写本文时,Apple仍未使用Xcode 9更新Xcode Server aka XCS的文档,但在我之前的文章中,我已经解释了如何为iOS应用设置Xcode Server with Xcode 9。 许多XCS用户抱怨Xcode Server缺乏第三方集成,但我认为并非如此。 XCS提供了编写集成前和集成后脚本以与任何可能的第三方服务集成的功能。 我们只需要了解Xcode Server和第三方服务提供的API。 在这篇文章中,我们将看到如何将Xcode Server与非常流行的通信服务Slack集成在一起。 Slack已成为大多数公司中最受欢迎的协作工具之一。 几乎每个人都喜欢Slack,因为它的光滑和令人敬畏的功能。 除非是Slack的竞争对手,否则几乎没有任何组织不会看到Slack。 Slack被用作组织内部进行协作工作的沟通渠道。 Slack具有一些令人赞叹的功能,例如工作空间,频道,机器人,webhooks等。 松弛通知可用于为开发活动提供反馈,例如静态分析,代码问题,测试报告和部署。 大多数持续集成服务器都在添加Slack集成,以提供有关部署管道的更新。 在iOS的世界中,我们可以使用Fastlane Slack操作来报告iOS开发活动的状态。 Xcode Server由Apple开发,因此除非进行业务级别的交流,否则不会提供任何内置支持,但是我们可以使用Slack API和Xcode Server后集成脚本的组合轻松地将其与Slack集成。 要将Slack与Xcode Server集成的第一步是了解我们可以在脚本中使用的Xcode Server环境变量。 列出了可用于Xcode Server的环境变量,但我们将看到Slack集成所需的一些有用变量。 XCS_BOT_NAME:可以在脚本中的任何位置使用它来获取当前的Xcode Bot名称。 XCS_INTEGRATION_RESULT:提供集成结果。 XCS_PRIMARY_REPO_DIR:这提供了集成的源代码,我们可以从中提取Git最后的提交或作者等信息。 XCS_PRIMARY_REPO_BRANCH:提供当前集成的分支名称。 […]

托管持续交付的iOS应用程序的ipa和dSYM文件

通过持续交付,可以在产品所有者准备就绪并获得批准后立即频繁发布新功能。 连续交付管道应该能够分析,构建,测试,存档并将iOS应用程序部署到iTunes Connect。 在上一篇文章中,我们已经看到了如何使用Fastlane工具设置基本管道。 作为存档步骤的一部分,部署到iTunes Connect的每个iOS版本都会创建一个.ipa文件,而dSYM文件是一个“调试符号文件 ”。 这些是在构建过程中生成的非常重要的构建工件,可用于返回到iOS应用的早期版本。 将这些IPA文件托管在某个位置非常有用,这样我们就可以轻松访问iOS应用的早期版本。 在本文中,我们将看到将IPA文件托管到GitHub或类似托管服务器的自动化方法。 您可能想知道为什么我们需要在服务器上托管已发布应用程序的IPA文件。 在某些情况下,方便使用IPA文件 如果需要,轻松安装以前版本的iOS应用 由于源代码的构建可能会因Swift版本或其他依赖项的更改而失败,并且在过去发布应用程序时开发人员可能没有相同的环境。 IPA文件是通用二进制文件,因此可以部署到iPhone和iPad。 对于Xcode Server,Jenkins,TeamCity等自托管CI服务器,Continuous Integration服务器是托管IPA文件的最佳位置,但是对于TravisCI和CircleCI等云托管CI服务器,我们需要在其他地方托管IPA文件。 这是因为基于云的CI服务器会为每个构建启动新的VM,并且在构建完成后会销毁VM。 除非将其上传到其他服务,否则我们可能会丢失IPA和其他构建构件。 有几种选择,我们可以托管我们的构建工件,例如测试报告,IPA文件dSYMS等。 用于自托管解决方案的Continuous Integration Server AWS S3存储桶或类似第三方服务(例如Artifactory) 的GitHub 公司内部服务器 有自托管CI服务器(如Apple的Xcode Server),其他开源CI服务器(如Jenkins,TeamCity等)。自托管CI服务器的好处是我们无需找到其他任何地方来托管构建工件。 除非我们删除它,否则它在CI服务器上已经可用。 有时,在这种情况下,我们需要清理CI服务器,我们需要将发布版本的构建工件移到同一服务器上的任何其他位置。 在这两种情况下,我们都可以访问IPA文件和dSYMS。 带有Xcode 9的最新版本的Xcode Server具有一项新功能,它将创建和IPA文件,这些文件可以从Xcode Bot中看到。 我在之前的博客文章“ Xcode Server + Xcode 9 =全面的iOS CI”中分享了Xcode Server的新功能。 使用Xcode Server,可以轻松地访问发布漫游器的IPA文件。 同样,我们可以将它们放在Jenkins或其他CI服务器上。 如前所述,从基于可能的CI服务器访问构建工件将具有挑战性,因为已经为每个构建启动了新VM,并在构建结束时将其销毁。 我们必须使用脚本将生成的构建工件上载到其他一些服务,例如AWS或类似服务。 我们可以使用Fastlane set_github_release操作轻松地将资源上传到GitHub。 我们可以结合一些Fastlane动作来实现此目的: $ […]

Xcode Server:iOS空中下载(OTA)安装技巧

原始文章:原始文章已发布在我的个人博客XCBlog上,继续阅读 此处 以获得更好的图形。 要阅读有关iOS DevOps和iOS CI / CD的更多有趣文章,请 在此处 访问我的博客 。 别害怕,没有fu * king广告! 自从Apple发布带有内置Xcode Server的Xcode 9以来,为iOS项目设置“持续集成”的过程就变得非常简单。 在我以前关于Xcode Server的帖子中,我解释了使用Xcode 9和Xcode Server为iOS应用设置CI的详细过程。 为了了解代码签名,您应该观看WWDC 2017会话,有关Xcode和Xcode Server的签名新增功能。 Xcode Server具有一个选项,可以作为bot配置的一部分来生产可安装的产品 ,这意味着Xcode Server创建了一个存档版本和IPA以进行集成,可以在网络中的iOS设备中下载该版本。 在本文中,我们将介绍从Xcode Server在iOS设备上安装内部版本时的常见错误以及针对这些错误的解决方案。 常见错误 由于Apple尚未完成使用Xcode 9编写Xcode Server的文档(在撰写本文时),因此,如果我们不关注其他设备,则在iOS设备上获取已安装的版本有时会比较棘手且耗时。在Stack Overflow或Apple Developers论坛上的经验。 有一些技巧可用于轻松获得iOS设备上的构建。 大多数iOS团队成员的常见错误如下。 使用IP地址访问无法下载内部版本的Xcode服务器 缺少访问控制 忘记启用Xcode服务器证书 使用域名访问Xcode服务器 Bot安装过程中错误的代码签名选项 Bot安装过程中错误的存档选项 这是iOS团队成员在使用Xcode Server进行OTA安装时犯下的五个常见错误。 现在,我们将看到一些针对这些常见问题的快速解决方案。 Xcode服务器提示 为了避免上述常见错误,我们可以遵循一些提示和技巧。 在使用多台Mac Mini服务器设置Xcode Server时,我已经面对了所有这些问题。 希望这对其他人也有用。 使用规范主机名 作为普通用户,使用IP地址访问网络中的任何计算机都是很常见的。 […]

Continuous Integration Server上的代码签名iOS应用扩展

添加应用扩展程序是在用户需要的地方放置应用程序功能的绝佳方法。 自Apple推出应用程序扩展名以来,将其扩展到iOS应用程序中已变得非常普遍,例如iMessages扩展名非常常见。 在开发iOS应用程序时,扩展程序必须是iOS应用程序中的单独目标,并且在将应用程序分发到应用商店时,我们必须与主应用程序一起对其进行代码签名。 Xcode具有自动对应用程序进行代码签名的新功能。 Xcode会处理所有事情,包括为所有目标下载正确的配置文件并在归档iOS应用时对它们进行代码签名,但是这种方法不适用于持续集成环境(即CI服务器)。 在CI服务器上,我们必须编写所有这些代码签名任务的脚本。 在为带有扩展名的应用程序设置连续交付时,用脚本手动编码所有扩展名的应用程序具有挑战性,但是Fastlane工具非常容易对应用程序扩展名进行代码签名。 在本文中,我们将看到如何使用Fastlane工具在CI服务器上编写符号应用扩展的代码。 应用程式额外资讯 在对带有扩展名的应用进行代码签名时,我们应该考虑以下几点。 应用程序扩展是iOS应用程序中的单独目标 应用扩展程序具有单独的捆绑包标识符和配置文件 应用扩展程序与主应用程序一起构建。 这意味着,我们必须为每个捆绑包标识符下载预配置文件,并使用脚本将下载的预配置文件应用于每个目标。 在这种情况下,让我们考虑具有包标识符com.xyz.main的主应用程序具有带有包标识符com.xyz.main.iMessage的 iMessages扩展名,以与应用程序一起进行代码签名。 叹气下载配置文件 我们必须为每个应用程序标识符下载配置文件,在我们的情况下将是两个捆绑包标识符。 Fastlane具有叹气工具,可以从Apple开发人员门户下载配置文件。 我们还可以保存配置文件,其含义是文件名,但这是可选的。 示例代码如下所示。 叹( app_identifier:“ com.xyz.main”, 文件名:“ com_xyz_main.mobileprovision”, skip_certificate_verification:正确 ) 叹( app_identifier:“ com.xyz.main.iMessage”, 文件名:“ com_xyz_main_iMessage.mobileprovision”, skip_certificate_verification:是 ) 请注意,Sigh会将配置文件下载到当前工作目录中。 成功下载预配置文件后,我们应该在项目的根目录下载两个文件com_xyz_main.mobileprovision和com_xyz_main_iMessage.mobileprovision 。 更新每个目标的配置 现在,我们已经为iOS应用程序和扩展下载了相关的配置文件。 现在是将它们应用于特定目标的时候了。 在此阶段,我们可以采取两种方法。 通过将供应配置文件设置为与我们将在CI服务器上下载的名称相同的名称,在.xcodeproj文件中应用手动代码签名 。 我们可以在源代码管理中检入该文件,以便CI服务器将查找这些文件。 这将是非常简单的方法,因为我们不需要在CI服务器上修改Xcode项目文件。 在.xcodeproj中应用自动代码签名 ,并通过使用脚本更新Xcode项目文件将其更改为手动代码 。 最好在开发人员的本地计算机上保持自动签名并在构建时更改CI上的文件,但是这需要对构建设置有深刻的了解,并需要使用脚本以编程方式更新Xcode项目 您的团队将根据技能集决定哪种方法适合他们。 两者都有其优点和缺点。 开发人员更喜欢在本地计算机上进行自动代码签名 ,因为过去在Xcode 8之前,他们可能曾经历过整理证书和置备配置文件的痛苦。为了CI失去它。 […]