【iOS】Jenkins mac-slave iOS CI 集成(二)

写在前面:

接着Jenkins mac-slave iOS CI 集成(一),我们已经实现了本地Jenkins的打包功能。下一步就是给服务端的Jenkins配置一个mac节点:mac-slave
怎么配置可以参考:Mac当Jenkins slave远程自动编译iOS。毕竟我是懒得重新写一遍的,哈哈哈

配置好mac-mini-slave之后,job就用上一篇文章中你自己用的那个job,直接一样的配置一遍就好了

我这里主要是记录在配置里slave之后遇到的问题

1.当你的slave节点配置好了之后,有可能你的该节点的物理机器关闭了(就是你的mac电脑关闭了),或者你的ip变了,这个时候就不能打包了

《【iOS】Jenkins mac-slave iOS CI 集成(二)》 slave列表

解决方式:关闭这个很好说,如上图,有多个slave。他们都被指定了不同的job。也会显示在不在线。不在线的话自己查下,没啥好赘述的。关于动态IP的问题,建议是把你的mac电脑改成静态IP,这样Jenkins 就不会找不到你的机子

2. BUILD FAILED

ld: warning: directory not found for option '-L/Users/draven/Library/Developer/Xcode/DerivedData/DaZhuanJia-gtosbakglnaxprfkajssnftcmqct/Build/Products/Debug-iphoneos/ZipArchive'
ld: library not found for -lAFNetworking
clang: error: linker command failed with exit code 1 (use -v to see invocation)

** BUILD FAILED **

The following build commands failed:
    Ld /Users/draven/Library/Developer/Xcode/DerivedData/DaZhuanJia-gtosbakglnaxprfkajssnftcmqct/Build/Intermediates.noindex/DaZhuanJia.build/Debug-iphoneos/DaZhuanJia.build/Objects-normal/armv7/DaZhuanJia normal armv7
(1 failure)
Build step 'Execute shell' marked build as failure
Finished: FAILURE
问题分析:看报错信息是因为找不到文件,这个问题有点尬
xcodebuild -workspace "${TARGET_NAME}.xcworkspace" -scheme "${TARGET_NAME}"  -configuration ${Configuration} clean
解决方案:这一行shell里面${Configuration} 参数有问题,前面没有赋值,改一下就好了

3. ARCHIVE FAILED

/Users/draven/Library/Developer/Xcode/DerivedData/DaZhuanJia-gtosbakglnaxprfkajssnftcmqct/Build/Intermediates.noindex/ArchiveIntermediates/DaZhuanJia/InstallationBuildProductsLocation/Applications//DaZhuanJia.app/Frameworks/YZBaseSDK.framework: errSecInternalComponent
Command /bin/sh failed with exit code 1

** ARCHIVE FAILED **


The following build commands failed:
    PhaseScriptExecution [CP]\ Embed\ Pods\ Frameworks /Users/draven/Library/Developer/Xcode/DerivedData/DaZhuanJia-gtosbakglnaxprfkajssnftcmqct/Build/Intermediates.noindex/ArchiveIntermediates/DaZhuanJia/IntermediateBuildFilesPath/DaZhuanJia.build/Debug-iphoneos/DaZhuanJia.build/Script-BAB30BC2E5639AD649C8DE0D.sh
(1 failure)
Build step 'Execute shell' marked build as failure
Finished: FAILURE
问题分析:

在执行PhaseScriptExecution 命令的时候失败了,看似和pods 有关,但是往前看,还有/usr/bin/codesign –force –sign B9BE891386458471F961BF2000FF29D9B1A02BB9 –preserve-
这段codesign 的log 让我有很强烈的直觉觉得这个是cert 或者是pp文件的问题.在我本地的Jenkins 里面没有这个问题,加了mac-slave 之后就有了问题.关于Jenkins mac-slave
然后我就对比pp文件的变化在两个不同的Jenkins 下的区别

