Не удалось подписать сборку 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, который будет иметь доступ к пользовательской брелка).