iOS 通过Jenkins 自动构建ipa

作者: czyliuyun | 来源:发表于2017-01-20 17:22 被阅读7536次

默认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)

相关文章

网友评论

  • MichalWilson:你好,你的坑6我也遇到了 。为什么你的解决方法不行啊,我的Jenkins还是一直报这个错误
  • 阿兰邦巴尔:感谢po 主分享! 最近团队开始使用 Jenkins, 这篇文章帮到我很多.
    我一开始使用的 xcode 插件遇到了很多问题, 现在用Executeshell来做顺利了很多,不过有个关于证书的问题没搞明白.
    项目在 git 上拉下拉的时候配置的是开发环境的provisioning profile, 我在 shell 里指定了 in house 的profile. 但是 build之后它还是使用了默认的开发环境的 profile, 这是错误信息:
    === BUILD TARGET XXX OF PROJECT XXX WITH CONFIGURATION QA ===

    Check dependencies
    Code Signing Error: No profile for team 'XXX' matching 'iOS Wildcard App ID' found: Xcode couldn't find any provisioning profiles matching 'XXX/iOS Wildcard App ID'. 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 Error: Code signing is required for product type 'Application' in SDK 'iOS 11.1'
    Code Signing Error: Code signing is required for product type 'Application' in SDK 'iOS 11.1'​
    不知道是不是需要先把xcode的配置改好push到 git才可以.
  • macfai:你好,楼主,能加个qq吗,我现在研究这个遇到了一些问题,想请教一下,谢谢了啊
  • singlestep:关于 坑1 , 添加个 用户(jenkins)会不会更好
    Fionashow:关于坑1,有没有好办法?
  • 9ab6214fa360:/usr/bin/codesign --force --sign 3C80377D4F0A2E1B763E32DB97E6E588676C3273 --entitlements /Users/Shared/Jenkins/Home/workspace/QianXiaoErMain_Test/TDQianxiaoer/build/Build/Intermediates/TDQianxiaoer.build/Release-iphoneos/TDQianxiaoer.build/TDQianxiaoer.app.xcent --timestamp=none /Users/Shared/Jenkins/Home/workspace/QianXiaoErMain_Test/TDQianxiaoer/build/Build/Products/Release-iphoneos/TDQianxiaoer.app
    /Users/Shared/Jenkins/Home/workspace/QianXiaoErMain_Test/TDQianxiaoer/build/Build/Products/Release-iphoneos/TDQianxiaoer.app: unknown error -1=ffffffffffffffff
    Command /usr/bin/codesign failed with exit code 1

    我的是这个错误,按照你的坑6和坑8 试了都没效果,求楼主指教
    3e8712324ddd:@大佬杰 我好了。但是是莫名其妙好的。感觉应该是证书签名访问不到。我用下面Xcode构建了下。切回来就好了
    9ab6214fa360:@iTc 没解决啊 老哥 等你来执教
    3e8712324ddd:老哥解决这个问题了么 我也是这个问题
  • e53838b2ef13:我遇到一个问题,xcodebuild: error: The flag -scheme is required when specifying -archivePath but not -exportArchive.
    Build step 'Xcode' marked build as failure请问博主知道怎么解决吗?
  • e53838b2ef13:你好,我遇到一个问题,xcodebuild: error: The flag -scheme is required when specifying -archivePath but not -exportArchive.
    Build step 'Xcode' marked build as failure请问博主知道怎么解决吗
  • 断剑:我在共享那个路径下面找不到JenKins这个文件夹啊,请问这是什么原因啊?
    Fionashow:找不到就需要自己拷贝过去
  • 不舍红尘的和尚松:加入主动解锁仍然不起作用
    /usr/bin/codesign --force --sign 70DD6E5984347A3FF0CD3E6459E76CD2698C87EE --entitlements /Users/Shared/Jenkins/Home/workspace/jenkins/jenkins.build/Debug-iphoneos/jenkins.build/jenkins.app.xcent --timestamp=none /Users/Shared/Jenkins/Home/workspace/jenkins/Debug-iphoneos/jenkins.app
    /Users/Shared/Jenkins/Home/workspace/jenkins/Debug-iphoneos/jenkins.app: replacing existing signature
    SecKey API returned: -25308, (null)/Users/Shared/Jenkins/Home/workspace/jenkins/Debug-iphoneos/jenkins.app: unknown error -1=ffffffffffffffff
    Command /usr/bin/codesign failed with exit code 1
    且多了句/Users/Shared/Jenkins/Home/workspace/jenkins/Debug-iphoneos/jenkins.app: replacing existing signature 替换现有签名 是什么意思?

  • PisPMPL:FATAL: Failed to copy /Users/zhangji/.jenkins/kpp_upload/fourfivesix.mobileprovision to /User/zhangji/Library/MobileDevice/Provisioning Profiles/9a4ebda2-4680-40f0-aa10-6a1535052d50.mobileprovision
    18:16:56 java.io.FileNotFoundException: /User/zhangji/Library/MobileDevice/Provisioning Profiles/9a4ebda2-4680-40f0-aa10-6a1535052d50.mobileprovision (No such file or directory)


    这是啥错,,
    PisPMPL:@czyliuyun 你的是IOException 我的是FileNotFoundException 我试过你这个了,,,并不行呀...
    czyliuyun:@czyliuyun 可以看看坑1
    czyliuyun:描述文件拷贝失败
  • 8814d8c64dab:我使用Jenkins打包失败,导出ipa的时候,提示 code=1 "Codesign failed" UserInfo={NSLcalizedDescription=codesign failed}
    8814d8c64dab:@czyliuyun 感谢,成功了。
    czyliuyun:@天下我有good 签名失败,你试下坑6的解决方法
    8814d8c64dab:没其他反馈信息,无从下手,楼主知道为什么吗
  • xiaoliuTX_iOS:楼主,为什么我签名失败SecKey API returned: -25308,时按照你说的那样去做还是没用啊?
    bestoml: 在脚本里加入主动解锁那行.
    bestoml:http://miraclei.net/archives/1303
  • 32c0a3e504c2:找不到login.keychain文件,楼主知道是因为什么吗?
    32c0a3e504c2:这个我知道,只看到了login.keychain-db,没有login.keychain:sweat:
    czyliuyun:Library是隐藏文件夹,你可以直接前往这个路径试试,/Users/管理员用户名/Library/Keychains

本文标题:iOS 通过Jenkins 自动构建ipa

本文链接:https://www.haomeiwen.com/subject/tqxgbttx.html