0%

Jenkins+Fastlane集成打包iOS项目

jenkins_fastlane

笔者实验环境

  • OS:macOS High Sierra Version 10.13.6
  • Java:Java SE 8u181
  • Fastlane:2.101.1
  • Jenkins:2.121.2
  • iTerm2:Build 3.1.7

1.安装Fastlane

Fastlane可以自动化打包iOSAndroid项目,代替了Xcode的打包过程,官网地址Fastlane,项目是基于Ruby的,安装流程如下:

  • xcode-select --install(一般都已经安装好了,可以直接跳过)
  • [sudo] gem install fastlane -NV(如果没有权限,添加参数[sudo] gem install -n /usr/local/bin fastlane -NV)

安装之后到项目根目录下进行初始化

  • fastlane init
  • fastlane init swift(Swift项目初始化)

期间需要需要输入账号和密码,然后会生成文件Gemfile和文件夹fastlaneGemfile文件内容为:

1
2
3
4
source "https://gems.ruby-china.com"

gem "cocoapods"
gem "fastlane"

地址改为国内镜像,因为用了CocoaPods集成第三方包,添加支持。fastlane文件夹下生成了AppfileFastfile两个文件,前一个保存账号信息,后一个文件为配置信息,我们接下来主要添加操作命令道该文件,先看官网示例:

1
2
3
lane :release do
build_app(scheme: "MyApp")
end

上面这个就是最简单的打包命令,其中build_app属于fastlaneaction,在每个任务里面都是各种action组成的,可以通过fastlane action命令查看所有的action,比较常用的是:

1
2
3
cert
sigh
gym

具体可以查看官网文档库,里面针对每个参数都有详细的说明,如gym文档地址包括各参数,记得千万要自己去看看最新的这些,因为找网上的许多文档可能已经比较久了,没有更新及时,导致有些参数过时或者新的版本一些必要参数缺失。记得需要修改编码为UTF-8,虽然不影响但在执行的时候会报错:

1
2
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8

可以加载环境变量或者每次执行命令之前也可以执行,环境变量里面为~/.bashrc, ~/.bash_profile~/.zshrc,根据你自己的环境而定,然后source ~/.xxxx即可生效。

下面以一个打包AppStore版本示例说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
lane :release do
gym(
clean: true,
include_bitcode: false,
export_method: "app-store",
buildlog_path: "../release",
output_directory: "../release",
export_options: {
provisioningProfile: {
"cn.33.lee.StarSuns" => "StarSunLee_release",
}
}
)
end

其中export_method即表示需要打包那种包,包括app-store, ad-hoc, package, enterprise, development,developer-id,两个路径分别表示编译和导出路径,之后日志和一些中间生成的文件以及导出的包都会出现该路径下,export_options里面参数为证书名称,其中StarSunLee_release表示你在苹果开发者中心创建的证书名称,然后在项目里面执行命令构建命令:

1
fastlane release

这样就可以自动构建版本、打包、导出,最后会在../release目录下出现XXX.ipa文件就可以上传到苹果开发中心去了,当然这里还有个actiondeliver直接将文件上传到App Store去,因为我们后面要用Jenkins持续集成这里不做下一步处理。

2.安装Jenkins

Jenkins为自动化集成项目,官网地址,下载地址,这里两种版本,长期支持版本LTS和周更新版本Weekly,最后不要下载最新的,笔者系统环境是Mac,安装之后出现各种问题毅然放弃了,因为需要Java支持,这里列出版本:

  • Java版本为8,下载地址
  • Jenkins版本为2.121.2,直接下载war

下载完成之后启动Jenkins命令为:

1
java -jar jenkins.war --httpPort=8080

其实在Mac还可以下载pkg文件直接安装,brew也可以安装,但是因为其他各种坑原因这种直接命令启动方式最靠谱,如果要后台运行nohup java -jar jenkins.war --httpPort=8080 &即可,或者使用supervisord进行管理。启动Jenkins后会在用户目录下~/.jenkins进行解压和配置文件,之后工作目录也在此,在浏览器打开地址http://127.0.0.1:8080/即可进入Jenkins配置界面,其中密码放在~/.jenkins/secrets目录下,之后即可进入工作界面。

3.集成配置

Jenkins每个任务成为Item,新建Item即可,因为代码放在自检系统gitlab上面,首先需要进行ssh key配置,这样就可以不需要输入密码直接获取代码,打开菜单Credentials,然后选择Global credentials (unrestricted),点击Add Credentials,如下图所示在红色框分别输入名称和本地SSH Key,内容文件夹~/.ssh/id_rsa私钥信息,对应的公钥id_rsa.pub需要保存在gitlab上面才可以免密获取到代码。
Add Credentials
接下来新建Item,输入任务名称然后选择Freestyle project,然后ok到下一步,其中主要配置的源代码和构建脚本,如下图所示:

code

只要填写gitlab地址和选择分支即可,然后就是构建脚本,如下图所示:

code

其中的fastlane adhoc就是之前建立的打包命令,后面跟着的curl命令是把ipa文件直接发布到蒲公英,就实现了自动化集成,当然这里展示的是最基本的使用方法。

4.注意事项

  • 在安装Jenkins的时候,其实可以使用Mac系统的pkgbrew模式,但是因为配置文件导致很麻烦,出现的问题也较多,所以还是选择最原始方法直接命令启动。
  • Jenkins兼容问题:因为目前的LTS版本只支持Java 8,之前直接下载了Java 10,然后下载了Weekly版本,导致插件无法安装,最后放弃,不再使用最新版本做小白鼠了。
  • Fastlane在打包过程中可能会多次出现错误,不过只要Xcode能够打包就可以,大部分都是因为签名证书问题,这个在certsigh两个action配合起来,直接强制重新签名即可,只在第一次需要,然后就可以查看开发者中心的证书名,修改Fastlane配置文件,指定名称即可。
  • 另一个是关于在Linux服务器去集成打包iOS项目,最好别!老老实实拿Mac电脑!

小结

本文只是展示了最基本的使用方法,在实际生产环境中打包需要许多相关配置参数才能构建,如版本号和各项目证书都需要处理好才能达到整个公司各项目的持续集成。后续继续更新一些高级特性和使用方法。