背景
使用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
应该登录开发者账号去查看,如图:
就这样我解决了这个大坑,后来发现拷贝描述文件到
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
插件有个解锁的选项,如下:
所以
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
对应的文件夹中即可,如下图:
- 需要注意的是在选择
Development distribution options
时App Thinning
一定要选择None
,如下图:
这样打完包之后的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
,实现了持续集成,再次声明不是什么技术活。