iOS持续集成篇

概述

持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

集成条件

  • 同一网段,局域网或外网
  • 配置Jenkins +fastlane +pgyer +webHook,相关概念文章中做了简要说明

主要实现流程

  • 上传代码到GitLab
  • webHook(钩子)通知Jenkins
  • Jenkins收到消息自动触发构建拉取上传的最新代码,执行Shell脚本完成自动化测试,自动化代码检查,打包上传蒲公英等第三方App托管平台
  • 第三方App托管平台通过短信和邮件通知测试人员

最终将会实现:你只用上传代码到服务器指定的分支✌️,剩下的工作都将自动化,你的App最终将会直接到测试人员手中,省去中间重复无意义的工作流程

说明:
1,研究持续集成,遇到的坑多不胜数,出现的问题已在文章中做了说明
2,配置环境比较繁琐,若你是单人开发在本机构建,可只安装使用fastlane,使用文章最后提供的脚本完成自动打包上传的功能

一,前置环境

1.1,安装ruby环境 如果你安装过CocoPods,可输入

$ ruby -v (显示版本大于2.0不用安装)

出现报错信息或者版本小于2.0,请参考此链接安装或更新,此处不做累述。

1.2,安装brew

$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

安装成功输入,会跳转到Homebrew官网,即为成功

$ brew home

1.3,Jenkins依赖于Java环境,首先需安装和配置Java环境

$ brew cask install java 

1.4, 详细命令可使用 brew help 查看


二,安装fastlane

Fastlane 是一个 ruby 脚本集合成的套件, 包括了向 App Store 提交新应用或更新已有应用所需要的常用任务,相比自定义脚本,稳定性和功能会更多。

  • gym 编译打包生成 ipa 文件
  • deliver 用于上传应用的二进制代码,应用截屏和元数据到 App Store
  • sigh 可以生成并下载开发者的 App Store 配置文件
  • snapshot 可以自动化iOS应用在每个设备上的本地化截屏过程

2.1,依次执行下列命令

$ xcode-select --install

已安装出现错误提示:

xcode-select: error: command line tools are already installed, use    
"Software Update" to install updates ,可跳过这一步

未安装,点击安装会出现弹框提示,点击安装

$ brew cask install fastlane (输入密码等待安装成功)

安装成功后提示: fastlane was successfully installed!

$ export PATH="$HOME/.fastlane/bin:$PATH"  (安装成功后执行)

$ fastlane env (查看fastlane当前环境,会提示你是否复制到剪切板,输入n即可)

$ fastlane -version (输出版本信息即为成功)

2.2,安装蒲公英插件

 $ fastlane add_plugin pgyer

2.3,在.xcodeproj项目目录下,初始化fastlane:

 $ fastlane init

终端会提示要你填写你的开发者账号与密码,然后fastlane会自动检测当前目录下项目的App Name和App Identifier、Project。然后自行确认并按流程执行

2.4,若你的项目使用了Cocopods,在Gemfile文件中加入下面代码:

gem "cocoapods"

三,安装Jenkins

Jenkins是用java编写的开源持续集成工具,可在此步步骤做代码静态检查,语法检查,脚本自动化测试,根据测试结果发布最稳定的版本等,大公司用的比较多,功能很强大,支持多样化的插件机制,支持Git,SVN。

Jenkins的安装方式

  • pkg安装,此方法会新建一个jenkins用户后续会涉及了各种坑,不推荐
  • brew安装,相对第一种比较好
  • 最好的方案是使用tomcat+war部署Jenkins

3.1,点击apache-tomcat-8.5.20下载文件,并解压重命名为Tomcat,复制到资源库目录下

01.png

3.2,cd 到Tomcat文件的bin目录下,给sh文件赋予管理员权限,按提示输入密码

