Tag: DevOps

Jenkins + iOS构建

不久前,我需要为iOS项目设置构建管道。 这是一个经典的故事,开发团队解散了,公司需要一些外部软件帮助。 长话短说,这成为我修补iOS构建自动化的借口。 编译良好且有文档证明的开源项目是一回事,编译没有文档且无人问津的iOS项目,至少让我非常兴奋。 该项目是为iPad设计的,我认为我需要一个实际的项目来开发。 事实证明,为Apple设备开发软件仅需要Apple计算机。 不需要手机或平板电脑。 一切都可以通过模拟器来完成。 下一个困难的部分是弄清构建配置和库依赖关系。 这是我第一次听到cocoapods,事实证明它很整洁。 就像NPM用于节点,pip用于python,Cocoapods用于快速/目标C项目。 我不能在这里分享代码,但是可以分享我学到的课程。 资质认证 对于新开发者来说,这可能是最令人困惑的事情,但是实际上,这并不太疯狂。 所有这些都是关于知道谁编写了代码以及谁在分发应用程序。 证书 -每个开发人员都应在developer.apple.com上获得一个帐户,并生成自己的开发证书。 这用于签名代码。 您稍后将使用您的用户名和密码来获取证书。 证书的私钥仅在证书创建期间可用。 那些.p12私钥需要导入Mac的钥匙串中才能对代码进行签名。 标识符 -只是某种Java类,例如命名约定ID即可识别应用程序。 设备 -允许将设备注册到公司帐户,并且配置文件可以指定允许安装该应用程序的设备。 供应配置文件 -证书+应用程序ID +设备的组合。 它用于对应用程序进行签名。 编译中 安装Xcode和CLI工具。 安装分发证书和该证书的私钥。 Fastlane是人们多年来构建的实用程序的组合,可帮助实现iOS项目构建的自动化。 Jenkins Side自动化 对于Jenkins服务器端,在Jenkins管理内创建一个slave node 。 您可以: 在Mac上创建SSH帐户,让skin进入ssh。 要么 使用webstart方法,从Mac上从Jenkins的master下载slave.jar并手动启动。 可以为slave.jar创建自动启动。 在工作中,使用jenkin的插件将文件从jenkin的文件系统复制到Mac从节点。 为了执行构建, #!/ bin / bash -l export LANG =“ zh_CN.UTF-8” #秘密文件本地存储在构建服务器上 […]

在AWS上部署服务器端Swift

开发完应用程序后,下一步就是将其提供给您的受众群体使用……因此,自然的愿望是将其部署到服务器上。 尽管可以将Swift应用程序部署到任何Ubuntu 16服务器,但在本文中,我将重点介绍如何使用Perfect Assistant部署到AWS实例。 如果要遵循,则需要满足三个先决条件:Perfect Assistant应用程序,Mac上可运行的Docker应用程序以及一个AWS账户。 AWS设置 从AWS收集的一些信息: 存取金钥ID和机密 公钥/私钥对 安全小组 访问密钥和秘密 创建新的访问密钥和机密的步骤: 访问https://console.aws.amazon.com/iam/ 从侧面导航中选择“用户” 如果您没有IAM用户,请创建一个,确保添加“程序访问”复选框,然后单击“直接附加现有策略”,然后选择“ AmazonAPIGatewayInvokeFullAccess和AmazonEC2FullAccess”属性。 这将创建一个具有密钥和机密的新用户帐户。 记下它们! 如果您已经拥有IAM用户帐户,请选择所需用户的名称,然后选择“安全凭据”选项卡。 单击“创建访问密钥”按钮,并记录密钥的ID和秘密。 公钥/私钥对 接下来,我们要创建一个新的公钥/私钥对。 转到“ EC2”部分,在导航中单击“密钥对”,然后单击“创建密钥对”按钮。 确保下载后! 将下载的文件(以“ .pem”结尾)放入“〜/ .ssh /”。 这使使用SSH连接到远程系统的应用程序(例如助手)可以访问它。 安全组 接下来,单击导航中的“安全组”,然后单击“创建安全组”。 给您的新组一个简短的名称和描述,然后选择“入站”选项卡,单击“添加规则”。 对于本演示,我建议您添加端口8181并在源下拉列表中选择“ Anywhere”,并确保您从当前IP地址添加SSH访问。 配置完美助手 单击“确定”,返回至Perfect Assistant,在“欢迎”屏幕上,单击EC2框中的“配置EC2凭据”按钮。 这将打开一个新窗口,您可以在其中添加新的凭据。 单击“创建”,为您的新凭证设置命名,然后输入我们从AWS获得的访问密钥和机密。 “区域”应该是您设置的在地理位置上接近您或大多数受众的地方。 按“保存”将锁定配置。 设置演示应用程序以进行部署 接下来,让我们从GitHub上获取“ Perfect App Template”。 仍在“欢迎”屏幕中,单击“创建新项目”,“自定义存储库URL”。 单击位置旁边的“浏览”,然后为模板找到URL,然后粘贴模板的URL:“ https://github.com/PerfectlySoft/PerfectAppTemplate.git” 保留“将Linux构建与Xcode项目集成”的复选框,因为我们在此阶段的目标是Linux部署。 单击“保存”后,系统将启动它是macOS端项目的初始克隆。 进行Linux构建非常简单,只需单击“ BUILD:Linux”按钮。 […]