《【iOS】Jenkins mac-slave iOS CI 集成(二)》 这个是本地Jenkins 的PP文件的目录
《【iOS】Jenkins mac-slave iOS CI 集成(二)》 这个是slave下的pp文件目录,该目录不是我们手动创建的,是Jenkins在执行脚本的时候动态创建的

对比的结果是,并没有什么问题,pp文件是可以正常读取的

然后我继续Google :The following build commands failed: PhaseScriptExecution [CP]\ Embed\ Pods\ Frameworks

搜索结果一个个点进去看,第一页有10个结果,仔细的看,也许就有新发现啊哈哈

试了各种,什么修改cocoapods里面的sh,修改slave-mac的相关等等

最后moving certificate to System in keychain这个有用
修改证书访问权限

Well, I got it working. I had to move my certificate from the login keychain to the System keychain. For some reason Jenkins doesn’t seem to have the proper authority to access the certificates from the login keychain when they’re added by Match.

《【iOS】Jenkins mac-slave iOS CI 集成(二)》 改了之后的样子

讲道理我的Jenkins slave 是我当前电脑的user用户下的,应该是可以访问login 里的Certification,不知道为啥读取失败。然后slave 确只能从system 的Certification。我想这是和slave的配置ssh连接有关系吧

由此证明我前面的猜想是对的,就是证书读不到的问题。当然了,很多因素都会导致

The following build commands failed: PhaseScriptExecution [CP]\ Embed\ Pods\ Frameworks

这个问题,需要根据自己的实际情况来踩坑。

3. ARCHIVE FAILED 2

    /bin/sh -c /Users/draven/Library/Developer/Xcode/DerivedData/DaZhuanJia-gtosbakglnaxprfkajssnftcmqct/Build/Intermediates.noindex/ArchiveIntermediates/DaZhuanJia/IntermediateBuildFilesPath/DaZhuanJia.build/Release-iphoneos/DaZhuanJia.build/Script-C6C318A78DB9F56436417ECF.sh
error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.

** ARCHIVE FAILED **


The following build commands failed:
    PhaseScriptExecution [CP]\ Check\ Pods\ Manifest.lock /Users/draven/Library/Developer/Xcode/DerivedData/DaZhuanJia-gtosbakglnaxprfkajssnftcmqct/Build/Intermediates.noindex/ArchiveIntermediates/DaZhuanJia/IntermediateBuildFilesPath/DaZhuanJia.build/Release-iphoneos/DaZhuanJia.build/Script-C6C318A78DB9F56436417ECF.sh
(1 failure)
Build step 'Execute shell' marked build as failure
Finished: FAILURE

看报错是pod的问题,然后我操作不同的地方是切换了打包代码的分支

《【iOS】Jenkins mac-slave iOS CI 集成(二)》 这里我构建的时候切换了分支

然后两个分支的pod.lock状态不一样,所以说pod的错误
我就按照提示在mac-slave 上pod install 了,但是还是报错
于是我就想,可能是pod repo 不一致导致的,我就pod repo update,然后pod install
再次构建就好了

4. 关于工作目录的问题
A.在slave节点配置工作目录的时候,当目录发生改变后,要记得断开与slave的连接,然后在手动连接下,不然会有找不到路劲的问题

B.还有一个问题就是,在一开始设置slave时,有个小技巧.ssh连接remote host时,可以直接连接userName@${remote host} ,不要连接root下的ssh
原因如下:其实我们的电脑本身就有一个ssh(可以理解为用户的意思),然后电脑上有管理员巴拉巴拉的用户(就是我们一般开机登录的那个用户).你连接不同的ssh作为slave其实没有影响,只是后期方便我自己查看工作目录下的文件方便而已(我是直接放当前用户的桌面的)

写在最后,其实Jenkins 的console log是很有用的,一般来说,你根据报错信息从后往前找,不是最后一个command有问题就是这个command 的参数或者上一步的条件有问题,大致方向就是这个吧。

    原文作者:Draven_Lu
    原文地址: https://www.jianshu.com/p/0cca1befa847
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