内容简介:Jenkins+Fastlane+Github内网测试
很久没写文章了,确实觉得也没什么可写的,最近一直研究自动化打包,遇到了一些问题也解决了一些,就准备写一下这个心得吧。
为什么要采用这一种自动化打包方式呢?
可能看到这一篇文章很多人认为 Jenkins
就可以实现自动化打包,并且 Fastlane
配置 完毕之后打包更加的轻松。干嘛还搞在一起,这不是重复了吗。
可能 Jenkins
对于一般的工程,可能配置不太复杂十分的可行,并且一些打包完毕上传到 Fir.im 进行 App 的托管的确十分的方便。
我在之前的公司的确是把所有的 App 的都托管在 Fir.im 上面,让测试人员自己进行打包下载安装。
但是,但是,这已经不符合我们现在 App 打包和不满足测试人员进行安装的需求了。
之前在我们公司不用的 Mac mini
上面搭建了 Jenkins
环境,确实当时还用了一段时间。
最后随着工程每次打包或者运行都需要更改 谷歌统计
和 Branch
统计的 Key ,因为是配置在打包的 Plist 文件里面的,所以在代码无法进行修改。
我为了防止打包的环境出现测试和正式配置错乱,就做了初始化环境配置的判断。 如果判断出来环境配置不符合运行的规则就直接提示用户配置错误,无法继续的运行。
虽然这个功能是好的,但是为此每次打包和运行都引来很多的麻烦。稍微不注意打包的环境可能没改过来,就直接不能运行。
辛辛苦苦编译之后打包安装,花费了多少心血,浪费我多少时间,竟然配置错误了。
为此我做了一款更改环境配置的软件,之前的文章有说起过。问我为什么不写脚本写 Mac 软件
。因为我除了熟悉 Objective-C
和了解 Swift
对于其他的语言完全不会呀,我只想静静。
环境配置切换的软件做出来了,配置好了。前期确实很好用,最后缺点还是一点点的暴露出来了。
在测试阶段还好,测试人员顶多过来让你打最新的测试包。但是到了后台上线的时候,为了测一下不影响 iOS
现在线上的版本。
测试人员就过来跑到我们的面前。
给我打一个 1.5.1 版本的 c 分支的包!
给我打一个 1.5.1 版本的 trunk 分支的包!
给我打一个 1.5.1 版本的 预发布 包!
……!
测试,你烦人不,烦人不,别跑呀!看我不打断你的腿!
为了不因为分支频繁的打包,我做了可以在程序内部进行 切换分支 和 测试切换到预发布 的功能。
其实这个功能早在去年十月份我请假回家那一天上午就做好了,但是最近又优化了功能。
做好之后再也没听到测试要打那个 分支 ,要打 预发布 的包的话了。
虽然现在的打包需求变成了只用打 测试 和 预发布 环境的安装包,但是我觉得还是很烦,毕竟每次打包都需要几分钟,那还是在我 这个 拥有下面配置的机器上面。
我觉得还是很烦,觉得还是很影响我安静的敲代码,因为我是一个懒人,能用 工具 做的绝不自己弄。
当时想着利用 Jenkins
进行打包之前写一个 Shell
脚本替换环境的配置,为此我那段时间还专门看了 Shell
的入门教程,最后我放弃了。
为了这么小的需求还要专门学一下 Shell
,我觉得代价有些大,就只看了简单的语法就到此结束了。
看来 Jenkins
这条路已经在我这边行不通了,难道就没有其他的方案可以解决掉我们现在的问题吗?
之前还想把 Fir-Ci
打包的命令和我需要打包一套功能做成一个客户端,方便我进行打包。
但是因为我竟然没找到怎么在 NSTask
执行 Sudo 命令和自动输入密码,最后这个方案也是结束了。
在我准备放弃自动化打包这个念头的时候,这个时候不知道从什么地方听到了 Fastlane
这个自动化打包的名词。
我看了 Fastlane
是上万星的时候,我仿佛看到了希望之光。上万星,这说明主要的公司和大部分的开发者都在用这个进行打包。
以后用 Fastlane
进行打包成为主流的打包方式,我觉得学习一下。最后还真的找到了插件可以在打包之前修改我们的配置 Key 。
但是 Fastlane
的安装和配置真实一路的血和泪,因为我安装的是 zsh
的脚本命令替换掉了 bash
系统自带的命令,导致 Fastlane
会打包失败。那是之后的事情了。
因为使用 Fastlane
我才又一次接触 Fabric
这个软件的。之前我还仅以为这只是用来统计崩溃和发布 APP 的软件。
没想到 Fastlane
竟然是也是这个公司出的,棒棒的!我把打好的包托管上了 Fabric
这个平台上面,但是测试反应下载 APP 是特级慢,特级慢!
我之前经常搭建企业安装的环境,无非就是 点击安装转接到 Plist 的地址,从 Plist 读取 Ipa 的安装路径进行安装。
不过从 iOS7
开始必须让 Plist 是正规的地址,不然无法进行安装。
搭建本地安装 ipa 的环境
-
我们前往
MAMP
的官方网址: MAMP -
我们下载免费版本
MAMP
: 免费版本 MAMP 下载地址 -
点击
MAMP
软件运行
还可能需要修改的地方
为了防止不和其他的服务端口进行冲突,我们修改一下端口。
MAMP
-
点击配置的端口界面
我这边设置上面的端口,其实端口你们可以随便的定义,只要不进行冲突就可以了。
搭建 Jenkins 服务
使用如下的命令进行安装
1brew install jenkins
启动
1jenkins
现在有个问题当执行 Jenkins
的终端关闭之后 Jenkins 服务 也就停止了,我也没去研究怎么让服务开机启动不随着中断关闭。
对于 Jenkins
安装我也不多说了,可以自己去 谷歌
和 百度
也可以参考下面一位简书大神的文章 Mac 安装 Jenkins
安装 Fastlane
-
前往
Fastlane
的项目地址 -
按照下面的教程进行安装
配置Fastlane(参考我公司项目)
-
在终端
cd
到项目的主目录1cd xxx
-
执行
fastlane init
安装安装的步骤配置完毕之后就自动在工程的目录生成 fastlane
的文件夹了。
对于 Fastlane
安装不太了解的,也可以去百度和谷歌。
-
打开
Fastlane
目录下面的 Fastfile 文件,可以用记事本打开,也可以用其他的编辑软件,这里我推荐Github
出的Atom
编辑器。 -
删除自动生成的代码
-
配置测试和线上两种环境
1lane :beta do |values|2 increment_build_number3 test_key4 archiveipa "Debug"5end67lane :applive do |values|8 increment_build_number9 kive_key10 archiveipa "Release"11end
对于还有其他环境的可以自动的进行配置 其实语法应该还是挺简单的,对于我这个没学过 Ruby 的都写出来了,不相信你写不出来。
increment_build_number这个是让每次打包让编译号自动的+1.
-
配置
CURRENT_PROJECT_VERSION
字段前往 Target->Build Setting->current project version字段设置为当前的 Build 号我设置是正整数简单。
-
设置环境配置的环境
1def test_key2 set_info_plist_value(key:"branch_key", value:"xxxxxx", path: "./GearBest/Info.plist")3 set_info_plist_value(key:"TRACKING_ID", value:"xxxxxx", path: "./GearBest/Others/GoogleService-Info.plist")4end56def kive_key7 set_info_plist_value(key:"branch_key", value:"xxxxxx", path: "./GearBest/Info.plist")8 set_info_plist_value(key:"TRACKING_ID", value:"xxxxxx", path: "./GearBest/Others/GoogleService-Info.plist")9end
我们设置
test_key
和kive_key
两个方法用于每次打包进行正确的配置,解决了我们每次打错环境包的问题。一定要配置好
path
的路径,不然无法配置正确。 -
设置快速切换配置的环境
1lane :test_key_configuration do |values|2 test_key3end45lane :live_key_configuration do |values|6 kive_key7end
这样方便我们开发自己撸代码的时候十分切换配置环境 还十分快速。
-
配置打包
1def archiveipa(configuration)2 build_number = get_build_number(xcodeproj: "GearBest.xcodeproj") #获取当前的 Build 号码3 version = get_version_number(xcodeproj: "GearBest.xcodeproj") #获取当前的版本号4 output_directory = "/Applications/MAMP/htdocs/ipa/"+configuration+"/GearBest_" + version + "_" + build_number #导出打包文件和 ipa 的目录5 output_name = "GearBest_temp" #导出的ipa 的名字6 gym(scheme: 'GearBest', export_method: 'ad-hoc', configuration: configuration, output_directory: output_directory, output_name:output_name, clean:true) # 进行打包7end
导出到我们
MAMP
服务的地址和生成对应版本和 Build 目录是为了方便进行自动发布
新建Jenkins 项目
-
新建一个项目
名字不要包含%%特殊的字符串,防止影响我们自动上传软件的使用。
-
配置项目
配置好我们的 SVN 地址这个其实很简单的。
-
新建一个构建
Shell
脚本1#!/bin/bash23#rm -rf /Users/zhangxing/Library/Developer/Xcode/DerivedData/* #这个本来是想打包之前清理 DerivedData 数据的但是清理会影响我本地其他项目 就屏蔽了4fastlane beta #执行打测试包 需要打其他环境请复制一份修改这里即可。5cd /Applications/MAMP/htdocs #前往 MAMP服务的文件夹6touch "jenkins%%${JOB_NAME}%%${BUILD_NUMBER}" #生成最新打包的配置文件7open /Applications/IPIPA.app #打包自动上传的 APP8sleep 60 #休眠60秒等待 APP 执行完毕
保存等待全部配置完毕执行即可。
在 Github 新建一个存放 Plist 文件的项目。
在 Github
项目新建项目我就不多说了。
-
Clone
项目到MAMP
的主目录
配置 MAMP目录
-
存放
Icon
图片把 57x57 和 512x512 的图片保存在
MAMP
服务的主目录 /Applications/MAMP/htdocs -
新建
ipa
目录存放在 /Applications/MAMP/htdocs 目录 -
保存
mainfest.plist
文件到主目录
写自动化上传软件
软件源代码不小心删除了。
唉!
唉!
唉!
下面说一下软件逻辑的实现吧。
当时考虑怎么让打包完毕之后让自动生成 Plist 上传最新的 Plist 到 github 目录之后生成最新的下载地址。
我当时考虑用 php
或者用 Swift
的第三方库做一个接口,打包完毕发送一个请求服务器做处理。
考虑到自己 php
是菜鸟, Vapor
自己又不精通就放弃了,准备再次写一个 Mac 的应用程序
。
当我们执行 open /Applications/IPIPA.app
会打开我们写的应用程序 我们就可以写一些处理的逻辑了。
根据刚才的创建文件的命令
1touch "jenkins%%${JOB_NAME}%%${BUILD_NUMBER}"
我们查询 /Applications/MAMP/htdocs
目录下面是否存在 jenkins%% 开头的文件,没有说明不存在最新的打包 我们直接重新生成本地现有即可。
我们利用字符串分割 %%
分割为三部分,读取出最近打包的 项目名称
和 打包的编译号
删除 jenkins%%
文件。
我们查找 /Applications/MAMP/htdocs/ipa
目录是否存在 GearBest_temp.ipa
的文件如果存在就是最新打包的 ipa
.
我们在 GearBest_temp.ipa
上层文件夹 /Applications/MAMP/htdocs/ipa/Debug/GearBest_1.5.1_244
找到是 Debug
还是 Release
的包。并且解析安装包的 版本
和 编译号
。
我们使用 Copy
命令用 NSTask
执行一个简单的 Shell
脚本把 /Applications/MAMP/htdocs/mainfest.plist
的文件复制到 GearBest_temp.ipa
的同级目录。
1copy $1 $2
利用查找出来的信息 替换到 mainfest.plist
里面的 {version}
和 {ipa}
字段。重新命名 Plist
为 GearBest_版本号_编译号.plist
在 GearBest_temp.ipa
复制一份 ipa
命名为 GearBest.ipa
删除 GearBest_temp.ipa文件
复制我们的配置 Plist
到 /Applications/MAMP/htdocs/iPiPa/plist
目录。
执行上传脚本
1 cd /Applications/MAMP/htdocs/iPiPa2 git add .3 git commit -m "change"4 git push
请一定要用 SSH
进行 Clone
并且配置你的 SSH key
我们上传完毕 用同步获取最新的 Log 信息。
获取 Log 的地址 http://ip 地址:端口/job/项目名称/ Build 号/api/json?pretty=true
如果项目名称有中文一定要 URL Encode
我们把当前打包的 APP 下面信息 存放在 类里面用于保存
-
App
名称 -
版本号
-
Build
号 -
Jenkins
对应项目名称 -
Jenkins
对应的Build
号 -
Plist
的Raw
地址 -
打包的
Log
信息。
我们可以利用 Model
转 Json
存在本地 每次重新生成安装界面从本地读取之后生成安装的 Html
存在到我们 MAMP
的主目录即可。
sleep 60 #休眠60秒等待 APP 执行完毕 让 Jenkins
强行的休眠60秒是等待我们的软件执行完毕。
之前没注意 发现我们的软件没走完就停止了。
可能大家看完听得云里雾里,不止所云。我之后有时间把自动化上传软件再次写一遍 开源,这样大家就可以部署一下。
说一下这样部署的优点吧。
-
使用
Jenkins
服务可以让测试人员自己打包 想什么时间打什么时间打 -
使用
Fastlane
可以让其他的版本公用一套 配置 -
使用
MAMP+Github
可以让测试人员通过内网瞬间安装。
我们现在 Fastlane
在自己电脑,导致每次打包都会很卡。希望公司贡献一台测试机出来就好了。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Flutter 学习之路 - 测试(单元测试,Widget 测试,集成测试)
- itest(爱测试)接口测试&敏捷测试管理 7.7.7 发布,接口测试重大升级
- 性能测试vs压力测试vs负载测试
- SpringBoot | 第十三章:测试相关(单元测试、性能测试)
- 敏捷测试VS传统测试对比,6招玩转敏捷测试!
- itest(爱测试)接口测试&敏捷测试管理平台 8.1.0 发布
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
算法竞赛入门经典(第2版)
刘汝佳 / 清华大学出版社 / 2014-6-1 / CNY 49.80
《算法竞赛入门经典(第2版)》是一本算法竞赛的入门与提高教材,把C/C++语言、算法和解题有机地结合在一起,淡化理论,注重学习方法和实践技巧。全书内容分为12 章,包括程序设计入门、循环结构程序设计、数组和字符串、函数和递归、C++与STL入门、数据结构基础、暴力求解法、高效算法设计、动态规划初步、数学概念与方法、图论模型与算法、高级专题等内容,覆盖了算法竞赛入门和提高所需的主要知识点,并含有大量......一起来看看 《算法竞赛入门经典(第2版)》 这本书的介绍吧!