iOS CI (Jenkins + Phabricator + Slack)

shellbrew install jenkins

然后 jenkins 启动,牛腩器中输入 127.0.0.1:8080 跳坑

Jenkins 里 xcode 相关插件装上

步骤别的博客都有,Google _ios ci 持续集成_,比如:

版本可能旧一点,但能脑补上

我们这用的 Phabricator,由于是 iOS,放在本地 Mac 上而非服务器,所以私钥配好就行了,Jenkins 和 Phabricator 回调交互啥的就不管了

另外主要遇到几个问题:

jenkins.plugins.slack.ActiveNotifier hudson.model.listeners npe

test 推送消息却好好的

弄了俩小时也不知怎么回事,睡一觉第二天正常了…

貌似知道原因了,Project Channel 那里不能为空

ResourceRules.plist

第一天 提示 ResourceRules.plist 不对, 于是在工程和 Jenkins 配置里都加了这个

Custom xcodebuild arguments $(SDKROOT)/ResourceRules.plist

结果第二天提示找不到 ResourceRules.plist,Jenkins 里删掉这个反而 OK 了,真奇葩

iPhone Developer: no identity found

swift-stdlib-tool failed with exit code 1

去 developer.apple.com 下载了各种证书,都不管用

实在没办法,直接用 xcode 打开了 ~/.jenkins/jobs/**** 下面的工程,想做个对比,结果发现 keychain 里多出来个证书,然后就 success 了…


另外企业账号还没买,Jenkins 没开账号系统,继续等坑

DUNS(邓白氏码)

之前企业账号一直卡在这里,苹果邮件迟迟没回应,所以一定要去电话苹果客服,一两天就 OK 了

bundle identifier

之前 company 账号中 .alpha .beta 占用掉了,企业账号这里无法创建相同的证书,只好删除原来账号里改 ID

结果删除时发现需要 app 需要是其中几个状态,官方文档:TransferringAndDeletingApps

之前 beta 作为 testflight,并没上传 AppStore,Email 苹果,回复:

Currently, your app does not have at least one approved version.

只好改了 ID

over the air distribution

万事俱备了,赶紧导出,结果发现 Xcode 6 之后,导 ipa 只有一个 .ipa 没有配套的 .plist,要自己手写…(还好 Jenkins 还能自动生成),大致长这样的:plist ($ $ 里对应的改一下)

然后python -m SimpleHTTPServer,iPhone 上 Safari 打开,结果… 还是不行…

后来发现服务器必须是 https 的…

build number

targets -> Build Phases -> + New Run Script Phase

1
2
3
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${PROJECT_DIR}/${INFOPLIST_FILE}")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"

这样 scheme 是 release 的时候,build 会自动 +1

PS:

其实这个可以写到 Jenkins build 步骤的 shell 中,然后 push 到 origin/master,再把 *.ipa 上传到服务器

OS X Server

坑,有时间整理一个

DistributionProvisioningProfiles

直接把下载的 *. mobileprovision,写路径发现是不行的,只好自己手动打包

1
2
3
xcodebuild -exportArchive -exportFormat IPA -archivePath "$Yourarchive" \
-exportPath imeican-Beta-xcodebuild.ipa \
-exportProvisioningProfile $YourDistributionProvisioningProfiles

总结:

一路走来一路坑