具有Fastlane和Ansible的iOS连续交付-第2部分

这是我在Photobox Group处理iOS应用程序持续部署的经验的第二部分。 在上一篇文章中,我们看到了我们如何使用Fastlane从持续集成服务器中连续部署iOS应用。 连续交付过程中最棘手的障碍之一是“在机器上工作”现象。 几乎每个工程师都至少遇到一次此问题。 我们还遇到了“在我的机器上工作”一文中提到的相同问题。

挑战性

在维护连续集成服务器的同时,我们遇到了以下挑战。

  • 使用所有与iOS相关的软件手动设置CI服务器计算机需要花费几天的工程师。
  • 在CI服务器上产生的结果在本地开发人员机器上无法再现。
  • 我们的构建配置步骤与TeamCity持续集成服务器中的GUI配置紧密结合。
  • 开发人员机器和CI服务器上的软件版本不同
  • 我们失去了对CI服务器的信任,最终花费大量时间寻找问题的根本原因。

在此阶段,我们确实需要一些配置管理工具,该工具可让我们使用相同的配置来设置所有计算机,并应能够从头开始进行配置。 我们需要我们的iOS基础架构由代码(也称为基础架构)驱动。 我们正在为达尔文寻找类似Docker的产品。 有很多选择,例如Chef,Puppet等,但我们碰到了Ansible,因为它是用于基础结构自动化的简单但功能强大的工具,而无需了解其他任何语言(如Ruby)。 在这篇文章中,我们将看到如何使用Ansible来配置CI服务器。

使用Ansible设置iOS CI

以前,我们曾经使用交付iOS应用程序所需的所有软件来手动设置CI或持续集成服务器。 工程师必须手动下载并安装带有其他组件的Xcode,安装所需的自制软件包,设置RVM和rubygems。 它还涉及将构建服务器设置为TeamCity Build Agent。 要花费大约一两天的时间才能使构建机器处于工作状态。 这种方法既费时,又很难管理构建服务器上安装的软件版本。 我们使用Ansible设法使上述几乎所有内容自动化。

能够在需要时重置,重新构建iOS Continuous Integration Server环境非常重要。 Apple不断发布Xcode的新版本或Beta版本以及其他开发人员工具,因此我们应该能够快速设置和使用这些功能。 可编程基础结构或作为代码的基础结构是持续交付的关键,因此我们需要一个脚本来自动设置这些内容,而无需人工干预。 Ansible允许我们编写代码以管理部署以及基础架构的自动配置。 Ansible任务和剧本是简单的YAML文件,因此无需学习其他编程语言(如Ruby)来编写iOS基础结构脚本。 iOS持续集成服务器的配置涉及以下任务

  • 预配置Xcode和Xcode命令行工具的安装
  • 调配iOS开发所需的自制程序包
  • 使用RVM设置红宝石环境
  • 设置macOS默认值
  • 为TeamCity服务器配置TeamCity代理

以上每个步骤都有Ansible任务,让我们更深入地研究这些任务

Ansible Xcode任务

包括Xcode在内的大多数Apple软件都是专有软件。 您需要Apple开发人员帐户才能下载安装这些软件。 设置Xcode的安装是一项重大挑战。 我们已决定下载特定Xcode版本的Xcode .xip文件,并将其托管在公司托管的SAMBA服务器上。 我们可以将Xcode .xip挂载到任何构建服务器机器上以安装Xcode。 然后,我们可以提供其他Xcode相关任务,例如接受协议,安装命令行工具,使用Ansible任务安装其他组件。 示例Ansible任务如下所示:

  --- 
-名称:从Samba服务器挂载Xcode XIP
命令:bash -c“ mount_smbfs // {{ansible_env.SAMBA_USER}}:{{ansible_env.SAMBA_PASS}} @ our_server / Applications / xcode /〜/ samba / public /”
什么时候:xcode_dir.stat.exists == False
  -名称:从XIP文件位置安装Xcode 
命令:bash -c'open -FWga“ Archive Utility” --args〜/ xcode_xip / {{xcode_src}}'
  -名称:将Xcode移至应用程序 
命令:bash -c'mv〜/ xcode_xip / Xcode * .app / Applications /'
  -名称:接受许可协议 
命令:/Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild -license接受
成为:是的
成为方法:须藤
  -名称:安装其他xcode组件 
命令:installer -pkg /Applications/Xcode.app/Contents/Resources/Packages/XcodeSystemResources.pkg -target /
成为:是的

然后,我们可以从Playbook文件(它是Xcode版本)中传递xcode_src变量,我们需要进行安装。 这样,我们可以轻松切换到另一个Xcode版本。

Ansible自制任务

作为iOS CI服务器配置的一部分,我们需要安装一些macOS软件包。 Homebrew是一个了不起的软件包管理器,最重要的是Ansible具有内置的homebrew模块,该模块允许我们使用任何Homebrew公式或安装homebrew软件包。 我们的示例自制任务看起来像这样

  --- 
-名称:确保点击已配置的分接头。
homebrew_tap:“点击= {{item}} state = present”
with_items:“ {{homebrew_taps}}”
  -名称:确保已安装配置的自制程序包。 
自酿:“名称= {{项}}状态=存在”
with_items:“ {{homebrew_installed_pa​​ckages}}”
  -名称:安装已配置的cask应用程序。 
homebrew_cask:
名称:“ {{item}}”
状态:存在
install_options:“ appdir = /应用程序”
with_items:“ {{homebrew_cask_apps}}”
时间:configure_cask

