具有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_packages}}”
-名称:安装已配置的cask应用程序。
homebrew_cask:
名称:“ {{item}}”
状态:存在
install_options:“ appdir = /应用程序”
with_items:“ {{homebrew_cask_apps}}”
时间:configure_cask
然后,我们可以从剧本中传递homebrew_taps,homebrew_installed_packages和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_packages:
-自动配置
-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。英国..