WWDC 2018 NativeDeveloper和DevOps Tools的愿望清单

最初在XCBlog上发布在 这里 苹果公司的全球开发者大会(WWDC 2018)将于下周的2018年6月4日拉开帷幕。令人遗憾的是,我们无法访问苹果的路线图,因此看到他们向我们展示的内容总是很令人兴奋。在WWDC中,除了一些开源项目(如Swift,程序包管理器和Swift NIO)外,Apple Github存储库中也提供了这些项目。 在这个WWDC中将要进行的演讲/会话也有悬念,在会议开始之前,我们无法看到演讲的标题。 当开发人员在Apple平台上工作时,每个人都希望有一些不错的东西,以便使我们的生活变得轻松。 几乎每个人的愿望清单上都有苹果工程师希望得到的东西。 MacRumors,Macworld,AppleInsider,PC Magazine等发布了有关主要软件或硬件的愿望清单,您可以在此处找到大量收藏,但是,在这篇文章中,我将有自己的愿望清单,以介绍我​​在Continuous领域一直想要的改进集成,持续交付,测试自动化,DevOps和Apple Developer工具。 这与Swift,XCTest,XCUITest,Xcode Server,BuddyBuild,Swift Package Manager等有关。 CI / CD:Xcode服务器+ BuddyBuild 苹果公司推出了自己的称为Xcode Server的持续集成解决方案,以便开发人员可以从Xcode创建机器人,然后在macOS服务器上运行。 在其他CI服务(例如Jenkins,TeamCity,TravisCI,CircleCI)上使用Xcode Server的优缺点。 我写了详细的利弊文章,您可以在这里阅读。 但是,Xcode服务器存在一些局限性,即不能将其用于更大的团队和测试请求请求。 您可以在我之前的博客文章中了解有关Xcode服务器的十大限制的更多信息。 好消息是,苹果现在购买了基于云的CI服务BuddyBuild。 这可能解决了大多数iOS开发难题。 希望苹果不会因为BuddyBuild而杀死Xcode Server。 我的愿望清单中的一些内容来自Xcode Server和BuddyBuild一起工作的团队。 1.不要杀死Xcode服务器 由于苹果购买了新供应商来处理与CI / CD相关的任务。 苹果有可能完全停止对Xcode Server的支持,并要求用户使用BuddyBuild的解决方案。 那将是一场噩梦,公司已经投入了金钱和时间来安装Xcode Server,而切换到其他解决方案将浪费时间和金钱。 仍然可以结合使用Xcode Server和BuddyBuild的功能。 假设Xcode Server用于自托管,而BuddyBuild用于基于云的CI解决方案。 2.对自托管Xcode服务器的请求请求支持 这是大多数开发人员或公司拒绝Xcode Server的唯一原因,因为它不支持测试请求请求。 Xcode现在已经与Github紧密集成,这可以在今年的WWDC中期待 3.从Xcode服务器自动上传到TestFlight 去年在WWDC 2017上,Apple通过许多新功能增强了Xcode Server。 您可以在此处阅读更多新功能,或在Safari上观看WWDC的Safari,这些功能增加了许多功能,使iOS应用程序的持续交付变得轻松。 但是,它错过了将生成的.ipa文件上传到iTunes […]

Fast将Fastlane与多个目标集成到一个iOS项目中🚀

