iOS 持续集成与持续分发(jenkins+fastlane+pgyer)

摘要

手动打包、手动上传是一件非常烦琐的事件,通常会浪费开发者大量的时间,这时候自动打包与分发就起到的重要的角色。本文主要分为4个部分

  • 讲述jenkins在mac下的安装与任务创建
  • fastlane安装与应用
  • 自动上传到蒲公英并邮件通知相关人员去下载安装
  • xcode打包原理

一、mac环境下jenkins的安装与配置

1.1 手动下载安装
  • jenkins,安装与我们平时安装别的软件差不多
1.2 通过终端安装
  • 安装 homebrew
    ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  • 安装 jenkins
    brew install jenkins
    jenkins-1.png
  • 查看jenkins目录:cd /Users/用户名/.jenkins
    jenkins11.png
1.3 启动jenkins与配置
  • 在终端输入:jenkins即可后台启动服务,然后用浏览器启动页面如下:
  • 直接在命令行中输入:jenkins即可启动。下面三个为常用的jenkins启停方法
    http://localhost:8080 // 打开jenkins可视化页面
    http://localhost:8080/exit //退出Jenkins
    http://localhost:8080/restart //重启
    http://localhost:8080/reload //重新加载
  • 启动时,需要解锁jenkins,按照提示去目录下打开文件,把密码复制出来填入输入框,如果碰到权限问题,需要进行操作: 右键 - 显示简介 - 修改权限。


    jenkins-3.png
  • 启动后,选择安装推荐插件等,即下图中的第一项


    jenkins-4.png
  • 设置管理员信息


    jenkins2.png
  • 进入主面,如下


    jenkins3.png

1.34 jenkins钥匙串插件,访问地址与端口号更改等

  • 地址修改
    进入上面中系统管理->系统设置
    如下:


    jenkins-5.png
  • 全局属性设置

    jenkins5.png

    上图中,PATH参数获取方法:
    终端输入echo $PATH
    jenkins-8.png

  • 打包成功或失败,邮件通知


    ![Uploading jenkins-6_671804.png . . .]

    jenkins-6.png
1.4 jenkins插件安装

上面我们选择推荐安装,对于ios开发,其实大部分已经默认安装,这里我们以keychain为例安装一个(后续fastlane用到match匹配同步开发证书时,会访问钥匙串)

  • 在jenkins主面,系统管理->控件管理


    jenkins11.png
  • 选择可选插件,右边搜索框输入keychain,勾先安装完成后重启jenkins,点击安装


    jenkins10.png
  • 设置keychain相关,在jenkins主面,系统管理->控件管理,点击keychain。。。,然后来点页面:
    jenkins12.png

    打开keychain位置的命令:open ~/Library/Keychains/
    如果不设置这个,那么在创建任务中,在Excute shell中就要加上这句:security unlock-keychain -p 你的电脑密码 login.keychain
1.5 jenkins任务创建与任务配置
  • 创建,新建->选择构建一个自由风格的软件项目。如下图


    jenkins7.png

    然后主面右边就会出现刚创建好的。点击进去。来到任务主页。

  • 任务主页


    jenkins13.png
  • 配置相关信息

    • 配置构建存留周期次数、Git等,如下图


      jenkins14.png
    • 配置运行脚本,这里主要配置一些你打包的命令脚本。

      jenkins15.png

      这里的脚本,可以参照下文第二部分fastlane中fastfile配置,里面实现了fastlane matchDev与fastlane dev操作。

    • 定期自动构建

      jenkins18.png

      常用的poll scm设置
      每15分钟构建一次:H/15 * * * * 或*/5 * * * *
      每天8点构建一次:0 8 * * *
      每天8点~17点,两小时构建一次:0 8-17/2 * * *
      周一到周五,8点~17点,两小时构建一次:0 8-17/2 * * 1-5
      每月1号、15号各构建一次,除12月:H H 1,15 1-11 *

    • 构建后操作,邮件通知等


      jenkins16.png

      操作步骤: 增加构建后操作->Editable Email Notification,然后点击下面的Advanced Settings,就会出现上面的图,填写好标题两天内容即可。

    • 邮件发送成功示例


      jenkins17.png
    • 构建过程中,可通过点击当前构建,点击console output查看打包过程中的输出日志。


      jenkins20.png

建议把jenkins页面右上角的允许自动刷新打开


二、fastlane安装与配置