$ sudo chmod 755 /Users/用户名/Library/Tomcat/bin/*.sh

3.3, 然后执行

$ sudo sh startup.sh
02.png

3.4,浏览器输入 localhost:8080 打开页面如下,即安装成功!

03.png

3.5,添加环境变量
因为startup.sh与shutdown.sh需要在Tomcat的bin目录下执行,每次输入路径比较麻烦,设置以下环境变量即可

$ touch .bash_profile (创建bash_profile)
$ open -e .bash_profile(打开bash_profile)
$ export PATH=$PATH:/Users/用户名/Library/Tomcat/bin (在打开的bash_profile中输入) 
$ source .bash_profile (更新配置的环境变量)
$ echo $PATH (验证是否成功)

3.5,配置JENKINS_HOME,这一步很重要,如果不配置将会创建到私有目录下,各种权限访问不到!

在Tomcat的bin目录下,编辑 catalina.sh 文件 找到如下代码

# OS specific support.  $var _must_ be set to either true or false.
在上面的代码上面一行添加下面这句话,在引号中填入你的路径,
可在资源库创建.jenkins文件夹用于存放,如下图所示
export JENKINS_HOME="Jenkins构建的项目存放的路径"
04.png
05.png

3.7,设置完毕上面的环境变量,可使用如下命令操作tomcat

$ sudo sh startup.sh  (启动tomcat)
$ sudo sh shutdown.sh (关闭tomcat)

3.8,下载war,将war文件移动到Tomcat文件夹的webapps目录下

06.png

3.9,打开链接 localhost:8080/jenkins/ 启用Jenkins,等待大概两分钟左右就启动完成了

开启secrets目录权限,
$ sudo chmod 755 /Users/用户名/.jenkins/secrets 

然后如下图打开initialAdminPassword,复制密码粘贴到文本框中

07.png

3.10,选择左侧的选项,安装jenkins推荐的插件就可以了

08.png

3.11,等待大概10分钟左右就安装完成了

09.png

3.12,输入对应信息,防止忘记你可以使用你电脑的名称与密码,注意密码忘记了你只能重装Jenkins

10.png

3.13,点击开始使用Jenkins按钮

11.png
四,配置Jenkins

4.1,大功告成!点击创建一个新任务

12.png

4.2,输入项目名称,选择第一项构建一个自由风格的软件项目,点击OK,有时候出现加载中的情况,多刷新几次页面即可

13.png

4.3,输入描述信息,项目构建久了会有很多老旧的构建不需要,一个个删除比较麻烦,初始化项目可设置丢弃旧的构建选项,填写保持构建的天数,保持构建的最大个数,这里设置保持7天,最大构建个数为30

14.png

4.4,点击上方源码管理菜单,选中Git选项
Repository URL:项目地址
Branch Specifier (blank for 'any') :分支,默认为master,这里设置的develoepr

15.png

4.5,若你的Repository URL地址为SSH,你需要点击Credentials 右侧 的Add按钮,然后选中Jenkins选项配置SSH公钥
Kind选项,如下图所示选择SSH

16.png

4.6,选中 Private Key 的Enter directly 按钮,输入用户名与SHH公钥,点击Add

17.png

4.7,选中你所添加的用户秘钥,然后点击最下方保存按钮

18.png

4.6,添加shell脚本

选择上面的构建菜单,点击底部增加构建步骤,选择第二项 Execute shell

19.png

输入如下脚本

#cd到项目fastlane文件夹所在根目录,一般为.xcodeproj所在目录,这里是相对路径
cd ./fastlane文件夹所在根目录/

#打印当前的路径,验证是否正确
pwd

# 项目名称
IPANAME="项目名称"

echo "正在打包中..."

# 使用fastlane打包,注意这里的scheme填入你项目对应scheme即可
fastlane gym --scheme scheme --export_method ad-hoc --output_name ${IPANAME}

echo "上传蒲公英..."

#注意:
#其中,USER_KEY 和 API_KEY 可以在蒲公英的「账户设置」中找到,之后进行相应替换。
#export_method 可以根据打包类型进行相应设置。
#可选的值有:app-store、ad-hoc、development、enterprise。
#对于 Xcode 8.3 以下的版本,则不需要设置 export_method。
curl -F "file=@${IPANAME}.ipa" -F "uKey=USER_KEY" -F "_api_key=API_KEY" https://qiniu-storage.pgyer.com/apiv1/app/upload

4.7,保存修改,回到主界面,点击系统管理进入系统设置
(全局设置&路径),勾选Environment variables, 终端输入

$ echo $PATH 

复制输出的值,在键值对列表中,键填入PATH,值填入复制输出的值

配置Environment variables.png
4.8,定时构建

选择上面的构建触发器菜单

Build periodically选项:
定时触发构建,输入H */1 * * *

 H */1 * * * (H */1 表示每小时任意分钟执行一次)

Poll SCM (poll source code management) 选项
轮询源码管理,需要设置源码的路径才能起到轮询的效果。一般设置为类似结果: 0/5 每5分钟轮询一次

20.png

点击保存,回到主界面点击立即构建,点击#1可查看第一次构建的信息

21.png

进入点击 左侧Console Output 查看日志,这里显示打包上传蒲公英成功!

