【Jenkins + Xcode + 蒲公英】配置 Jenkins 遇到的坑

背景

使用Jenkins是为了持续、自动构建项目,持续集成对整个开发团队的开发带来诸多好处,可以省去频繁的集成工作,整体缩短开发周期,推动整个开发,很大程度提高团队的工作效率。

上家公司就是用Jenkins工具实现持续集成,但是之前是别的同事配置的,这两天在公司决定自己配置一下,结果遇到了很多坑,在此记录一下。

ps:其实整个Jenkins配置过程还是很简单的,不是什么技术活,网上详细的教程也有很多,所以不多详细描述整个配置过程,而是针对于我们公司的项目提出几个点,并分享解决过程。

一.安装方式

首先Jenkins安装方式网上就有很多声音,最开始配置作者是通过安装包(.dmg)的方式安装的,一切都很顺利,http://localhost:8080也直接打开了面板(如果输入地址打不开面板可能就是Java环境出现问题,可以检查一下,升级或者重新安装)。新建项目之后又遇到了一些问题,在下面会逐一提到。在工程都完美配置好的前提下(其实在这之前构建过 n 次,填了很多网上其他用户遇到的同样的问题,都比较好解决),开始构建,结果刚开始很顺利,进度条走着走着就报红了,打开控制台输出是以下内容:

=== BUILD TARGET *** OF PROJECT **** WITH CONFIGURATION ***** ===

Check dependencies
Code Signing Error: No profile for team '**********' matching '********' found:  Xcode couldn't find any provisioning profiles 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 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'
Code Signing Error: Code signing is required for product type 'Application' in SDK 'iOS 11.1'

** ARCHIVE FAILED **

这是作者遇到的第一个大坑,网上同样的问题也很多,很多人提出解决方法就是将/Users/apple/Library/MobileDevice下描述文件的文件夹整体移动到/User/Shared/Jenkins/Library/MobileDevice下,结果作者试了并没有什么用,然后又查了很多资料都没有解决这个问题,直到看到一个博客说通过安装包的方式存在这样的问题(修改Jenkins主目录),作者就推翻了安装包安装的方式,用homebrew进行安装,然后安装完配置Jenkins后,在面板里添加了工程,然后构建,不幸的是同样的问题并没有得到解决。

其实作者这里出现这个问题的根本原因就是Team ID写错了,这个问题就让人很头大了,我这里一直没有发现我填的是证书后面的那串数字,这个操作就是被无良博主带歪了,Team ID应该登录开发者账号去查看,如图:

Team ID

就这样我解决了这个大坑,后来发现拷贝描述文件到Jenkins用户目录是正确的操作。

那么作者就这两种安装说一下自己比较直观的感受:

  • homebrew安装会比安装包安装效率要高一些,整个安装过程不用怕出现配置问题,包括卸载的时候会更方便。
  • 安装包安装会再系统生成一个Jenkins用户,homebrew安装则不会。
  • 两者主目录路径会不同,
homebrew安装主路径为:
/Users/Shared/Jenkins/Home
安装包安装主路径为:
~/.jenkins/Home
  • homebrew安装开机后手动启动 Jenkins 服务,安装包安装开机后自动启动服务。当然homebrew也可以通过命令行设置成开机自动启动服务。
  • 其他方面,比如创建任务及整个配置过程两种安装方式安装后都是一样的,出现报错不用质疑安装方式有问题。

二.其他报错

当然配置过程还有很多问题,比如:

1)

xcodebuild[33781:175258] [MT] IDEDistribution: Step failed: <IDEDistributionSigningAssetsStep: 0x7fd7dafe7ec0>: Error Domain=IDEDistributionSigningAssetStepErrorDomain Code=0 "Locating signing assets failed." UserInfo={NSLocalizedDescription=Locating signing assets failed., IDEDistributionSigningAssetStepUnderlyingErrors=(
    "Error Domain=IDEProvisioningErrorDomain Code=9 \"\"***.app\" requires a provisioning profile with the Push Notifications feature.\" UserInfo={NSLocalizedDescription=\"***.app\" requires a provisioning profile with the Push Notifications feature., NSLocalizedRecoverySuggestion=Add a profile to the \"provisioningProfiles\" dictionary in your Export Options property list.}"
)}
error: exportArchive: "***.app" requires a provisioning profile with the Push Notifications feature.