现在,让我向您展示由3个不同目标组成的项目结构,以便我们可以通过快速通道进行相应的构建。 因此,Fastfile是一个定义所有“通道”的红宝石文件。 车道是您希望Fastlane运行的一组指令。 因此,我希望大家使用Atom IDE作为文本编辑器来完成与快速通道相关的操作,该操作快速且具有更智能的上下文感知自动完成功能,代码导航功能(如大纲视图),定义并查找所有引用,我们还可以悬停显示信息,诊断(错误和警告)和文档格式。 因此,现在在fastfile中创建通道之前,我们将为项目中定义的3个目标创建3个环境变量文件,这将帮助我们通过fastfile部署特定的目标app / ipa。 您可以使用Atom编辑器创建此空文件,并确保文件名应类似于此语法-“ .env。” 在环境变量中,我们将定义以下内容: SCHEME — —应用程序使用的确切方案或目标名称 BUNDLE IDENTIFIER — —特定目标或方案的标识符 PROVISION PROFLE NAME —提供配置文件的名称保存在本地Mac中,因此,在存档应用程序时,fastlane会尝试通过该名称查找配置文件。 名称将与Apple开发者帐户条款部分中显示的名称相同。 注意:-要查找存储在系统中的配置文件,路径应为:〜/ Library / MobileDevice / Provisioning Profiles。 默认情况下,〜/ Library文件夹在finder中是隐藏的,因此您必须取消隐藏它或使用Finder菜单中的Go-> Go to folder …输入路径,或使用Terminal并执行命令。 APP NAME — —项目中使用的目标/方案的名称。 因此,现在我们将在.env.App1文件中添加以下内容 SCHEME =“ App1” BUNDLE_IDENTIFIER =“ com.SandeepM.app1” PROVISION_NAME_DEV =“ Develop_App1” PROVISION_NAME_ADHOC =“ Adhoc_App1” PROVISION_NAME_APPSTORE =“ […]

使用Swift的iOS项目中的持续集成环境变量

在今天的文章中,我们将讨论一个非常常见的问题,我们iOS开发人员有时必须在我们的开发工作流程中处理这个问题。 问题是如何存储应用程序生产API密钥,以存储我们使用的服务,开发,测试或生产服务器URL以及其他可能过于敏感而无法通过代码添加到我们的存储库中的数据。 以及如何分隔持续集成管道以使用不同的API密钥,访问密钥,服务API地址或任何敏感数据进行生产,测试或开发构建。 有任何方法可以解决该问题。 包括在这篇名为Xcode中的Secret变量和CI的惊人文章中描述的内容,以获取乐趣和收益 由出色的Flawless App团队所带来的灵感之一,实际上是这个项目的灵感之一。这个小项目叫做Swift Variable Injector 。 另外,当我进行研究时,有人问我相同的问题的另一个思路是这样做的。 我们将在下面显示的示例方法与[1]中描述的方法非常相似,该方法使用Sourcery和代码生成基于环境变量值创建快速文件,并将其插入到Continuous Integration流水线中的项目中。 现在,我们将演示一个示例,说明如何使用Swift变量注入器执行文字值替换,将环境变量值注入到Continuous Integration Pipeline中的Swift代码中。 所以…… 开始吧 首先,创建我们的项目,让我们定义用于处理环境变量和Continuous Integrations值的类。 注意 :这些Xcode环境变量参数在启动时而不是在编译时传递给Process(App)。 这意味着您将使用这些参数启动该过程,仅当使用Xcode运行该项目时,您才具有这些值。 通常仅对开发有用。 如果您希望能够在不使用Xcode的情况下启动已部署的版本,则可以将CI类从var模式替换为键值。 但是重要的是,在提交和推送它时,不要让它静态定义。 :)) CI.swift类声明在连续积分的变量注入器步骤中要替换的变量。 注意:重要的是文字值与格式$(ENV_VAR_NAME)匹配。 在持续集成方面,我们必须定义一个环境变量,并在每个工作流程(生产,测试等)中为其指定值。 我将使用Bitrise服务在此处演示步骤。 但是,大多数CI服务都提供了所需的所有功能。 在这里,我们基本上为每个工作流程定义环境变量。 因此,例如,如果我们有一个生产工作流程和一个Beta测试工作流程,则可以在两者上定义键,但要使用不同的值。 在为每个工作流程定义变量或秘密之后。 现在,我们可以在构建步骤之前添加变量注入步骤。 您可以通过两种方式执行此操作: 使用shell脚本 您可以在构建之前定义一个步骤,以运行以下脚本来安装和运行变量注入器: #安装 CURRENT_DIR =“ $ PWD” cd / tmp curl -OL https://github.com/LucianoPAlmeida/variable-injector/releases/download/0.2.1/x86_64-apple-macosx.zip 解压缩x86_64-apple-macosx.zip cp -f ./x86_64-apple-macosx/release/variable-injector / […]

