热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

iOS通过Jenkins自动构建ipa

默认Jenkins装好了环境配置安装插件:GitLabPlugin、GitlabHookPlugin、Xcodeintegration和KeychainsandProvisioni

默认Jenkins装好了

环境配置

安装插件
GitLab Plugin、Gitlab Hook Plugin、Xcode integration和Keychains and Provisioning ProfilesManagement

拷贝文件:(大坑)
1、将/Users/管理员用户名/Library的MobileDevice文件夹拷贝到/Users/Shared/Jenkins/Library下

2、打开钥匙串程序,找到相对应的证书,选择“允许所有的应用程序访问此项目”,并存储修改。

《iOS 通过Jenkins 自动构建ipa》
《iOS 通过Jenkins 自动构建ipa》

3、将/Users/管理员用户名/Library/Keychains/下的login.keychain及login.keychain-db这两个文件拷贝到/Users/Shared/Jenkins/Library/Keychains文件夹下面
注意:Mac OS 10.12以下的没有login.keychain-db这个文件,只需要拷login.keychain文件。

《iOS 通过Jenkins 自动构建ipa》

配置证书及描述文件:
在系统管理页面,选择“Keychains and Provisioning ProfilesManagement”。

《iOS 通过Jenkins 自动构建ipa》

进入Keychains and Provisioning ProfilesManagement页面,点击“浏览”按钮,分别上传自己的keychain和证书。上传成功后,我们再为keychain指明签名文件的名称。点击“Add Code Signing Identity”,最后添加成功后如下图所示:

《iOS 通过Jenkins 自动构建ipa》

注意:
1、Keychain和ProvisioningProfiles文件是隐藏文件,所以需要拷出来。
Keychain文件路径:/Users/管理员用户名/Library/Keychains/login.keychain,
ProvisioningProfiles文件路径:/Users/管理员用户名/Library/MobileDevice/Provisioning\ Profiles

2、Keychain和ProvisioningProfiles文件选好后,都需要upload下。

配置Kaychain
进入 系统管理->全局配置->Xcode Builder ,添加Keychain。“KeychainPath”路径${HOME}/Library/Keychains/login.keychain。

《iOS 通过Jenkins 自动构建ipa》

新建项目
1)点击左侧工具栏”新建”,选择第一项”构建一个自由风格的软件项目”

《iOS 通过Jenkins 自动构建ipa》

2)General

《iOS 通过Jenkins 自动构建ipa》

3)源码管理信息
如果你是用的是Git,那就请选择Git,然后输入你的仓库地址

《iOS 通过Jenkins 自动构建ipa》

点击“Add Credentials”添加Credentials。如下图:

《iOS 通过Jenkins 自动构建ipa》

如果是svn就输入svn地址,如下图:

《iOS 通过Jenkins 自动构建ipa》

4)构建触发器
可选填。

5)构建环境
选择“Keychains andProvisioning Profiles Management”和“Mobile Provisioning Profiles”

《iOS 通过Jenkins 自动构建ipa》
《iOS 通过Jenkins 自动构建ipa》

注意:Xcode8的自动签名需要改成手动。

《iOS 通过Jenkins 自动构建ipa》
《iOS 通过Jenkins 自动构建ipa》

6)构建
有两种方式打包,一是用Xcode插件打包,二是用Shell脚本打包。

方式一:
添加构建步骤-> Xcode基本信息
这里Target请于Xcode项目中Target的名字对应
Clean before build设置为YES
Configuration我选择了Release(在Release的时候Archive)
Output directory为.ipa的输出路径,我这里设置为~/Desktop/build/

完成图:

《iOS 通过Jenkins 自动构建ipa》

General build settings

《iOS 通过Jenkins 自动构建ipa》

《iOS 通过Jenkins 自动构建ipa》

Code signing & OS X keychain options

《iOS 通过Jenkins 自动构建ipa》

Advanced Xcode build options
1.“Xcode Project File”里填Xcode项目中的schema。
2.本文中的项目中包含有workspace,这里设置绝对路径,不需要带上.xcworkspace后缀。如果项目中没有workspace后缀,那就在“Xcode Project File”上填.xcodeproj文件的路径。
3.“Build output directory”里设置构建输出目录。

《iOS 通过Jenkins 自动构建ipa》

方式二:
选择第二个“Executeshell”
Shell脚本:

