CI环境iOS入门篇(jenkins+pipeline+fastlane+fir)

前言

持续集成是一种软件开发实践,即团队开发成员经常集成它们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。而持续集成可以保证在任何时间、任何地点生成可部署的软件。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。同时减少风险与重复性的过程、增强项目的可见性。

一、持续集成工具Jenkins

Jenkins是一个基于Java环境开发的持续集成工具。它的开源性使它具备大量的插件,极大的扩展了其功能,可以构建多种平台的软件。除此之外,由于社区活跃、用户界面相对友好、安装和配置都易于上手等特点,Jenkins一直深受大家喜爱。


1.Jenkins安装
首先,由于Jenkins是基于Java环境的,所以要先确保机器上安装java环境
确保以上条件后,进入Jenkins官网进行下载安装(建议用war包安装,这样不会建立新的用户,不涉及权限问题)

install Jenkins

2.Jenkins初始化
安装完成后 Jenkins用户/Home/secrets下复制initialAdminPassword内密码,浏览器进入Jenkins管理界面(默认为:localhost:8080)将复制的密码填入,进行初始化配置。(如使用war包安装,此处可在terminal内看到提示,有明文的初始化密码以及初始化密码存放的路径)插件的选择安装完成后可以在插件管理中配置,所以一开始选择插件时无论是建议配置或自定义配置都无关紧要。只要记得最后一步配置的管理员信息就可以了。

jenkin unlock.png
Jenkins customize
create admin

3.Jenkins插件安装
配置完成后登录Jenkins管理页面,进入右侧系统管理——插件管理,选择可用插件选项卡进行选择或搜索,一次添加插件(某些插件可能要求科学上网)在本例中,添加以下插件:

  • git plugin (集成Git)
  • github plugin (集成Github)
  • PostBuildScript Plugin(可在构建完成后执行脚本)
  • Xcode integration(构建Xcode项目,包括agvtool和导出.ipa)

4.Jenkins添加授权
在系统管理——Credentials中添加新的你所需的授权,例如远程仓库的账号密码或ssh私钥信息等。

Jenkins addCreadentials

上传完成后,Jenkins会为每一个授权富裕一个加密并提供对应此授权的ID,之后需要用到的地方,选择或填写对应的ID即可。

5.Jenkins环境变量配置
在利用pipeline、fastlane构建版本时,需要获取相应的信息、如证书信息等。这是需要在jenkins环境变量中配置对应的变量。(变量也可在pipeline指定的jenkins运行脚本中进行配置)。进入系统管理——系统设置中,勾选环境变量进行添加,此例中添加以下环境变量:

  • PATH = 系统的path绝对路径
  • MATCH_PASSWORD = 生成match文件时设置的解密私钥(设置时请牢记)
  • LC_ALL、LANG = fastlane要求使用的字符集(en_US.UTF-8)
  • FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD = APPID特殊密码(用于发布testfight或iTunes connect时两步验证)
  • FASTLANE_SESSION = appid的session(用于使用appid登陆web时的两步验证 这个session,可以用 fastlane spaceauth -u your@appid.com 来生成)
  • FASTLANE_PASSWORD = appid的密码(用来获取证书时鉴权,更多两步验证fastlane官方推荐方法原理查询)
Jenkins environment variable

6.创建pipeline新工程
点击新建,选择pipeline模式,建立并配置项目

Jenkins create pipeline project
  • General面中可自定义项目基本信息、构建版本保留等配置
Jenkins project general setting
  • 触发器面板中可设置版本构建的条件,可选在其他项目构建后构建,或定时构建(此例中选择每日6点至22点期间,每3小时构建一次,定时构建格式可点击后方文档按钮进行查阅,更多构建方式查阅Jenkins文档)
Jenkins project triggers setting
  • Pipeline面板中设置构建项目的脚本,此处可在面板中直接编写脚本,或者指定远程仓库中的文件来进行配置,此处若使用直接写脚本的方式,可利用Jenkins提供的Pipeline Syntax工具进行脚本命令的格式化工具
Jenkins pipeline script
Jenkins pipeline script from SCM

至此,一个pipeline的项目就配置完成了,但由于本例中结合了fastlane来进行构建,所以目前还需配置好fastlane才能进行构建

二、自动构建工具fastlane

fastlane是为你的iOS和Android应用程序自动测试部署和发布的最简单的方法。它处理所有繁琐的任务,比如生成屏幕截图、处理代码签名和发布应用程序。


1.安装fastlane

首先务必保证已安装最新版的Xcode命令行工具,然后使用Homebrew

brew cask install fastlane

或下载fastlane安装包进行安装。

2.集成fastlane到项目

在项目根目录下执行命令

fastlane init

生成 fastlane文件夹,下面会自动生成Appfile(用于配置项目信息)及Fastfile(fastlane执行脚本) ,打开文件进行配置 。

fastlane APPfile
  • app_identifier:应用的Bundle identifier
  • apple_id:用于打包的Apple ID
fastlane Fastfile
  • before_all:在所有的lane运行前会执行一遍的行为,其中unlock_keychain方法为解锁钥匙串,如在从机(agent)上运行,需将对应的钥匙串导出到项目根目录下并配置此方法填入对应的名称和密码才能进行构建

  • 各种lane:每条lane所需要执行的行为,其中match、gym等命令下面会说到。其中versioning及fir方法与参数请参考第三方插件文档versioningfir

  • after_all:在所有的lane运行结束后会执行一遍的行为

  • error:当lane执行失败时执行此行为

3.集成match到项目

执行命令

match init
match development // 其他类型,可选类型有appstore, adhoc, development, enterprise

在生成Matchfile过程中会需要用户指定APPID、远程仓库地址、解密私钥(务必来及)等信息(证书信息务必放到私有仓库) 生成 Matchfile文件(用于配置appid信息)打开文件进行配置。

fastlane Matchfile
  • app_identifier:应用的Bundle identifier(以逗号分隔)
  • team_id:用于打包的Apple ID所属组别ID
  • team_name:用于打包的Apple ID所属组别名称
  • username:用于打包的Apple ID
  • keychain_name:打包时要用到的证书存放的钥匙串名称
  • keychain_password:打包时要用到的证书存放的钥匙串密码

4.集成gym到项目

执行命令

gym init

生成 Gymfile文件(用于配置项目打包信息)打开文件进行配置

fastlane Gymfile
  • scheme:要打包项目的scheme
  • export_method:打包导出方式
  • configuration:打包类型
  • output_directory:打包输出路径
  • clean:打包前清理是否清理项目

5.加入第三方插件

选择需要的插件,用命令进行添加,生成Pluginfile文件

fastlane add_plugin XXX // 插件名

执行add_plugin命令同时时会在根目录下生成gemfile,也可在其中配置其他需要安装的工具,记得bundle install。

fastlane Gemfile

以上match、gym、等都可以直接写命令到Fastfile中,但分文件来写能保持代码整洁,所有配置也在fastlane脚本中重写覆盖。具体行为(Action)及参数参考 Fastlane官方文档

三、总结

在配置的过程中也遇到了非常多的问题,在此记录一下


1.cocoapod第一次运行时会去下载库到本地时间较长,此时就只有默默地等待了。
2.两步验证问题及两步验证用于web的session生成后字符集的问题。已在文中提及了解决方式。
3.添加完插件后需要bundle install一下,此时务必科学上网。
4.使用自动化打包,需要打开对应要打包项目scheme的share选项。

四、参考

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容