苹果收购BuddyBuild。 哦,我的Xcode服务器!

最初发布于XCBlog。 在这里阅读 我没想到这将是我2018年的第一篇博客文章。在假期里,我读了“ Apple Buys BuddyBuild”的推文,使我大为震惊,我眨了眨眼,再次阅读了这条推文。 我迅速检查了BuddyBuild的Twitter句柄,没有任何鸣叫,在Google上进行了搜索,发现Tech Crunch,CNBC和BuddyBuild博客确认了此消息。 考虑到我在iOS DevOps和CI / CD上所做的工作,对于我来说,这个消息无疑是令人振奋的消息。 我拿起电话并在Twitter上向丹尼斯表示祝贺。 不久之后,我亲自认识了BuddyBuild团队,并把一包T恤交付给我,以参加我在iOS CI Olympics 2017上的工作。 2017年10月的聚会。 我在运行iOS CI Olympics 2017时与BuddyBuild联系。我对iOS持续集成和持续交付充满热情,我用20种不同的标准对基于云的iOS 5前5名服务进行了Olympics,BuddyBuild成为了赢家。 您可以在此处阅读系列博客文章 介绍性博客文章中提到了iOS CI奥运会的目的和规则。 玩家表现之一:BuddyBuild 玩家表现二:Bitrise 玩家表现三:TravisCI 玩家表现四:Nevercode 玩家表现五:CircleCI iOS CI奥运会获胜者公告 最终的奖牌如下所示: BB = BuddyBuild BR = Bitrise TC = TravisCI NC = NeverCode CC = CircleCI 在评估过程中,我得到了BuddyBuild团队的大力支持,以了解BuddyBuild的关键概念和工作方式。 随着BuddyBuild成为获胜者,他们将奥运会的结果发布在BuddyBuild博客上iOS持续集成与部署比较 BuddyBuild给我寄了一些T恤,我把它们分发给Yoox Net-A-Porter的同事。 尽管我非常喜欢BuddyBuild,但由于我们使用TravisCI,所以我从未尝试将其用于正在处理的项目,并且我已经建立了完全自动化的端到端管道,以使用Fastlane将iOS应用程序直接部署到iTunes Connect。 […]

使用Fastlane和Ansible进行iOS连续部署-第1部分

