Наш сервер сборки Jenkins CI настроен на Mac Mini, работающем под управлением OSX Lion (10.7.3), и у меня возникают проблемы с тем, чтобы он подписывал сборки iOS, чтобы их можно было загружать в TestFlight.
Процесс выполняется как обычный пользователь с именем jenkins, и он запускается во время загрузки с помощью launchd. (Машина недоступна для внешнего мира, поэтому не должно быть проблем с безопасностью при ее запуске под учетной записью обычного пользователя.)
Вот ошибка в выводе консоли от jenkins:
[workspace] $ /usr/bin/xcodebuild -target iMobileStCloud -configuration Release clean build
=== CLEAN NATIVE TARGET MyApp OF PROJECT MyProject WITH CONFIGURATION Release ===
Check dependencies
[BEROR]Code Sign error: The identity 'iPhone Distribution' doesn't match any valid certificate/private key pair in the default keychain
Частично проблема заключается в том, что только системная цепочка для ключей доступна, когда процесс запускается из launchd при загрузке. Я добавил скрипт в процесс сборки, чтобы вывести список цепочек для ключей:
[workspace] $ /bin/sh -xe /var/folders/1y/1q3st_ss58z9ffj4dwbkdw8r0000gt/T/hudson8514187812830984272.sh
+ /usr/bin/security list-keychains
"/Library/Keychains/System.keychain"
"/Library/Keychains/applepushserviced.keychain"
"/Library/Keychains/System.keychain"
+ /usr/bin/security find-identity
Мне удалось найти два обходных пути, но ни один из них на самом деле не осуществим:
Если мы войдем на сервер и перезапустим процесс launchd каждый раз, когда машина перезагружается , тогда jenkins сможет загрузить цепочку ключей входа и получить доступ к сертификатам для подписи:
sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist
sudo launchctl load /Library/LaunchDaemons/org.jenkins-ci.plist
Мы можем добавить сертификаты в системную связку ключей, но это означает, что мы не можем использовать эту машину для выполнения наших сборок дистрибутива магазина приложений. (Xcode не нравится системная цепочка для ключей).
Кто-нибудь еще нашел другие приемлемые обходные пути? Есть ли что-то еще, кроме launchd, которое я могу использовать для запуска процессов во время загрузки на OSX?