Error Domain=IDEProvisioningErrorDomain Code=9 ""***.app" requires a provisioning profile with the Push Notifications feature." UserInfo={NSLocalizedDescription="***.app" requires a provisioning profile with the Push Notifications feature., NSLocalizedRecoverySuggestion=Add a profile to the "provisioningProfiles" dictionary in your Export Options property list.}

** EXPORT FAILED **

问题定位之后了解到Xcode版本在9以上可能在面板中用Xcode插件构建会导致这样的问题,导致原因可能是没有权限访问钥匙串的内容,提供解决方案是放弃Xcode插件,通过“执行 shell”运行脚本完成项目构建,如下:

security unlock-keychain -p 开机密码(登录钥匙串密码) /Users/用户名/Library/Keychains/login.keychain
xcodebuild clean -workspace "/Users/Shared/Jenkins/Home/workspace/项目文件夹/项目/项目.xcworkspace" -scheme "默认scheme" -configuration "默认configuration" -sdk iphoneos11.4
xcodebuild -archivePath "/Users/Shared/Jenkins/Home/workspace/项目文件夹/output/默认scheme/项目.xcarchive" -workspace "/Users/Shared/Jenkins/Home/workspace/项目文件夹/项目/项目.xcworkspace" -sdk iphoneos11.4 -scheme "默认scheme" -configuration "默认configuration" archive
xcodebuild -exportArchive -archivePath "/Users/Shared/Jenkins/Home/workspace/项目文件夹/output/默认scheme/项目.xcarchive" -exportPath "/Users/Shared/Jenkins/Home/workspace/项目文件夹/ipa/默认scheme" -exportOptionsPlist '/Users/Shared/Jenkins/Home/workspace/项目文件夹/ipa/默认scheme/ExportOptions.plist' -allowProvisioningUpdates

当然,只是为了实现简单的构建版本需求。

注意:
exportOptionsPlist代表包含导出的ipa包的配置信息的文件,我们可以再构建之前先在/Users/Shared/Jenkins/Home/workspace/项目文件夹/ipa/默认scheme生成这个文件,如果不会生成这个文件可以手动打包,打包导出的文件夹会生成这个文件,可以直接拿来使用,同时这个文件里能看到Team ID

2)

/Users/Shared/Jenkins/Library/Developer/Xcode/DerivedData/项目-chghnxmyohlmkqalamhlgjkzcims/Build/Intermediates.noindex/ArchiveIntermediates/项目/InstallationBuildProductsLocation/Applications/项目.app/Frameworks/AliyunVideoSDKPro.framework: errSecInternalComponent
Command /usr/bin/codesign failed with exit code 1

** ARCHIVE FAILED **
The following build commands failed:
    CodeSign /Users/Shared/Jenkins/Library/Developer/Xcode/DerivedData/项目-chghnxmyohlmkqalamhlgjkzcims/Build/Intermediates.noindex/ArchiveIntermediates/项目/InstallationBuildProductsLocation/Applications/项目.app/Frameworks/AliThirdparty.framework
    CodeSign /Users/Shared/Jenkins/Library/Developer/Xcode/DerivedData/项目-chghnxmyohlmkqalamhlgjkzcims/Build/Intermediates.noindex/ArchiveIntermediates/项目/InstallationBuildProductsLocation/Applications/项目.app/Frameworks/AliyunPlayerSDK.framework
(4 failures)
Build step '执行 shell' marked build as failure
Finished: FAILURE