注意:本文已发布在Moonpig Engineering官方博客上。 在这里阅读 在担任Photobox Group的前一职务时,我参与了为iOS部署设置持续集成服务器并为他们配置Ansible的iOS应用程序DevOps实践。 我们使用带有TeamCity的mac Mini服务器的自托管CI解决方案。 在这两部分的文章中,我们将看到我们如何结合Fastlane和Ansible实现iOS应用程序的持续交付。 持续交付(CD)和DevOps实践加快了向最终用户交付新功能的速度。 iOS应用程序开发的快节奏世界可能会受益于DevOps实践,从而可以快速,轻松地将应用程序发布到生产环境中。 在iOS世界中,发布很困难。 它涉及复杂的步骤,例如代码签名以及处理Apple开发和发行证书。 这可能是一个容易出错且耗时的过程。 通过从Xcode本地构建,测试和存档iOS应用程序来完成手动发布。 然后,已存档的.ipa文件需要上传到iTunes Connect。 理想情况下,我们希望使用持续集成(CI)来自动执行此过程,该过程无需人工干预即可将每次提交或合并推送到Apple Beta测试服务TestFlight的主分支。 在本文中,我们将说明如何使用构建自动化工具Fastlane实现持续部署。 Fastlane提供CD最常见的业务收益,但也为其他工程团队带来收益,包括: 消除针对DevOps的DIY,并专注于构建本地iOS功能。 每次合并后,新版本都会自动上载到iTunes Connect。 自动执行重复的升级或设置新CI服务器计算机的任务。 通过源代码管理所有基础结构。 开发人员计算机和CI服务器具有相同的配置。 挑战性 以前,发布我们的应用是一项使命。 部署是一天的马拉松比赛。 我们遵循了本地计算机上传统的,耗时的手动发布方式。 从Xcode构建,测试,存档和上传iOS应用程序非常耗时。 发布中最痛苦的部分涉及下载与分发证书关联的正确的配置文件。 如果我们在上载到iTunes Connect或在生产中的版本中发现问题,则重复此过程将更加痛苦。 为了简化发布过程,我们必须克服以下挑战: 自动化分析,构建,测试,存档并将iOS应用程序上传到iTunes Connect的过程 设置持续集成服务器以使用自动生成 在需要时自动执行重置CI服务器设置的过程(例如,当Xcode版本更改或任何Apple API更改时) 从代码或称为代码的基础架构驱动iOS CI基础架构 确保iOS开发人员计算机和CI服务器上的软件配置相同。 说不可以在我的机器上使用 我们结合使用Fastlane,TeamCity和Ansible工具解决了这些问题。 这些代码段仅供参考,让我们开始吧。 使用Fastlane构建自动化 诸如xcodebuild之类的Apple命令行开发人员工具是一种强大的方法,可用来编写任何我们想自动化的脚本。 但是,我们正在编写的命令可能非常冗长和繁琐。 Fastlane是Apple命令行工具的包装,使构建自动化更加容易。 有一系列Fastlane工具可用于自动执行各种iOS开发任务,例如,“扫描”用于运行测试,“健身房”用于构建应用程序,“飞行员”用于将应用程序上传到TestFlight。 自动化Swift版本检查 自动构建过程的第一步是确保使用正确的软件版本(例如Swift和Ruby)以干净的状态启动CI构建。 Fastlane提供一个before_all步骤,该步骤在所有其他通道之前运行。 您可以阅读有关高级Fastlane的更多信息,以配置此步骤。 […]

Travis Stages的iOS部署管道

持续集成的过程执行各种活动,例如分析,构建,测试和部署iOS应用。 将每个构建任务分解成各个阶段并独立执行它们是一个好主意。 此过程也称为构建管道或部署管道。 作为iOS开发人员,您可能已经体验到构建iOS应用可能需要很多时间才能进行测试。 管道是处理iOS开发的各个阶段以获得快速反馈的方式。 在花费了数小时的构建和测试阶段之后,我们可能不想因代码样式问题而导致构建失败。 自托管的持续集成服务器(如Jenkins和TeamCity)具有创建构建管道的良好支持,但是基于云的CI服务器(如TravisCI,CircleCI等)也正在推出部署流水线功能。 在这篇文章中,我们将看到如何使用Travis Stages功能设置iOS部署管道。 请注意,我以TravisCI为例,因为我将其用于一些开源项目。 其他可能基于CI的CI服务器也可能具有类似的功能。 iOS部署阶段 在进入TravisCI设置之前,我们将了解部署任何iOS应用的重要阶段是什么。 主要的构建阶段是 分析源代码中的代码样式问题 使用XCTest或其他框架进行测试 构建和存档iOS应用 将iOS应用分发到其他Beta测试服务 将iOS应用上传到iTunes Connect 这些是必须在连续集成服务器上自动化的主要阶段,才能实现自动部署。 特拉维斯舞台 万一TravisCI刚开始使用,它是一个嵌入Github的基于云的持续集成平台,该平台允许为开源以及企业项目运行CI构建。 它具有良好的文档,可帮助您开始进行持续集成。 TravisCI宣布了Travis Stages的新功能,以实现针对开源项目和企业项目的部署管道。 可以通过在.travis.yml文件中添加以下代码示例来启用这些阶段 工作: 包括: -阶段:测试 脚本:./ test 1 -#阶段名称不是必需的,将继续使用`test` 脚本:./ test 2 -阶段:部署 脚本:./ deploy 为了在iOS项目中应用此原理,让我们在GitHub上创建一个开源项目,如下所示(您可以使用任何iOS应用) 在Xcode中创建名为SwiftLint-CI的空白单视图应用, 其中包含单元和UI测试目标 使用CocoaPods添加SwiftLint来检查Swift代码语法。 这可以通过创建Podfile并运行pod install命令来完成。 现在,我们已经为CI配置了一个基本的iOS项目。 现在,我们可以添加支持以在TravisCI上运行构建并启用以下阶段。 使用SwiftLint为Lint Swift代码构建阶段 构建阶段以运行单元测试 构建阶段以运行UI测试 使用阶段创建.travis.yml TravisCI使用macOS虚拟映像来运行构建,所有映像的列表都可以在此处找到。 我们可以选择最新的xcode9图像来运行演示应用程序的构建。 […]