fastlane是一个完全开源的项目,包含一组 Ruby 实现的工具集,能完成 iOS 和 Android 工程 的自动化构建\测试和发布,用来执行某一特定的任务,可以通过配置文件将不同的工具灵活的结合在一起,从而形成一个完整的自动化流程,实现一键上传 ITC,从而缩短用于构建发布的时间,其主要工具集如下:

  • sigh: 开发证书和描述文件下载
  • produce: 使用命令行在iTunes Connect上创建新的app和开发入口
  • cert: 自动创建和配置iOS代码签名证书
  • spaceship: Ruby 库访问 Apple开发者中心和 iTunes Connect
  • pilot: 最好的方式管理你的TestFlight 测试人员和从终端构建
  • boarding: 最简单的方式邀请你的TestFlight beta测试人员
  • gym: iOS app打包签名自动化工具
  • match: 使用Git同步你的团队证书和配置文件
  • scan: 最简单方式测试你的 iOS 和 Mac apps

查看所有的工具集:fastlane actions
单独查看某一个action的功能: fastlane action [action_name]

2.1 fastlane的安装
  • 检查xcode-select 是安装
xcode-select --install // 若未安装则会自动安装,若已经安装,则提示:xcode-select: error: command line tools are already installed, use "Software Update" to install updates
  • 安装fastlane
sudo gem install -n /usr/local/bin fastlane
  • 查看版本
fastlane --version
2.2 为项目配置的fastlane
  • 在工程目录在,用终端初始化
cd 工程目录
fastlane init 
  • init过程,由于我的帐号关联了两个开发者帐号,于是会弹出让我选择哪一个的选项。


    fastlane1.png

上述过程中,会要求你填写开发者帐号密码等信息。完成后,会在你的工程目录在创建一个fastlane文件夹

  • 文件夹如图所示


    fastlane2.png

    各文件描述:

    • Appfile:用于存储应用程序标识符和Apple ID 等信息
    • Fastfile:配置管理 lane 我们打包主要是配置这个文件
    • Deliverfile:配置应用在 iTunes Connect 中的各种信息,和 ICC 中的数据是一一对应的
    • metadata:包含应用在 iTunes Connect 中的各种信息
    • screenshots:包含截图数据

项目工程中,Edit Scheme打开的页面,Shared前的勾选框,应该打上勾。不然jenkins打包过程中,可能报错。
接下来主要讲述Fastfile文件配置

2.3 fastfile文件编写

下面用到的工具match、gym、deliver、gpyer等,均可以通过:fastlane 工具名 --help查看里面的参数如何写等

  • match匹配证书
    • 首先要一个仓库来存放证书与profile文件


      fastaneMatch1.png
    • 在工程目录下执行 fastlane match init,过程中会要求你填入一个git仓库。把上面创建好的填入即可。
      fastaneMatch2.png
    • 这样,在fastlane文件夹会添加一个Matchfile文件。


      fastaneMatch3.png
    • 内容如下


      fastaneMatch4.png
    • 在fastfile文件中,添加匹配证书的执行块:
      fastaneMatch6.png

      其中,match函数中的参数key与参数值value,可在终端执行:fastlane match --help 或者 github上查看:match
    • 在终端执行fastlane matchDev后,仓库上,keychain中,jenkins环境中,均会有证书相关文件
      fastaneMatch5.png

      执行fastlane matchDev,途中会要求访问钥匙串,要输入电脑密码。如果把这脚本写到jenkins Excute shell中,那么会碰到超时,提示未输入username,于是我们会在shell中添加:security unlock-keychain -p 你的电脑密码 login.keychain或者在插件管理中,把login.keychain先配置好
    • registerDevice 添加新设备UUID
desc "添加新设备UUID"
desc "This will also make sure the profile is up to date"
lane :registerDev do
    register_device(
      name: "名字",
      udid: "227a4********1349e27***c211e**69")
end
--------------这样,在匹配证书时,就要用到:force_for_new_devices属性---------------
desc "匹配生成证书"
desc "This will also make sure the profile is up to date"
lane :matchAppstore do
    match(type: "appstore",keychain_password: ENV['PASSWORD'],force_for_new_devices:true) # 匹配开发证书
end
  • gym打包
    • 在fastfile中配置打包,这里用到gym工具,可通过fastlane gym --help或github查看gym用法
      fastaneMatch7.png

      其中,首先匹配证书。像里面用到的increment_build_number 这些都可通过fastlane actions查看到。
      下面这样,省去build版本自增等,更为简洁。
desc "打包测试"
  lane :dev do
    match(git_url:"https://git.oschina.net/yang***/cer.git",type: "development",keychain_password:"123",app_identifier:"cn.com.**") # 匹配开发证书
   
     # 打包,具体参数可fastlane gym -h查看
     gym(clean: true,scheme:"GC",configuration:"Debug",output_name:"GC_Test",export_method:"development")
  
    # 上传到薄公英,可以去薄公英官网查看插件安装方法
     pgyer(api_key: "6ef35de7a3c4c60***dd48825eac3a", user_key: "ce1e4c***c27232fcde878db3",password: "a**23", install_type: "2")
    # 发布
     # deliver(force: true,skip_screenshots:true,skip_metadata: true)    # 不上传截屏文件和元数据。
  end