#工程名
APP_NAME="Demo"
#目标名
TARGET_NAME="Demo"
#证书
CODE_SIGN_DEVELOPER="iPhoneDeveloper: xxx"
#info.plist路径
project_infoplist_path="/Users/管理员用户名/Desktop/Demo/Demo/Demo/Info.plist"
#取版本号
bundleShortVersion=$(/usr/libexec/PlistBuddy -c "print CFBundleShortVersionString" "${project_infoplist_path}")
#取build值
bundleVersion=$(/usr/libexec/PlistBuddy -c "print CFBundleVersion""${project_infoplist_path}")
DATE="$(date +%Y%m%d)"
IPANAME="${APP_NAME}_V${bundleShortVersion}_${DATE}.ipa"
#要上传的ipa文件路径
IPA_PATH="/Users/管理员用户名/Desktop/ipa/Demo/${IPANAME}"
#workspace路径
WORKSPACE_PATH="/Users/管理员用户名/Desktop/Demo/Demo/Demo.xcworkspace"
echo "+++++++++++++++++clean+++++++++++++++++"
xcodebuild -workspace ${WORKSPACE_PATH} -scheme "${APP_NAME}" -configuration 'Debug' clean
echo "+++++++++++++++++Build+++++++++++++++++"
xcodebuild -workspace ${WORKSPACE_PATH} -scheme "${APP_NAME}" -sdk iphoneos -configuration 'Debug' CODE_SIGN_IDENTITY="${CODE_SIGN_DEVELOPER}" SYMROOT='$(PWD)'
echo "+++++++++++++++++Run+++++++++++++++++"
xcrun -sdk iphoneos PackageApplication -v "./Debug-iphoneos/${APP_NAME}.app" -o ${IPA_PATH}
#userKey和apiKey需要在蒲公英的账号设置中查找
userKey="xxx"
apiKey="xxx"
#蒲公英打包
curl -F "file=@${IPA_PATH}" \
-F "uKey=${userKey}" \
-F "_api_key=${apiKey}" \
-F "isPublishToPublic=2" \
http://www.pgyer.com/apiv1/app/upload

注意:复制粘贴有可能使脚本之间的空格消失,请注意!!!

遇到的坑

坑1:文件拷贝失败

Failed to copy /Users/Shared/Jenkins/Home/kpp_upload/xxx.mobileprovision to /Users/caizhuoyue/Library/MobileDevice/Provisioning Profiles/xxx.mobileprovision
[java.io.IOException](http://stacktrace.jenkins-ci.org/search?query=java.io.IOException): Failed to copy /Users/Shared/Jenkins/Home/kpp_upload/xxx.mobileprovision to /Users/caizhuoyue/Library/MobileDevice/Provisioning Profiles/xxx.mobileprovision

解决方法:开放Library(/Users/管理员用户名/Library)文件夹写入权限

坑2:文件夹中不包含project 或 workspace文件

xcodebuild: error: The directory /Users/Shared/Jenkins/Home/workspace/Demo1 does not contain an Xcode project or workspace.

解决方法:需要在“xcodebuild -workspace /Users/管理员用户名/Desktop/Demo/Demo/Demo.xcworkspace -scheme Demo -configuration Debug clean”脚本中指定路径“-workspace /Users/管理员用户名/Desktop/Demo/Demo/Demo.xcworkspace”

坑3:执行clean脚本后没有下文。

+ xcodebuild -workspace /Users/管理员用户名/Desktop/Demo/Demo/Demo.xcworkspace -scheme Demo -configuration Debug clean
Build was aborted

解决方法:给Shared文件夹(/Users/Shared)开放写入权限

坑4:匹配不到证书

No profile matching '证书' found: Xcode couldn't find a profile matching '证书'. Install the profile (by dragging and dropping it onto Xcode's dock item) or select a different one in the General tab of the target editor.
Code signing is required for product type 'Application' in SDK 'iOS 10.0'

解决方法:将/Users/管理员用户名/Library下的MobileDevice文件夹拷贝到/Users/Shared/Jenkins/Library下面

坑5:自动签名失败

Demo has conflicting provisioning settings. Demo is automatically signed, but code signing identity iPhone Developer: xxx has been manually specified. Set the code signing identity value to "iPhone Developer" in the build settings editor, or switch to manual signing in the project editor.
Code signing is required for product type 'Application' in SDK 'iOS 10.0'

解决方法:在Xcode里将自动签名改成手动签名,并在”TARGETS”->”Build Settings”->”Code Signing Identity”中将所有的team改掉。

《iOS 通过Jenkins 自动构建ipa》 8.png
《iOS 通过Jenkins 自动构建ipa》 9.png

坑6:签名失败

/usr/bin/codesign --force --sign C5FE4334C09900601683D488B17EE6FC1E917F9F --entitlements /Users/Shared/Jenkins/Library/Developer/Xcode/DerivedData/Demo-bzxerumfljpbfaehrejgkxttfmtz/Build/Intermediates/Demo.build/Debug-iphoneos/Demo.build/Demo.app.xcent --timestamp=none /Users/Shared/Jenkins/Home/workspace/Demo/Debug-iphoneos/Demo.app
SecKey API returned: -25308, (null)/Users/Shared/Jenkins/Home/workspace/Demo/Debug-iphoneos/Demo.app: unknown error -1=ffffffffffffffff
Command /usr/bin/codesign failed with exit code 1