agvtool:自动化iOS内部版本号和版本号

DevOps和持续交付实践可将持续构建部署到我们的内部或Beta测试平台。 必须管理iOS应用的版本和内部版本号。 作为最佳DevOps做法,iOS团队应经常向AppStore发布新版本(即市场营销版本),并且应在向AppStore提交应用程序之前为每个版本进行多次构建。 该发行版可能具有具有不同功能的不同内部版本。 管理iOS应用的内部版本号和版本号非常重要,以确保我们将正确的内部版本发送到AppStore。 在本文中,我们将看到如何使用agvtool命令行实用程序来管理我们的iOS应用的版本和内部版本号。 版本和内部版本号 在开始使用agvtool之前,让我们了解什么是iOS应用程序的版本和内部版本号。 版本号 基本上,版本号是该应用程序的市场编号,它是显示给应用程序用户的编号,用于标识应用程序的发行版本。 它作为CFBundleShortVersionString(捆绑版本字符串,简称)存储在应用程序的Info.plist中。 内部编号 内部版本号标识应用程序的未发布或已发布版本。 它作为CFBundleVersion(捆绑版)存储在应用程序的Info.plist中。 我们可以为特定版本进行多个构建。 agvtool agvtool是一个命令行工具,可让您自动将这些数字递增到下一个最高数字或特定数字。 该工具与Xcode命令行工具一起提供,可以从xcrun实用程序直接访问。 $ xcrun agvtool $ xcrun-查找agvtool 您可以从其文档页面阅读该工具提供的选项 $ man agvtool 这将显示agvtool随附的所有命令。 现在,我们将看到如何在真实的iOS应用程序上使用agvtool。 为了做到这一点,让我们在Xcode中创建一个名为agvtool-Demo的单视图iOS应用。 从命令行开始使用agvtool之前,需要确保以下几点。 启用agvtool和版本控制系统 禁用/启用源代码管理设置 我们将看到如何在Xcode中进行设置 启用agvtool 为了启用agvtool,我们需要确保在目标构建设置中正确设置了“ 当前项目版本”和“ 版本控制系统”属性。 选择目标构建设置,然后搜索“版本”。 现在将“ 当前项目版本 ”设置为1,并将“ 版本控制系统”值选择为“ Apple Generic” 接下来要验证的是确保“ 信息”选项卡具有捆绑软件版本和捆绑软件版本字符串,对于新项目,简短值可能设置为1。 禁用/启用源代码控制(CVS,SVN) 当agvtool更改版本或内部版本号时,它将在Xcode项目内的某些文件中进行更改。 如果使用CVS或SVN,则可以将这些更改提交给源代码管理。 如果您不使用SVN或CVS,则无需担心这些设置。 默认情况下,提交对CVS或SVN的更改为ON,但是,我们可以通过运行以下命令来禁用该设置。 $默认写入agvtool SVNEnabled否 $默认写入agvtool […]

运行iOS版本-第3部分,React Native DevOps指南

TLDR: 为三种构建类型配置一个React Native iOS项目:开发,登台和发布。 自定义构建行为以实现Xcode的可重复性,然后使用Fastlane简化流程。 使用Jenkins自动化Fastlane构建流程。 简介| 设置| 预建| iOS | Android | 詹金斯| CodePush | 测试中 概要 概念— Xcode 构建类型和目的地 按键和配置文件 管理Xcode 构型 方案 构建设置 建立阶段 新建系统 概念— Fastlane 车道 选件 元数据/ App Store 詹金斯 演练 创建登台配置 创建开发,暂存和发布方案 编辑构建选项和阶段 查看签名配置 添加Fastlane车道,选项 添加iOS Fastlane元数据 创建詹金斯职位 测试工作 系统总览 概念— Xcode 构建类型和目的地 苹果肯定喜欢使应用程序开发复杂化。 如本系列的第1部分所述,iOS的命名构建类型比Android多得多。 复杂性的主要驱动因素是供应配置文件。 每个配置文件都会限制可以运行您的应用的合格设备的数量。 发布版本只能在设备上运行,并且必须从beta或prod应用商店中安装。 […]