Невозможно подписать сборки iOS с помощью Jenkins - PullRequest
15 голосов
/ 09 марта 2012

Наш сервер сборки 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

Мне удалось найти два обходных пути, но ни один из них на самом деле не осуществим:

  1. Если мы войдем на сервер и перезапустим процесс launchd каждый раз, когда машина перезагружается , тогда jenkins сможет загрузить цепочку ключей входа и получить доступ к сертификатам для подписи:

    sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist
    sudo launchctl load /Library/LaunchDaemons/org.jenkins-ci.plist
    
  2. Мы можем добавить сертификаты в системную связку ключей, но это означает, что мы не можем использовать эту машину для выполнения наших сборок дистрибутива магазина приложений. (Xcode не нравится системная цепочка для ключей).

Кто-нибудь еще нашел другие приемлемые обходные пути? Есть ли что-то еще, кроме launchd, которое я могу использовать для запуска процессов во время загрузки на OSX?

Ответы [ 3 ]

21 голосов
/ 30 апреля 2012

Я решил эту проблему, добавив 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>
4 голосов
/ 28 марта 2012

Вы также можете попробовать мой альтернативный установщик Jenkins, который запускает Jenkins как приложение.

Проект на https://github.com/stisti/jenkins-app. Загрузки в https://github.com/stisti/jenkins-app/downloads

Дженкинс должен работать в контексте пользователя, чтобы иметь доступ к цепочкам ключей.

3 голосов
/ 09 марта 2012

У меня была такая же проблема.Основная проблема на самом деле возникает, когда launchd запускает LaunchDaemon.Даже если вы укажете пользователя, для которого вы хотите запустить процесс launchd, он не запустится так, как если бы вы вошли в систему как этот пользователь.Вот почему вы не видите цепочку ключей входа в список доступных цепочек ключей для Дженкинса.

Я наткнулся на работу, связанную с вызовом su - yourbuilduser -c ./start-jenkins.sh, где start-jenkins.sh - это собственный скрипт запуска,ваш список запуска (как LaunchDaemon).Это гарантирует доступ к цепочке ключей входа в систему, но затрудняет управление Jenkins при запуске.В частности, вы не можете остановить Jenkins, вызвав launctl unload ..., вам нужно вручную завершить процесс.

В настоящее время мы запускаем наш iOS CI, используя plist в LaunchAgents (который просто запускает Jenkins, используя java -jar jenkins.war).чем в LaunchDaemons.Утомительно это означает, что ваш пользователь должен войти в систему на сервере (не проблема, если ваша машина находится в вашей частной сети или в правильно настроенной DMZ), однако это также означает, что процессом Jenkins можно управлять из launchctl и что он имеетдоступ к связке ключей пользователя.Вы можете настроить для пользователя автоматический вход в систему, чтобы при запуске Дженкинс работал.

Мне удалось автоматизировать почти каждый аспект конвейера непрерывной доставки для двоичных файлов iOS, это единственная часть, в которой мое решение просто не подходит.не правильно (в идеале, я бы просто мог использовать LaunchDaemon, у которого был бы доступ к цепочке для ключей пользователя).

...