一切都进行很顺利,就差最后一点点就Archive完了,到构建一些.framework时又报问题了,这个问题真的是无解,仿佛就作者遇到了这样的问题,也无从查证,实在是搞不明白errSecInternalComponent这是什么问题,又看到了很多博客做了很多飘逸的操作,结果也没有给我解决问题。后来我就回看往期的构建版本发现用脚本构建之前(Xcode插件构建)时到这步操作并没有报这个错而是继续构建,然后报了错误1),然后我就又换回了脚本构建的方式,通过构建版本方式的切换我发现成功导出了ipa文件,就这样作者终于看到了:
** ARCHIVE SUCCEEDED ** ** EXPORT SUCCEEDED **
本以为就这样结束了,作者就针对工程中多个Scheme创建了多个任务,用很诡异的切换构建方式都成功地完成自动化打包,然后关机下班。
第二天一上班欣喜地点了“立即构建”,结果爆炸了,又报了这个错误,心态爆炸了,原来切换构建方式的方法只是解决了一时的问题。后来静下心来想问题出在哪儿,又上网上翻了翻,看到了
Xcode Command /usr/bin/codesign failed with exit code 1 : errSecInternalComponent,下面有个回答点醒了我,就是脚本构建需要先执行security unlock-keychain -p 开机密码(登录钥匙串密码) /Users/用户名/Library/Keychains/login.keychain,将登录钥匙串打开,提供访问。之前用Xcode插件构建不会在这里报错是因为Xcode插件有个解锁的选项,如下:

Unlock Keychain

所以Xcode插件构建后再用脚本构建不会问题,并且构建成功,而且重启电脑后又会报这个问题。所以脚本构建需要先执行security unlock-keychain -p 开机密码(登录钥匙串密码) /Users/用户名/Library/Keychains/login.keychain

3)

前一阵子公司也开发新版本,Jenkins 也被搁置了。结果前两天想打包发现 Jenkins 面板打不开了,定位了半天也没找到问题出在哪里,索性就直接在公司的新电脑上重新部署了一下 Jenkins,最后我把问题归咎于 macOS Mojave,哈哈。
结果没开心多久,像之前一样配置工程,结果打包失败了,报错信息如下:

error: exportArchive: The data couldn’t be read because it isn’t in the correct format.

Error Domain=NSCocoaErrorDomain Code=3840 "No value." UserInfo={NSDebugDescription=No value., NSFilePath=/var/folders/v4/j6xwm71s0nl2hjkfr7kyxd_w0000gn/T/ipatool-json-filepath-CcF4eM}

** EXPORT FAILED **

这个问题就是导出的ExportOptions.plist配置的值不对,解决这个问题最快的办法就是手动打个包,然后导出包的文件夹里也会有这个文件,拷贝到workspace对应的文件夹中即可,如下图:

workspace

  • 需要注意的是在选择Development distribution optionsApp Thinning一定要选择None,如下图:
    Development distribution options

    这样打完包之后的ExportOptions.plist内容如下图:
    ExportOptions.plist

4)

$ /bin/sh -xe /var/folders/v4/j6xwm71s0nl2hjkfr7kyxd_w0000gn/T/jenkins2815406958203751547.sh
+ xcodebuild clean -workspace $'/Users/apple/.jenkins/workspace/xxx/xxx.xcworkspace' -scheme xxx -configuration xxx -sdk iphoneos11.0
xcodebuild: error: SDK "iphoneos11.0" cannot be located.

出现这个问题就在终端输入xcodebuild -showsdks查看电脑支持的 iOS SDKs 就好了。

5)

愤怒的管家:

org.apache.commons.jelly.JellyTagException: jar:file:/Users/apple/.jenkins/war/WEB-INF/lib/jenkins-core-2.151.jar!/hudson/model/UpdateCenter/CoreUpdateMonitor/message.jelly:53:20: <j:otherwise> can't parse argument number: changelog.url

愤怒的管家

安装完Jenkins遇到这个报错久无法继续配置任务了,我是用homebrew安装后遇到这个问题的,在网上查了很多资料,感觉没有实质性的帮助,看官方日志及解决方案也没有解决这个问题,最后我根据路径找到了报错的jar包,然后去官网下载了Generic Java package (.war),用新下的jenkins.war里的jenkins-core-2.138.3替换了报错的jenkins-core-2.151.jar,完美解决了这个问题。


就这样经历了99+次构建,作者用生命集成好了Jenkins,实现了持续集成,再次声明不是什么技术活。

成功导出

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

推荐阅读更多精彩内容