22.png
4.9,自动化构建

4.9.1,点击最上方Jenkins头像,回到主页面,点击主页面的系统配置按钮

23.png

4.9.2,点击第六项,管理插件

24.png

4.9.3,选中可选插件选项,依次安装插件

  • Gitlab Hook Plugin
  • GitLab Plugin
  • Build Authorization Token Root Plugin
25.png

4.9.4,安装到最后一项的时候,勾选安装完成后重启Jenkins,重启后需要重新登录,可选中在这台计算机上保持登录状态

26.png

4.9.5,重新进入项目的配置页面,选择上面的构建触发器菜单

  • 勾选Build when a change is pushed to GitLab. GitLab CI Service URL选项
  • 勾选触发远程构建 (例如,使用脚本)选项,在终端输入如下命令,获取Token令牌,填入身份验证令牌文本框
  $ openssl rand -hex 12
27.png

4.9.6,根据身份验证令牌下的提示,拼接webHook URL

JENKINS_URL/job/tyfocgApp(iOS)/build?token=TOKEN_NAME 或者 /buildWithParameters?token=TOKEN_NAME

例如如下链接,中间不能有空格,如果是本机需要设置端口号
http://192.168.91.33:8080/buildByToken/build?job=tyfocgApp(iOS)&token=26acd09446289127aaa7f8d0

4.9.7,进入GitLab对应的项目,点击左侧菜单的Setting按钮(此选项需要权限,没有此选项找仓库管理员开通),选择Web Hook 填入上方的地址,点击AddWebhook即可

什么是webhooks呢?

钩子功能(callback),是帮助用户push了代码后,自动回调一个您设定的http地址。 这是一个通用的解决方案,用户可以自己根据不同的需求,来编写自己的脚本程序(比如发邮件,自动部署等),例如你提交代码到仓库,钉钉上会有消息通知,也是通过钩子实现的。

28.png

4.9.8,点击下方的Test Hook按钮测试此链接

链接有效
Hook successfully executed.
链接无效,请检查Git服务器能否访问你的链接地址,如果是本地域名,请绑一下hosts。需在同一网段,比如同是局域网环境,或同是外网环境
Hook execution failed. Ensure hook URL is correct and service is up.

此时需要再重启一下GitLab服务器,此时可修改代码,提交GitLab,测试是否触发构建
如果点Test可以成功布署,但提交git还是不会自动布署,请执行

$ /opt/codereview/phabricator/bin/phd start)

现在push代码到develoer分支,你会发现Jenkins自动执行构建任务,checkout代码, 触发脚本打包上传蒲公英,一分钟后你将收到蒲公英的邮件短信通知✌️

五,异常情况
  • 4.1,输入sudo sh startup.sh 命令出现错误提示:

    Cannot find ./catalina.sh
    The file is absent or does not have execute permission
    This file is needed to run this program
    
    终端输入如下命令,前面设置过有时候还是报错
    $ cd /Users/用户名/Library/Tomcat/bin/
    $ chmod 777  *.sh
    
  • 4.2, 出现 fastlane: command not found

这个情况一般是由于 jenkins 没有设置正确的 $PATH 环境变量导 致的。正确设置的方法为:

$ echo $PATH

记录上面命令输出的结果在Jenkins 中系统管理-系统设置中,
找到 环境变量(Environment variables),选中此项
在 key 中填写 PATH,在 value 中填写第一步中输出的结果
保存即可

  • 4.3, fastlane: command not found

    命令行报错
    -bash: fastlane: command not found
    终端输入 $ echo $PATH   发现输出内容只有Tomcat的环境
    /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/rzj/Library/Tomcat/bin
    这时候输入任何的 fastlane 命令都会报错 fastlane: command not found
    $ which fastlane
    $ whereis fastlane
    以上两个命令均没有输出信息
    这是输入 $ rvm -v 会发现 报错 rvm: command not found
    

    解决方法:

    重新载入RVM环境即可,造成的原因可能为上面修改环境变量造成的覆盖
    $ source ~/.rvm/scripts/rvm
    
  • 4.4,关闭防止跨站点请求伪造功能

该功能可能造成使用直接POST请求触发自动构建报错403,在Jenkins系统管理中点击Configure Global Security,去掉勾选防止跨站点请求伪造功能即可