解决方法:进入 系统管理->全局配置->Xcode Builder ,添加Keychain。添加完之后打开钥匙串程序,解锁“登录”钥匙串,并找到相对应的证书,选择“允许所有的应用程序访问此项目”,并存储修改。

《iOS 通过Jenkins 自动构建ipa》 3.png
《iOS 通过Jenkins 自动构建ipa》
《iOS 通过Jenkins 自动构建ipa》

坑7:导出ipa失败

+ /usr/bin/zip --symlinks --verbose --recurse-paths ~/Users/caizhuoyue/Desktop/ipa/Demo/Demo.ipa/ .
Program /usr/bin/zip returned 15 : [zip I/O error: No such file or directory
zip error: Could not create output file (~/Users/caizhuoyue/Desktop/ipa/Demo/Demo.ipa/.zip)]

解决方法:“~/Users/caizhuoyue/Desktop/ipa/Demo/Demo.ipa/”这个路径错误,正确的路径是“/Users/caizhuoyue/Desktop/ipa/Demo/Demo.ipa/”

坑8:电脑重启后打包失败

/usr/bin/codesign --force --sign C5FE4334C09900601683D488B17EE6FC1E917F9F --entitlements /Users/Shared/Jenkins/Library/Developer/Xcode/DerivedData/Demo-bzxerumfljpbfaehrejgkxttfmtz/Build/Intermediates/Demo.build/Debug-iphoneos/Demo.build/Demo.app.xcent --timestamp=none /Users/Shared/Jenkins/Home/workspace/Demo/Debug-iphoneos/Demo.app
SecKey API returned: -25308, (null)/Users/Shared/Jenkins/Home/workspace/Demo/Debug-iphoneos/Demo.app: unknown error -1=ffffffffffffffff

解决方法:重新拷贝login.keychain和login.keychain-db文件。

参考链接
http://www.jianshu.com/p/5591fe0c6770(灰常有用)
http://www.cocoachina.com/ios/20160804/17281.html(安装Jenkins)


推荐阅读
  • 现在比较流行使用静态网站生成器来搭建网站,博客产品着陆页微信转发页面等。但每次都需要对服务器进行配置,也是一个重复但繁琐的工作。使用DockerWeb,只需5分钟就能搭建一个基于D ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 用ESP32与Python实现物联网(IoT)火焰检测报警系统
    下图是本案例除硬件连线外的3步导学开发过程,每个步骤中实现的功能请参考图中的说明。在硬件连线完成之后我们建议您先使用“一分钟上云体验”功能预先体验本案例的实际运行效果 ... [详细]
  • UEditor可以如何直接复制word的图文内容到编辑器中
    这种方法是servlet,编写好在web.xml里配置servlet-class和servlet-mapping即可使用后台(服务端)j ... [详细]
  • IamsettingupApacheserverwithTortoiseSVNforalocalsourcecoderepository.Ihaveobservedt ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 在开发中,有时候一个业务上要求的原子操作不仅仅包括数据库,还可能涉及外部接口或者消息队列。此时,传统的数据库事务无法满足需求。本文介绍了Java中如何利用java.lang.Runtime.addShutdownHook方法来保证业务线程的完整性。通过添加钩子,在程序退出时触发钩子,可以执行一些操作,如循环检查某个线程的状态,直到业务线程正常退出,再结束钩子程序。例子程序展示了如何利用钩子来保证业务线程的完整性。 ... [详细]
  • 原文转自:http:blog.csdn.netchinasoftosgarticledetails7903045UploadAction.java:packagecr ... [详细]
  • Java导入Excel文件返回数据对应属性类字段,Java导出Excel文件如何让数据对应指定的标题字段
    Java导入Excel文件如何对应属性类对应的字段?Java导出Excel文件如何实现?下面分为两段供各位测试,要是不懂或者实在不行可以评论一下,看到我会回复的jar这些你们可以自 ... [详细]
  • MapReduce 切片机制源码分析
     总体来说大概有以下2个大的步骤1.连接集群(yarnrunner或者是localjobrunner)2.submitter.submitJobInternal()在该方法中会创建 ... [详细]
  • 文件上传漏洞利用介绍
    目录文件上传漏洞利用介绍1.绕过js验证2.绕过MIME-TYPE验证3.绕过基于黑名单验证基于文件后缀名验证介绍基于文件后缀名验证方式的分类基于黑名单验证代码分析利 ... [详细]
  • react项目无法编译2.npm错误信息: ... [详细]
author-avatar
干杯平凡小点_113
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有