Не удалось подписать сборку iOS с Jenkins
Наш сервер сборки Jenkins CI настроен на Mac Mini, работающем с OSX Lion (10.7.3), и у меня возникли проблемы с его подпиской на сборки iOS, чтобы их можно было загрузить в TestFlight.
Процесс выполняется как обычный пользователь с именем jenkins, и он запускается во время загрузки с помощью запуска. (Машина не доступна для внешнего мира, поэтому не должно быть никаких проблем с безопасностью при работе с обычной учетной записью пользователя.)
Вот ошибка на выходе консоли от 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
Отчасти проблема заключается в том, что доступен только системный брелок, когда процесс запускается с запуска при загрузке. Я добавил процесс script в процесс сборки, чтобы перечислить цепочки ключей:
[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
Мне удалось найти два обходных пути, но ни один из них не выполним:
-
Если мы заходим на сервер и перезапускаем процесс запуска каждый раз, когда машина перезагружается, тогда jenkins может загрузить логин-логин и получить доступ к сертификатам для подписания:
sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist
sudo launchctl load /Library/LaunchDaemons/org.jenkins-ci.plist
-
Мы можем добавить сертификаты в системную брелок, но это означает, что мы не можем использовать этот компьютер для создания наших дистрибутивов дистрибутива хранилища. (Xcode не любит системный брелок).
Кто-нибудь еще нашел какие-нибудь другие жизнеспособные обходные пути? Есть ли что-то еще помимо launchd, которое я могу использовать для запуска процессов во время загрузки на OSX?
Ответы
Ответ 1
Я решил эту проблему, добавив SessionCreate = true в мой файл org.jenkins-ci.plist. Этот вызов инициализирует структуру безопасности.
Источник: http://developer.apple.com/library/mac/#technotes/tn2083/_index.html
См. мои целиком ниже:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>EnvironmentVariables</key>
<dict>
<key>JENKINS_HOME</key>
<string>/Users/Shared/Jenkins/Home</string>
</dict>
<key>GroupName</key>
<string>daemon</string>
<key>KeepAlive</key>
<true/>
<key>Label</key>
<string>org.jenkins-ci</string>
<key>ProgramArguments</key>
<array>
<string>/bin/bash</string>
<string>/Library/Application Support/Jenkins/jenkins-runner.sh</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>UserName</key>
<string>jenkins</string>
<key>SessionCreate</key>
<true/>
</dict>
</plist>
Ответ 2
Вы также можете попробовать мой альтернативный установщик Jenkins, который запускает Jenkins в качестве приложения.
Проект находится в https://github.com/stisti/jenkins-app.
Загрузки находятся на https://github.com/stisti/jenkins-app/downloads
Jenkins нужно запускать в пользовательском контексте, чтобы иметь доступ к связующим звеньям.
Ответ 3
У меня была та же проблема. Основная проблема на самом деле возникает, когда launchd запускает LaunchDaemon. Даже если вы укажете, что пользователь, которому вы хотите запустить процесс запуска под ним, не запускает его, как если бы вы вошли в систему как этот пользователь. Вот почему вы не видите брелок для входа в список цепочек ключей, доступных Jenkins.
Я столкнулся с работой, связанной с вызовом su - yourbuilduser -c ./start-jenkins.sh
, где start-jenkins.sh
- это пользовательский старт script, с вашего плагина запуска (как LaunchDaemon). Это гарантирует доступ к брелка для входа в систему, но Jenkins трудно контролировать с помощью запуска. В частности, вы не можете остановить Jenkins, вызвав launctl unload ...
, вам нужно вручную удалить этот процесс.
В настоящее время мы запускаем наш iOS CI, используя plist в LaunchAgents (который только запускает Jenkins с использованием java -jar jenkins.war
), а не в LaunchDaemons. Это означает, что ваш пользователь должен быть зарегистрирован на сервере (не проблема, если ваш компьютер находится в вашей частной сети или в правильно настроенной DMZ), однако это также означает, что процесс Jenkins можно контролировать с помощью launchctll и что он имеет доступ к пользовательской цепочке ключей. Вы можете настроить пользователя на автоматический вход, чтобы вы запустили Jenkins при запуске.
Мне удалось автоматизировать практически все аспекты конвейера непрерывной доставки для двоичных файлов iOS, это единственная часть, в которой мое решение просто не кажется правильным (в идеале я просто смогу использовать LaunchDaemon, который будет иметь доступ к пользовательской брелка).