29.png
  • 4.5,如果提示缺少 cloudbees-folder 的,可以前往这里下载其插件cloudbees-folder下载完成是一个hpi文件,然后将该文件放到.jenkins的plugins里面即可,此情况一般不会遇到。

  • 4.6,注意安装 JRE ,这个需要注意版本,如果版本不符合要求,会无法访问 Jenkins,由于版本问题导致的无法访问会在 tomcat/logs目录下生成 log 文件, localhost.日期.log ,内部有如下的错误提示,如果你也遇到这个问题,升级 JRE 就好,注意 升级JRE 需要重启电脑。

    严重: Error configuring application listener of class    
            jenkins.util.SystemProperties  
            java.lang.UnsupportedClassVersionError:                  
            jenkins/util/SystemProperties : Unsupported major.minor   
           version 51.0 (unable to load class        
           jenkins.util.SystemProperties) .......
    
六,卸载Jenkins

5.1,通过安装包安装的卸载方式

  cmd+shift+g 前往文件夹 输入
  /Library/Application\ Support/Jenkins/  
  点击Uninstall.command 

5.1,通过Homebrew安装的卸载方式

$ brew uninstall jenkins

5.3 通过Tomcat+war安装删除Tomcat对应的Jenkin文件夹即可

六,fastfile脚本

打开项目fastlane目录下的文件夹,将下列代码替换到Fastfile文件中

#使用方法 cd到项目.xcworkspace目录 终端输入 fastlane automaticPackagingUpload

# 定义fastlane版本号
fastlane_version “2.55.0” 

# 定义打包平台
default_platform :ios

#指定项目的scheme名称
scheme = “ scheme”

#蒲公英api_key和user_key
api_key  = “api_key”
user_key = “user_key”


def updateProjectBuildNumber

currentTime = Time.new.strftime("%Y%m%d")
build = get_build_number()
if build.include?"#{currentTime}."
# => 为当天版本 计算迭代版本号
lastStr = build[build.length-2..build.length-1]
lastNum = lastStr.to_i
lastNum = lastNum + 1
lastStr = lastNum.to_s
if lastNum < 10
lastStr = lastStr.insert(0,"0")
end
build = "#{currentTime}.#{lastStr}"
else
# => 非当天版本 build 号重置
build = "#{currentTime}.01"
end
puts("*************| 更新build #{build} |*************")
# => 更改项目 build 号
increment_build_number(
build_number: "#{build}"
)
end


# 任务脚本
platform :ios do
lane :automaticPackagingUpload do|options|
branch = options[:branch]

puts “*************| 开始打包.ipa文件 |*************”

updateProjectBuildNumber #更改项目build号

# 开始打包
gym(
#输出的ipa名称
output_name:”#{scheme}_#{get_build_number()}”,
#指定项目的scheme
scheme:"#{scheme}",
# 是否清空以前的编译信息 true:是
clean:true,
# 指定打包方式,Release 或者 Debug
configuration:"Release",
# 指定打包所使用的输出方式,目前支持app-store, package, ad-hoc, enterprise, development
export_method:"ad-hoc",
# 指定输出文件夹
output_directory:"~/Desktop/fastlaneBuild",
)

puts “*************| 开始上传蒲公英 |*************”

# 开始上传蒲公英
pgyer(api_key: “#{api_key}”, user_key: “#{user_key}”)

puts “*************| 上传蒲公英成功!|*************”

end
end

使用方法
1,cd到项目.xcworkspace目录

$ fastlane automaticPackagingUpload

2,在桌面fastlaneBuild目录下生成对应的.iap文件

ipa 文件上传到蒲公英后通知其他人
如果开发者想让 Jenkins 打包并上传 ipa 文件到蒲公英后,自动通知其他人(常用于通知 App 相关的测试者),那么可以利用蒲公英的通知功能。蒲公英本身已经支持了邮件通知、短信通知、微信通知。具体设置方法可以点击这里查看: 接收应用更新通知

八,后序

把一件事写明白,煞费苦心,如果你阅读了本文章,有什么问题欢迎交流,简书会不定期更新,喜欢的可以点关注❤️

30.jpg
九,参考链接

使用 Fastlane 上传 App 到蒲公英 (官方文档)
Git钩子:自定义你的工作流 (推荐阅读)
OC静态代码检查及持续集成(xcode analyzer+oclint+xcpretty)
自动化工具Fastlane: 安装, 打包,上传(testFlight,app store)
iOS自动化打包发布(Jenkins + Fastlane + GitLab + 蒲公英)
自动化测试定时构建---Jenkins时间轮询配置
Jenkins 定时构建
关于Mac上部署Jenkins的一些个人习惯
APP主题测试自动化:Fastlane篇

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

推荐阅读更多精彩内容