站在996的风口浪尖上,百度,google,查阅各种资料博客后,历经40次的构建终于用jenkins在MAC上实现了iOS App的CI(持续集成)一键上传App到蒲公英,网上资料很多老旧或者不够完善或者坑比较多,于是乎本人踩了一个又一个的坑才爬了起来,于是乎今天就贴个比较完善的,让大家尽量少踩坑,尽快实现一个CI(持续集成)的Jenkins部署,如果觉得本文不错别忘记点赞哟!!
首先要准备的case
一台MAC,原因是iOS打包无法在Linux上进行,因为Jenkins的Xcode插件需要调用Xcode,Xcode只能在OSX系统下安装,如果非要在Linux上实现,可以建立节点,过程过于繁琐,此处忽略
-
保存下面(jenkins的启动与关闭)后期部署会经常用到
jenkins -h//启动Jenkins control + c //快捷键关闭Jenkins
把工程的证书配置为企业证书,release模式
打开钥匙串,找到企业证书的根证书,例如:iPhone Distribution: xxx Co., LTD,点击小箭头,出现钥匙的图片后右键选择-显示简介-访问控制-允许所有应用程序访问此项目-存储更改(这步很重要不可少,是为了给jenkins一个访问权限)
安装jenkins
-
首先执行下面命令行查看是否有jenkins依赖的java环境,出现类似$ java version "1.8.xx"说明已安装java环境,没有安装换版本过低的可以到这里下载安装,或者Google 百度
$ java –version
-
安装HomeBrew,jenkins依赖HomeBrew包管理,执行如下命令行查看是否已安装,没安装的请移步Google,百度
$ brew -v
-
安装完HomeBrew后,执行以下命令行,安装jenkins,安装时间较长,耐心等待,出现Jenkins is fully up and running字样后,说明安装成功已启动
$ brew install jenkins //需要删除Jenkins可以执行命令行 $ sh "/Library/Application Support/Jenkins/Uninstall.command" //使用brew安装的可以执行 $ brew uninstall jenkins
-
在浏览器中输入http://localhost:8080,首次安装应该会出现如下界面,这里需要你去找到Jenkins的初始密码,这个界面不要关闭先放着
-
去找到Jenkins的初始密码,首先显示隐藏文件夹执行下面命令行显示隐藏文件夹,密码在上图红色的路径文件里面,密码最好备份一下,后续可能会用到
defaults write com.apple.finder AppleShowAllFiles YES
-
输入密码后选择推荐安装,默认选中的,如果部分插件安装失败,可以后续手动安装,之后会弹出如下图,创建管理员,记住密码,之后登陆用的就是这个密码了,创建之后就会进入Jenkins的主界面
安装Jenkins插件
- 点击系统管理-管理插件-可选插件,可以搜索插件,公司项目是托管在gitlab上的,所以我选的插件有(用其他托管代码的可以对应选择插件)
Gitlab Hook Plugin
GitLab Plugin
Xcode integration //用于打包ipa xcode9以后这个插件不好用了
构建项目
点击新建Item-输入项目名(建议所有名统一用工程名,避免出现各种坑)-构建一个自由风格的软件项目-确定
-
基础配置 描述可以随意填写 其它选择默认 如下图
-
源码管理 我的代码托管在gitlab所以选git,Repository URL填写项目的load地址,Credentials选择右方Add,在弹出的视图中选择kind-username with password,填写username和password为代码托管的账号和密码,登录成功后Credentials选择刚填写的账号,Branch Specifier (blank for 'any')选择默认或者修改为自己想要的分支,其它选项选择默认,配置成功后红色字样是不显示的,分支默认为master也可指定为自己创建的分支名,指定后构建的是指定分支的代码
构建触发器 此处先不做设置 等输出ipa后再来编辑,也可不作处理
-
构建环境 首先去Jenkins首页找到如下图选项点击进去
如下图选择文件(证书配置文件)-upload,上传对应的证书配置文件,点击保存,之后可以构建环境选择证书配置文件
-
选择Mobile Provisioning Profiles(证书配置文件)- Provisioning Profile选择项目的企业版生产证书,点击应用,其它选项默认不选
此时可以在项目页面,点击立即构建,正常情况下是成功构建的,如下图蓝色下图标代表构建成功,点击蓝色小图标后的时间进入页面,点击Console Output查看输出日志如下图,若构建失败请参看文章末尾常见问题或者百度Google
-
构建 首先需要准备一个ExportOptions.plist的文件,可以用Xcode配置对应的证书先打个ipa包在输出的文件夹中将ExportOptions.plist拷贝出来,放到项目的文件夹下,更新到代码仓库,因为Xcode 9 默认不允许访问钥匙串的内容,必须要设置 allowProvisioningUpdates,但是由于 Xcode integration 插件封闭,并不能对其进行修改加上这个属性,而且xcode构建容易出各种坑,所以使用 Shell 脚本代替插件,选择增加构建步骤-Execute shell,脚本如下(建议脚本中的文件或文件夹名先统一用工程名(Mac用户名除外),以免踩各种坑,待构建成功后再去自己定义想要的名字),复制脚本修改对应自己工程的信息,如果是 project 的项目,那就将下面脚本第一段的 -workspace 工程名.xcodeproj 修改为 -project 工程名.xcworkspace 即可。
xcodebuild -archivePath "/Users/MAC用户 名/.jenkins/workspace/jenkins构建项目时的项目名/build/Debug-iphoneos/工程名.xcarchive" -workspace 工程名.xcworkspace -sdk iphoneos -scheme "工程名" -configuration "Debug" archive xcodebuild -exportArchive -archivePath "/Users/MAC用户名/.jenkins/workspace/jenkins构建项目时的项目名/build/Debug-iphoneos/工程名.xcarchive" -exportPath "/Users/MAC用户名/.jenkins/workspace/jenkins构建项目时的项目名/build/ipa包文件夹(可以自定义名)名称" -exportOptionsPlist '/Users/MAC用户名/.jenkins/workspace/jenkins构建项目时的项目名/ExportOptions.plist' -allowProvisioningUpdates #蒲公英上的User Key uKey="545c527xxxxx49abb3a8b8" #蒲公英上的API Key apiKey="19fxxxxxxda919adfe8" #要上传的ipa文件路径 IPA_PATH="${WORKSPACE}/build/ipa包/xxxx.ipa" #安装密码 PASSWORD="xxx" #执行上传至蒲公英的命令 echo "++++++++++++++upload+++++++++++++" curl -F "file=@${IPA_PATH}" -F "uKey=${uKey}" -F "_api_key=${apiKey}" -F "password=${PASSWORD}" http://www.pgyer.com/apiv1/app/upload
这是构建生成.xcarchive文件的存放路径
xcodebuild -archivePath "/Users/MAC用户名/.jenkins/workspace/jenkins构建项目时的项目名/build/Debug-iphoneos/工程名.xcarchive"
这是存放.xcarchive文件的路径,必须与上面路径保持一致
xcodebuild -exportArchive -archivePath "/Users/MAC用户名/.jenkins/workspace/jenkins构建项目时的项目名/build/Debug-iphoneos/工程名.xcarchive"
这是生成.ipa文件的存放路径
-exportPath "/Users/MAC用户名/.jenkins/workspace/jenkins构建项目时的项目名/build/ipa包文件夹(可以自定义名)名称"
这是jenkins构建时拉下代码的文件夹中ExportOptions.plist所在的路径
-exportOptionsPlist '/Users/MAC用户名/.jenkins/workspace/jenkins构建项目时的项目名/ExportOptions.plist' -allowProvisioningUpdates
注意:在上传蒲公英的脚本中ipa的路径要到.ipa文件为止
-
至此可点击立即构建,构建成功后将会在finder-Macintosh HD -用户-用户-.jenkins(隐藏文件)-workspace-、、、如下图文件中看到生成的.ipa .xcarchive 工程代码等文件
项目构建的常见问题
-
缺少ExportOptions.plist,解决办法:用xcode打包生成ExportOptions.plist文件 放在工程文件下
Error Domain=NSCocoaErrorDomain Code=260 "The file “ExportOptions.plist” couldn’t be opened because there is no such file." UserInfo= {NSFilePath=/Users/sky/.jenkins/workspace/xxx/build/ExportOptio ns.plist, NSUnderlyingError=0x7fd9d5776430 {Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"}}
证书配置的不对
error: exportArchive: "xxx.app" requires a provisioning profile with the Push Notifications feature.sheme不对
xcodebuild: error: If you specify a workspace then you must also specify a scheme. Use -list to see the schemes in this workspace.