为iOS Release Train构建增量技术

XCBlog上的原始帖子在 这里

持续交付iOS应用对于保持在竞争市场中的重要性至关重要。 拥有基础架构以在向客户发布功能后立即向客户发布功能的公司赢得了公司之间的竞争,他们必须从本地Xcode的人那里进行手动发布。 在“持续交付”模式下,我们应该不断将iOS内部版本上载到iTunes Connect或TestFlight,以获取发布中涉及的所有技术人员和非技术人员的反馈。 只要我们具有适当的构建和版本控制过程,将构建上传到iTunes Connects不会有任何危害。 在这篇文章中,我们将看到在持续交付管道中自动递增内部版本号的最佳技术。

在进入iOS应用程序的自动内部版本号之前,我们将了解将iOS应用程序提交到App Store时版本号,内部版本号和发行火车的工作方式。 Apple拥有有关每个iOS开发人员都应了解的版本号和内部版本号的出色文档。 版本号和内部版本号的组合唯一标识一个应用程序向应用程序商店提交的内容。

  • 版本号

iOS应用的版本号与以前的版本不同。 我们需要为新的应用发布创建单独的版本号。 它类似于使用语义版本控制在Github上创建发行版。 合法版本号将是1.0,1.1.1等,但是您不能将字母和数字(如abc.123)组合在一起,这将是非法版本号。 版本号无法重复使用,因此您必须预先确定主要版本和次要版本。 新版本号值必须大于以前使用的值,并且随后应递增。 当前版本号的值可以通过CFBundleShortVersionString键在iOS应用程序的Info.plist文件中找到,或者如果是上载的iOS应用程序,我们可以在iTunes Connect中进行检查以找到版本号。 我们可以使用Apple的agvtool命令行工具检查当前版本号

  $ xcrun agvtool what-marketing-version 
  • 内部编号

可以为特定的版本号上载多个版本,但是,为特定的版本号上载的版本号应该是唯一的,并且应该是递增的。 内部版本号的值可以重新用于其他版本号。 使用CFBundleVersion键可在iOS应用程序的Info.plist文件中找到当前内部版本号的值。 我们可以使用Apple的agvtool命令行工具检查当前版本号

  $ xcrun agvtool what-version 
  • 发布火车

针对特定版本的特定版本表单的发布版本提交的构建数量。 在发行版中,内部版本号按递增顺序排列且唯一。 该火车可以使用特定功能进行多个构建,并且如果需要,我们可以将任何构建升级到App Store。 简而言之,发布火车是持续交付的基础。

在发行系列中,很少有用于增加内部版本号的策略。 我们将看到它们中的每一个,并讨论哪一个最适合发布火车。

1. agvtool

苹果有本机命令行工具来处理版本和内部版本号。 我们可以启用agvtool并编写脚本来自动增加特定发行版中的内部版本号。 为了启用agvtool,我们需要确保在目标构建设置中正确设置了“ 当前项目版本”和“ 版本控制系统”属性。 选择目标构建设置,然后搜索“版本”。 现在,将“ 当前项目版本”设置为1,并将“ 版本控制系统”值选择为“ Apple Generic”。 接下来要验证的是确保“ 信息”选项卡具有捆绑软件版本和捆绑软件版本字符串,对于新项目,简短值可能设置为1。

我们可以使用以下命令将内部版本号增加到下一个内部版本号

  $ xcrun agvtool next-version-全部 

当我们从CI服务器执行此操作时,它会更新Info.plist文件,一旦构建成功上传,我们需要将这些文件提交回源控件。 这是该技术的缺点之一。 我们必须经常从CI服务器更新源代码控制。

2. PlistBuddy

我们可以使用PlistBuddy工具实现内部版本号的版本增加,该工具用于动态更新plist文件。 我们可以轻松编写脚本。

  buildNumber = $(/ usr / libexec / PlistBuddy -c“打印CFBundleVersion”“ $ PRODUCT_SETTINGS_PATH”) 