然后,我们可以从剧本中传递homebrew_taps,homebrew_installed_pa​​ckages和homebrew_cask_app。 这意味着我们有能力通过代码管理所有macOS软件包。

Ansible RVM任务

Ruby在iOS应用程序开发中扮演着非常重要的角色,因为诸如CocoaPods,Fastlane之类的工具就是ruby库。 为了从这些工具的最新功能中受益,我们需要比macOS上预装的Ruby 2-0更高的Ruby版本。 默认的macOS ruby​​不适用于使用bundler管理Rubygems。 我们正在使用Ruby版本管理工具RVM通过捆绑程序管理ruby版本。 作为配置任务,我们需要安装ruby和bundler。 我们的示例RVM Ansible任务如下所示:

  --- 
-名称:为用户安装RVM
命令:bash -c“ \ curl -sSL https://get.rvm.io | bash -s---ignore-dotfiles”
  -名称:安装ruby版本 
命令:bash -c“〜/ .rvm / bin / rvm install {{ruby_version}} --with-zlib-dir = {{zlib_directory}}”
  -名称:安装iOS应用开发所需的Ruby Gems 
命令:bash -c“〜/ .rvm / rubies / {{ruby_version}} / bin / gem install {{item}}”
with_items:“ {{rubygems_packages_to_install}}”

然后,我们可以从剧本中传递zlib_directory和rubygems_packages_to_install。

macOS默认值的Ansible任务

在构建服务器计算机上,我们需要禁用更新并将计算机设置为“从不休眠”模式。 我们可以从Ansible任务中进行设置,并从剧本中传递命令。

  --- 
-名称:设置macOS睡眠模式
外壳:“ {{item}}”
with_items:“ {{macos_sleep_options}}”
更改时间:假
  -名称:软件更新 
外壳:“ {{item}}”
with_items:“ {{macos_software_autoupdates}}”
更改时间:假

Ansible TeamCity代理程序任务

我们使用TeamCity作为我们的持续集成服务器。 作为最后的任务,我们将机器作为TeamCity构建代理添加到TeamCity Server并启动构建代理。 它涉及以下任务

  • 从TeamCity服务器下载TeamCity Agent .zip软件包
  • 在buildAgent.properties文件中添加TeamCity Agent配置
  • 启动TeamCity代理

为了设置TeamCity构建代理,我们需要在服务器计算机上安装Java。 我们还需要为buildAgent.properties.j2文件创建Ansible忍者模板,并使用参数teamcity_agent_server_url和teamcity_agent_name替换为默认模板文件。 最后,启动TeamCity构建代理。 我们的TeamCity Ansible任务如下所示:

  --- 
-名称:“下载Teamcity Agent软件包”
命令:bash -c“ curl {{teamcity_agent_server_url}} / update / buildAgent.zip --output /tmp/buildAgent.zip”
注册:_teamcity_agent_package
  -名称:“添加TeamCity代理配置” 
模板:
src:“ buildAgent.properties.j2”
目标:“ {{teamcity_agent_install_dir}} / conf / buildAgent.properties”
模式:0644
  -名称:启动Teamcity Agent 
命令:bash -c“ {{teamcity_agent_install_dir}} / bin / agent.sh start”

我们的示例剧本

通过使用上述所有Ansible任务,我们创建了一个私有的Ansible角色来执行所有任务。 如果您有兴趣,我们可以与您分享。 我们的示例剧本如下所示:

  --- 
-主机:localhost
连接:本地
xcode_src:Xcode_8.3.xip
ruby_version:ruby-2.3.0
zlib_directory:/usr/local/Cellar/zlib/1.2.11
rubygems_packages_to_install:
-捆扎机
teamcity_agent_install_dir:〜/ TeamCity / buildAgent
teamcity_agent_server_url:https://our_teamcity_server.com
teamcity_agent_name:Our_iOS_Agent
  macos_sleep_options: 
-systemsetup -setsleep从不
-systemsetup -setharddisksleep从不
-systemsetup -setcomputersleep从不
  macos_software_autoupdates: 
-软件更新-计划关闭

  homebrew_installed_pa​​ckages: 
-自动配置
-openssl
-wget
-zlib
-卷曲
-imagemagick
homebrew_taps:
-自制/核心
-酒柜/酒桶
任务:
-包括:tasks / ios_ansible.yml

现在,我们的剧本已经可以在任何macOS机器上播放了。 通过使用该手册,我们设法为全新的Mac Mini服务器配备了iOS开发所需的所有软件,并在20-30分钟内将其连接到TeamCity服务器。 最重要的是,它不需要任何手动干预。 现在,我们可以在几分钟内从头开始设置CI服务器。

每当我们想要升级到新的Xcode版本或任何其他Apple开发人员工具时,我们都会在CI服务器上执行此剧本。 它确实可以帮助我们轻松重置和重建CI服务器设置,而无需花费大量时间。

好处

使用Ansible设置iOS CI的好处是

  • 快速设置新的CI服务器计算机并轻松升级/降级Xcode版本
  • 能够根据需要重置,升级软件版本
  • 将所有配置从TeamCity GUI解耦到代码中。
  • 简化本地计算机和CI服务器的配置。

结论

我们已经使用Fastlane作为构建自动化工具并使用Ansible作为持续集成配置(也称为配置管理工具)来实现iOS应用的连续部署。 您对iOS连续部署有何经验?您如何看待我们的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。英国..