概述
持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。
集成条件
- 同一网段,局域网或外网
- 配置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,复制到资源库目录下
3.2,cd 到Tomcat文件的bin目录下,给sh文件赋予管理员权限,按提示输入密码
$ sudo chmod 755 /Users/用户名/Library/Tomcat/bin/*.sh
3.3, 然后执行
$ sudo sh startup.sh
3.4,浏览器输入 localhost:8080 打开页面如下,即安装成功!
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构建的项目存放的路径"
3.7,设置完毕上面的环境变量,可使用如下命令操作tomcat
$ sudo sh startup.sh (启动tomcat)
$ sudo sh shutdown.sh (关闭tomcat)
3.8,下载war,将war文件移动到Tomcat文件夹的webapps目录下
3.9,打开链接 localhost:8080/jenkins/ 启用Jenkins,等待大概两分钟左右就启动完成了
开启secrets目录权限,
$ sudo chmod 755 /Users/用户名/.jenkins/secrets
然后如下图打开initialAdminPassword,复制密码粘贴到文本框中
3.10,选择左侧的选项,安装jenkins推荐的插件就可以了
3.11,等待大概10分钟左右就安装完成了
3.12,输入对应信息,防止忘记你可以使用你电脑的名称与密码,注意密码忘记了你只能重装Jenkins
3.13,点击开始使用Jenkins按钮
四,配置Jenkins
4.1,大功告成!点击创建一个新任务
4.2,输入项目名称,选择第一项构建一个自由风格的软件项目,点击OK,有时候出现加载中的情况,多刷新几次页面即可
4.3,输入描述信息,项目构建久了会有很多老旧的构建不需要,一个个删除比较麻烦,初始化项目可设置丢弃旧的构建选项,填写保持构建的天数,保持构建的最大个数,这里设置保持7天,最大构建个数为30
4.4,点击上方源码管理菜单,选中Git选项
Repository URL:项目地址
Branch Specifier (blank for 'any') :分支,默认为master,这里设置的develoepr
4.5,若你的Repository URL地址为SSH,你需要点击Credentials 右侧 的Add按钮,然后选中Jenkins选项配置SSH公钥
Kind选项,如下图所示选择SSH
4.6,选中 Private Key 的Enter directly 按钮,输入用户名与SHH公钥,点击Add
4.7,选中你所添加的用户秘钥,然后点击最下方保存按钮
4.6,添加shell脚本
选择上面的构建菜单,点击底部增加构建步骤,选择第二项 Execute shell
输入如下脚本
#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,值填入复制输出的值
4.8,定时构建
选择上面的构建触发器菜单
Build periodically选项:
定时触发构建,输入H */1 * * *
H */1 * * * (H */1 表示每小时任意分钟执行一次)
Poll SCM (poll source code management) 选项
轮询源码管理,需要设置源码的路径才能起到轮询的效果。一般设置为类似结果: 0/5 每5分钟轮询一次
点击保存,回到主界面点击立即构建,点击#1可查看第一次构建的信息
进入点击 左侧Console Output 查看日志,这里显示打包上传蒲公英成功!
4.9,自动化构建
4.9.1,点击最上方Jenkins头像,回到主页面,点击主页面的系统配置按钮
4.9.2,点击第六项,管理插件
4.9.3,选中可选插件选项,依次安装插件
- Gitlab Hook Plugin
- GitLab Plugin
- Build Authorization Token Root Plugin
4.9.4,安装到最后一项的时候,勾选安装完成后重启Jenkins,重启后需要重新登录,可选中在这台计算机上保持登录状态
4.9.5,重新进入项目的配置页面,选择上面的构建触发器菜单
- 勾选Build when a change is pushed to GitLab. GitLab CI Service URL选项
- 勾选触发远程构建 (例如,使用脚本)选项,在终端输入如下命令,获取Token令牌,填入身份验证令牌文本框
$ openssl rand -hex 12
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地址。 这是一个通用的解决方案,用户可以自己根据不同的需求,来编写自己的脚本程序(比如发邮件,自动部署等),例如你提交代码到仓库,钉钉上会有消息通知,也是通过钩子实现的。
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,去掉勾选防止跨站点请求伪造功能即可
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 相关的测试者),那么可以利用蒲公英的通知功能。蒲公英本身已经支持了邮件通知、短信通知、微信通知。具体设置方法可以点击这里查看: 接收应用更新通知
八,后序
把一件事写明白,煞费苦心,如果你阅读了本文章,有什么问题欢迎交流,简书会不定期更新,喜欢的可以点关注❤️
九,参考链接
使用 Fastlane 上传 App 到蒲公英 (官方文档)
Git钩子:自定义你的工作流 (推荐阅读)
OC静态代码检查及持续集成(xcode analyzer+oclint+xcpretty)
自动化工具Fastlane: 安装, 打包,上传(testFlight,app store)
iOS自动化打包发布(Jenkins + Fastlane + GitLab + 蒲公英)
自动化测试定时构建---Jenkins时间轮询配置
Jenkins 定时构建
关于Mac上部署Jenkins的一些个人习惯
APP主题测试自动化:Fastlane篇