buildNumber = $((($ buildNumber + 1))
/ usr / libexec / PlistBuddy -c“设置:CFBundleVersion $ buildNumber”“ $ PRODUCT_SETTINGS_PATH”

这会将内部版本号加1。 同样,这将更新Info.plist文件,一旦构建成功上传,我们需要将这些文件提交回源控件

2. Fastlane插件

还有其他一些第三方工具,例如Fastlane,它们也可以执行相同的操作。 Fastlane可以同时增加内部版本号和版本号。 可以使用crement_version_number操作来增加版本号,该版本号也具有各种选项。 我们可以使用主要或次要版本,也可以指定版本号。

 递增版本号( 
ump_type:“主要”

crement_build_number操作可用于更新内部版本号值。

  crement_build_number( 
build_number:“ 5”

有很多选项可以管理内部版本号和版本号,但这些操作也可以在后台使用agvtool。 在这种情况下,我们必须使用另一个Fastlane动作来提交版本凹凸,以将新版本从CI服务器提交回源控件。

  commit_version_bump( 
消息:“版本凹凸”,
xcodeproj:“ ./path/to/MyProject.xcodeproj”,

同样,此方法需要与Github集成,并且需要频繁更改持续集成服务器中的源代码控制。

4.脚本化的内部版本号

还有另一种方法,不需要从Continuous Integration服务器上提交版本号。 该技术基于一些魔术数字使用脚本化构建,并相应地增加构建号。 您可以在此处阅读有关此技术的更多信息

该技术效果很好,我们只需要添加另一个运行脚本构建阶段即可执行此脚本。

 #!/ bin / bash#update_build_number.sh 
#用法:`update_build_number.sh [分支]`
#在“复制捆绑资源”构建阶段之后运行此脚本
#Ref:http://tgoode.com/2014/06/05/sensible-way-increment-bundle-version-cfbundleversion-xcode/branch=${1:-'master'}
buildNumber = $(expr $ {git rev-list $ branch --count)-$ {git rev-list HEAD .. $ branch --count))
echo“使用分支'$ branch'将内部版本号更新为$ buildNumber。”
/ usr / libexec / PlistBuddy -c“设置:CFBundleVersion $ buildNumber”“ $ {TARGET_BUILD_DIR} / $ {INFOPLIST_PATH}”
如果[-f“ $ {BUILT_PRODUCTS_DIR} / $ {WRAPPER_NAME} .dSYM / Contents / Info.plist”]; 然后
/ usr / libexec / PlistBuddy -c“设置:CFBundleVersion $ buildNumber”“ $ {BUILT_PRODUCTS_DIR} / $ {WRAPPER_NAME} .dSYM / Contents / Info.plist”
科幻

每当我们上传新版本时,这都会给出新的版本号。 使用这种方法的好处是我们不必从Continuous Integration服务器提交版本后退。

到目前为止,我们已经看到了四种不同的技术来增加iOS版本中的内部版本号。 选择适合您的iOS应用的技术有些棘手。 这是因为它取决于团队中iOS开发人员的技能。 如果正确编写脚本并进行管理,则所有技术都可以正常工作。 但是,我希望使用脚本构建的最后一个,因为它不涉及从Continuous Integration Server更改源代码控制存储库。

在iOS持续交付管道中,自动执行版本和内部版本号可以节省大量时间,并且我们可以轻松使用上述内部版本增加技术来轻松地形成发行培训。 您使用哪种策略进行构建增量? 如果我错过任何事情,请告诉我。

像XCBlog的 XCTEQ 发布的帖子一样 您可能还喜欢我们的一些服务,例如访客博客或Mobile DevOps(CI / CD)或测试自动化。 Github 搜索我们的 服务 ,开源项目, 或者在 Twitter Facebook Youtube LinkedIn 上关注我们 下载我们的 XCBlog iOS应用程序以离线阅读博客。

X CTEQ 一家专门从事基于Mobile DevOps,CI / CD,Mobile,AI / ML的测试自动化Checkout XCTEQ产品和服务的公司, 网址 http://www.xcteq.co.uk 或写信给我们info@xcteq.co。英国..