上面有用到上传蒲公英,接下来第三部分讲述pgyer的用法。


三、pgyer插件安装与配置

pgyer安装与使用官方文档:使用 Fastlane 上传 App 到蒲公英
在工程目录在,用终端键入:

fastlane add_plugin pgyer
  • 安装后,工程目录下会有Gemfile文件,fastlane文件下,会多出pluginfile文件


    pgyer1.png
  • pluginfile如下


    pgyer2.png
  • fastlane ,在fastlfile中配置上传蒲公英操作
lane :uploadPgyer do
  pgyer(api_key: "7f15xxxxxxxxxxxxxxxxxx141", user_key: "4a5bcxxxxxxxxxxxxxxx3a9e", password: "123456", install_type: "2")
end
  • 上面,api_key与user_key获取如下:


    pgyer3.png

四、xcode打包原理

xcode打包,用的就是xcodebuild命令完成的。可以通过man xcodebuild命令查看文档
此部分参考了两位同事的文章:xcodebuild自动打包,发布应用xcodebuild 自动化构建

  • xcode打包发布流程
    • xcodebuild clean
    • archive
    • exportArchive导出文件
    • altool上传
  • archive打包
xcodebuild archive -workspace 项目名称.xcworkspace 
                       -scheme 项目名称 
                       -configuration 构建配置 
                       -archivePath archive包存储路径 
                       CODE_SIGN_IDENTITY=证书 
                       PROVISIONING_PROFILE=描述文件UUID
  • configuration构建配置,可参考以前写的文章:Xcode通过Build Configuration配置多套域名方法,一般情况下,我们这里打测试包写:Debug,生产包:Release.
  • CODE_SIGN_IDENTITY获取:
    钥匙串访问->选中证书->上方的标题就是我们需要的Identity(括号也算),如:iPhone Developer: ** *** (WS4F**K**)
  • PROVISIONING_PROFILE:这个获取方法如下:
/Users/用户名/Library/MobileDevice/Provisioning Profiles 
找到对应的provisioning Profiles
如果文件较多,可在命令终端输入
security cms -D -i xxxx.mobileprovision // 解析描述文件,可以得到里面所有的信息(TeamId,ProvisionedDevices,TeamName,UUID,Version,AppIDName等等)。以确定哪一个是此项目所用到的

注意要 在CODE_SIGN_IDENTITY,PROVISIONING_PROFILE赋值时要加""号

  • 导出ipa包
xcodebuild -exportArchive -archivePath archive文件的地址.xcarchive 
                          -exportPath 导出的文件夹地址 
                          -exportOptionsPlist exprotOptionsPlist.plist 
                          CODE_SIGN_IDENTITY=证书 
                          PROVISIONING_PROFILE=描述文件UUID
  • archive文件的地址.xcarchive
    这个地址为打包后,生成**.xcarchive文件的地址。
  • exportOptionsPlist
    这是一个plist文件,我们可以在项目中手动创建一个,然后把这个文件地址拖进来。plist具体有哪些参数,用命令:xcodebuild exportOptionsPlist --help查看,在输出的Available keys for -exportOptionsPlist项:
    jenkins12.png
  • ipa包上传,我们工作中一般用的是Application Loader或xcode 打包后的upload按钮,但是它们的本质其实都是用:altool来实现。
    altool工具的位置:
/Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/altool

命令设置别名:

在~/.bash_profile 中设置别名
alias altool='/Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/altool'

设置别名后在终端
输入 source ~/.bash_profile 以使其生效。
再输入 altool  就会有它的一些用法提示,否则就是设置别名失败了

同理,别的工具也可以用此方法实现别名处理,以快速在终端打开工具。

altool 用法:

验证 ipa
altool --validate-app -f file -u username [-p password] [--output- format xml]
上传 ipa
altool --upload-app -f file -u username [-p password] [--output- format xml]

具体参数说明:
--validate-app
您要验证的应用程序。
--upload-app
您要上传的应用程序。
-f file
您正在验证或上传的应用程序的路径和文件名。
-u username
您的用户名。
-p password
您的用户密码。
--output-format [xml | normal]
您要 Application Loader 以结构化的 XML 格式还是非结构化的文本格式返回输出信息。Application Loader 默认以文本格式返回输出信息。

altool官方文档

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

推荐阅读更多精彩内容