iOS 通过Jenkins 自动构建ipa

默认Jenkins装好了

环境配置

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

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

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

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

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

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


注意:
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。

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

2)General


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


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

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


4)构建触发器
可选填。

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


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


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

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

完成图:


General build settings

Code signing & OS X keychain options

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

方式二:
选择第二个“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改掉。

8.png
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。添加完之后打开钥匙串程序,解锁“登录”钥匙串,并找到相对应的证书,选择“允许所有的应用程序访问此项目”,并存储修改。

3.png

坑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)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容