本文将教会你:(MAC OS)
- 利用 Jenkins 和 fastlane 实现 iOS 项目的自动构建
- 自动打包 iOS 的 ipa 文件并自动上传到蒲公英
注:本文的操作环境在 Mac OS 10.12 中进行。Jenkins 的版本是 2.19.1,fastlane 的版本是 2.28.2
安装 fastlane
fastlane 是一个快速将 iOS 项目打包成 ipa 文件的工具。要安装 fastlane,请参考 fastlane 在 Github 上的的官方文档
brew install fastlane
或者
一、安装xcode命令行工具
xcode-select --install
,如果没有安装,会弹出对话框,点击安装。如果提示xcode-select: error: command line tools are already installed, use "Software Update" to install updates
表示已经安装
这里可能会报错:xcode-select –install安装失败不能安装该软件 因为当前无法从软件更新服务器获得
如果你现在在观看这篇文章相信有很大的一部分原因是因为你也遇到了跟我一样的问题“不能安装该软件 因为当前无法从软件更新服务器获得“这是xcode的命令行工具无法安装 这时候我在网上找了很多教程有些说是路径的问题,而我试了很多都没有找到一个好的解决办法,最终在国外的一个网站下面的评论上找到了解决办法。
只需要去这个地址https://developer.apple.com/download/more/ 中间还需要你登陆一下
在左边的搜索框中搜索Command Line Tools 然后回车
将其中适合你电脑版本的那个下载下来安装好即可。
然后再去安装homebrew 既可以顺利安装。
二、安装Fastlane
sudo gem install fastlane -NV
或是brew cask install fastlane
我这里使用gem安装的
安装完了执行fastlane --version
,确认下是否安装完成和当前使用的版本号。
三、初始化Fastlane
cd到你的项目目录执行
fastlane init
init
这里会弹出四个选项,问你想要用Fastlane做什么? 之前的老版本是不用选择的。选几都行,后续我们自行根据需求完善就可以,这里我选的是3。
如果你的工程是用cocoapods的那么可能会提示让你勾选工程的Scheme,步骤就是打开你的xcode,点击Manage Schemes,在一堆三方库中找到你的项目Scheme,在后面的多选框中进行勾选,然后rm -rf fastlane
文件夹,重新fastlane init
一下就不会报错了。
not found scheme
接着会提示你输入开发者账号和密码。
[20:48:55]: Please enter your Apple ID developer credentials
[20:48:55]: Apple ID Username:
登录成功后会提示你是否需要下载你的App的metadata。点y等待就可以。
如果报其他错的话,一般会带有github的相似的Issues的链接,里面一般都会有解决方案。
四、文件系统
初始化成功后会在当前工程目录生成一个fastlane文件夹,文件目录为下。
fastlane
其中metadata和screenshots分别对应App元数据和商店应用截图。
Appfile主要存放App的apple_id team_id app_identifier等信息
Deliverfile中为发布的配置信息,一般情况用不到。
Fastfile是我们最应该关注的文件,也是我们的工作文件。
Fastfile
Fastfile
之前我们了解了action,那action的组合就是一个lane,打包到蒲公英是一个lane,打包到应用商店是一个lane,打包到testflight也是一个lane。可能理解为任务会好一些。
安装 Jenkins
centos环境:
centos下搭建Jenkins持续集成环境(安装jenkins)
1、安装JDK
yum install -y java
2、安装jenkins
添加Jenkins库到yum库,Jenkins将从这里下载安装。
1 wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
2 rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key
3 yum install -y jenkins
如果不能安装就到官网下载jenkis的rmp包,官网地址(http://pkg.jenkins-ci.org/redhat-stable/)
1 wget http://pkg.jenkins-ci.org/redhat-stable/jenkins-2.7.3-1.1.noarch.rpm
2 rpm -ivh jenkins-2.7.3-1.1.noarch.rpm
配置jenkis的端口
vi /etc/sysconfig/jenkins
找到修改端口号:
JENKINS_PORT=”8080” 此端口不冲突可以不修改
3、启动\jenkins**
service jenkins start/stop/restart
- 安装成功后Jenkins将作为一个守护进程随系统启动
- 系统会创建一个“jenkins”用户来允许这个服务,如果改变服务所有者,同时需要修改/var/log/jenkins, /var/lib/jenkins, 和/var/cache/jenkins的所有者
- 启动的时候将从/etc/sysconfig/jenkins获取配置参数
- 默认情况下,Jenkins运行在8080端口,在浏览器中直接访问该端进行服务配置
- Jenkins的RPM仓库配置被加到/etc/yum.repos.d/jenkins.repo
Mac
1> 安装Homebrew
/usr/bin/ruby -e”$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
2> 安装Jenkins
brew install jenkins
此时会提示:
Updating Homebrew…jenkins: Java1.8is required to installthisformula.JavaRequirement unsatisfied!You can installwithHomebrew-Cask:
brew cask install homebrew/cask-versions/adoptopenjdk8
You can downloadfrom: https://www.oracle.com/technetwork/java/javase/downloads/index.html Error: An unsatisfied requirement failed this build.
3> 安装上面的提示安装Java
brew cask install homebrew/cask-versions/adoptopenjdk8
安装完成后再次执行步骤2的命令,安装成功后会提示:
Note: Whenusinglaunchctl the port will be8080.To have launchd start jenkins nowandrestart at login: brew services start jenkinsOr,ifyou don’t want/need a background service you can just run: jenkins
4> 启动Jenkins,然后在浏览器中输入http://localhost:8080
brew services start jenkins
5>获取初始密码
sudo cat /Users/Shared/Jenkins/Home/secrets/initialAdminPassword
6> 停止Jenkins
brew services stop jenkins
用brew安装的的Jenkins
修改默认端口的方法:
- 打开文件 vi /usr/local/opt/jenkins/homebrew.mxcl.jenkins.plist
- 修改默认端口号
- 启动jenkins: brew services start jenkins
- 停止jenkins:brew services stop jenkins
- 重启Jenkins:brew services restart jenkins
- 更新:切换到目录cd ~/.jenkins,然后用最新下载的war包替换文件夹中的war
自动化构建设置
在 Jenkins 中,所有的任务都是以“item”为单位的。接下来我们就新建一个 iOS 的项目来开始自动化构建。点击“新建”,输入 item 的名称,选择“构建一个自由风格的软件项目”,然后点击“OK”。
然后按下图设置构建信息:
源码管理:
这里主要是设置源码的仓库,以便让 Jenkins 知道我们的 iOS 项目的代码在哪里。因为我的代码放在自己搭建的 GitLab 仓库中(如果你用 Github 等其他仓库也是类似),所以要先告诉 Jenkins 如何获取代码。首先,我们需要配置 SSH,我们可以在 Jenkins 的证书管理中添加 SSH。在 Jenkins 管理页面,选择“Credentials”,然后选择“Global credentials (unrestricted)”,点击“Add Credentials”,如下图所示,我们填写自己的 SSH 信息,然后点击“Save”,这样就把 SSH 添加到 Jenkins 的全局域中去了。
接下来,我们再回到刚刚新建的任务中,在源码管理中,选择 Git,按下图填好相关信息。注意:Credentials 不需要选择。
构建触发器设置
因为此教程不涉及自动测试这块的流程,所以不需要设置触发器。
构建环境设置
这里我们是直接用 fastlane 这个工具,所以这里不需要特别设置。fastlane 会自动读取本地 iOS 项目中设置的签名等信息,所以需要保证本地 iOS 工程已经设置好了正确的签名信息和 Provisioning Profiles 等文件,并在 keychain 中已经加入了正确的证书。否则后续的操作中可能会出现错误。如果这里没有设置好,请用 Xcode 打包工程进行相关设置即可。
- 脚本设置
这一步主要用来打包 ipa 并上传到蒲公英。我们点击“增加构建步骤”,选择 “Execute Shell”。输入下列脚本:
IPANAME="jinkens-myapp"
fastlane gym --export_method ad-hoc --output_name ${IPANAME}
curl -F "file=@${IPANAME}.ipa" -F "uKey=USER_KEY" -F "_api_key=API_KEY" https://qiniu-storage.pgyer.com/apiv1/app/upload
注意:
- 其中,USER_KEY 和 API_KEY 可以在蒲公英的「账户设置」中找到,之后进行相应替换。
- export_method 可以根据打包类型进行相应设置。可选的值有:
app-store
、ad-hoc
、development
、enterprise
。对于 Xcode 8.3 以下的版本,则不需要设置export_method
。
设置好之后,类似界面如下所示:
最后点击最下面的 Save 按钮来保存所有设置。这样我们就简单的实现了自动打包,并上传到蒲公英的所有配置了。
接下来,我们可以测试一下。点击项目页面左侧的 Build Now,我们可以看到项目已经开始构建。在 Console Output 中,我们可以看到项目已经成功构建,并自动上传到了蒲公英。
Started by user root
Building in workspace /Users/rexshi/.jenkins/workspace/monitor
> git rev-parse --is-inside-work-tree # timeout=10
Fetching changes from the remote Git repository
> git config remote.origin.url http://git.xxx.com/root/monitor.git # timeout=10
.......
[15:03:28]: $ xcodebuild -list -project ./monitor.xcodeproj
[15:03:30]: $ xcodebuild clean -showBuildSettings -scheme monitor -project ./monitor.xcodeproj
[15:03:32]: Building monitor/monitor [Release]
[15:03:32]: Check Dependencies
[15:03:32]: Compiling AppDelegate.m
[15:03:33]: Compiling main.m
[15:03:38]: Touching monitor.app
......
[15:03:41]: Successfully exported and compressed dSYM file
[15:03:41]: Successfully exported and signed the ipa file:
[15:03:41]: /Users/rexshi/.jenkins/workspace/monitor/jinkens-myapp.ipa
+ curl -F file=@jinkens-myapp.ipa -F uKey=4a5bc52e6763795e18b69bd82dd23xxx -F _api_key=7f158b3d9063c73cd68f0ee40215xxxx https://qiniu-storage.pgyer.com/apiv1/app/upload
{"code":0,"message":"","data":{"appKey":"602979def164c47b9570f17656a4fxxxx","userKey":"4a5bc52e6763795e18b69bd82dd23xxx","appType":"1","appIsLastest":"1"
......
Finished: SUCCESS
- 使用 jenkins 插件上传 apk 到蒲公英点击查看使用方法
进阶用法
如果你只是想满足基本都持续集成,那么看到这里就可以了。但是,如果你想有一些更丰富的定制化功能,可以继续往下看。
上传到蒲公英时设置更新说明、访问密码
这里,假如我们想让 ipa 文件上传到蒲公英后,将 git 上最后一次提交的注释设置为蒲公英的更新说明,并且设置访问密码为 123456
,那么可以将上面最后一步时的 shell 程序改成这样:
IPANAME="jinkens-myapp"
fastlane gym --export_method ad-hoc --output_name ${IPANAME}
MSG=`git log -1 --pretty=%B`
PASSWORD=123456
curl -F "file=@${IPANAME}.ipa" -F "uKey=USER_KEY" -F "_api_key=API_KEY" -F "updateDescription=${MSG}" -F "password=${PASSWORD}" https://qiniu-storage.pgyer.com/apiv1/app/upload
ipa 文件上传到蒲公英后通知其他人
如果开发者想让 jenkins 打包并上传 ipa 文件到蒲公英后,自动通知其他人(常用于通知 App 相关的测试者),那么可以利用蒲公英的通知功能。蒲公英本身已经支持了邮件通知、短信通知、微信通知。具体设置方法可以点击这里查看:接收应用更新通知
常见问题
出现 fastlane: command not found 怎么办?
解决方法一:这个情况一般是由于 jenkins 没有设置正确的 $PATH 环境变量导致的。正确设置的方法为:
- 在命令行下执行
echo $PATH
,记录下输出的结果 - 在 jenkins 中
系统管理
-系统设置
中,找到环境变量(Environment variables)
- 在 key 中填写
PATH
,在 value 中填写第一步中输出的结果 - 保存即可。
解决方法二:请确认您安装 Jenkins 的方式和我们在本文里推荐的方式一致。使用其他方式安装的 Jenkins 也经常会出现此问题。
https://www.jianshu.com/p/5d836e89d9d1
fastlane test desc:测试打包
其中test应该改为您的命名:如我的是custom_lane
fastlane custom_lane desc:测试打包