Резюме:
Установка Jenkins в OS X значительно упростилась с помощью самого последнего установщика (по состоянию на 1.449 - 9 марта 2012 г. ), однако управление процессом подписания кода по-прежнему очень сложно, и нет однозначного ответа.
Мотивация:
Запустите безголовый CI-сервер, который следует общепринятым рекомендациям по запуску служб в OS X ( некоторые из которых объясняются здесь простым языком ).
Задний план:
- 12 октября 2009 г. - Как автоматизировать сборку приложений для iPhone с помощью Hudson.
- 15 июня 2011 г. - Jenkins на Mac OS X; git с открытым ключом ssh
- 23 июня 2011 г. - непрерывное развертывание приложений iOS с помощью Jenkins и TestFlight.
- 26 июля 2011 г. - Отсутствуют сертификаты и ключи в связке для ключей при использовании Jenkins / Hudson в качестве непрерывной интеграции для разработки под iOS и Mac.
- 30 августа 2011 г. - файл подготовки Xcode не найден с Jenkins.
- 20 сентября 2011 г. - Как настроить Jenkins CI на Mac
- 14 сентября 2011 г. - Запуск Jenkins на Mac
- 12 ноября 2011 г. - Как : установить Jenkins в OS X и заставить его собирать материалы для Mac
- 23 января 2012 г. - Предстоящие изменения установщика Jenkins OSX
- 7 марта 2012 г. - Благодарим за использование установщика OSX
Обработать:
Установите Jenkins CI через OS X установочного пакета . Для шага «Тип установки» нажмите кнопку «Настроить» и выберите «Начать при загрузке как 'jenkins'».
Обсуждение:
Наивное ожидание на тот момент заключалось в том, что проект в свободном стиле со сценарием сборки xcodebuild -target MyTarget -sdk iphoneos
должен работать. Как указано в заголовке этого сообщения, этого не происходит и не удается:
Code Sign error: The identity 'iPhone Developer' doesn't match any valid certificate/private key pair in the default keychain
Достаточно очевидно, что должно произойти - вам нужно добавить действующий сертификат подписи кода и закрытый ключ в цепочку ключей по умолчанию. Исследуя, как этого добиться, я не нашел решения, которое не открывало бы систему до некоторого уровня уязвимости.
Проблема 1: нет связки ключей по умолчанию для демона jenkins
sudo -u jenkins security default-keychain
... выдает "Связку ключей по умолчанию не удалось найти"
Как указано ниже Иво Дансет , для UserShell по умолчанию установлено значение / usr / bin / false для демона jenkins (я думаю, что это особенность, а не ошибка); следуйте его ответу, чтобы изменить UserShell на bash. Затем вы можете использовать sudo su jenkins
его, чтобы войти в систему как пользователь jenkins и получить приглашение bash.
sudo su jenkins
cd ~/Library
mkdir Keychains
cd Keychains
security create-keychain <keychain-name>.keychain
security default-keychain -s <keychain-name>.keychain
Хорошо, отлично. Теперь у нас есть связка ключей по умолчанию; пойдем дальше правильно? Но, во-первых, почему мы вообще потрудились сделать связку ключей по умолчанию?
Почти все ответы, предложения или разговоры, которые я читал во время исследования, предполагают, что нужно просто забросить свои сертификаты подписи кода и ключи в системную связку ключей. Если вы запустите security list-keychains
в Jenkins проект свободного стиля, вы увидите, что единственная доступная связка ключей - это системная связка ключей; Думаю, именно здесь большинству людей пришла в голову идея поместить туда свой сертификат и ключ. Но это кажется очень плохой идеей, особенно с учетом того, что вам нужно создать текстовый скрипт с паролем, чтобы открыть связку ключей .
Проблема 2: Добавление сертификатов подписи кода и закрытого ключа
Здесь я действительно начинаю проявлять брезгливость. У меня интуитивное предчувствие, что я должен создать новый открытый / закрытый ключ, уникальный для использования с Jenkins. Я думаю, что если демон jenkins скомпрометирован, я могу легко отозвать сертификат на портале подготовки Apple и сгенерировать другой открытый / закрытый ключ. Если я использую один и тот же ключ и сертификат для своей учетной записи и Jenkins, это означает больше хлопот (повреждений?), Если служба jenkins будет атакована.
Указывая на ответ Саймона Урбанека, вы разблокируете связку ключей из сценария с паролем в виде простого текста. Кажется безответственным хранить что-либо, кроме «одноразовых» сертификатов и ключей в связке ключей демона jenkins.
Мне очень интересно любое обсуждение обратного. Я слишком осторожен?
Чтобы создать новый CSR в качестве демона jenkins в Терминале, я сделал следующее ...
sudo su jenkins
certtool r CertificateSigningRequest.certSigningRequest
Вам будет предложено ввести следующее (в большинстве случаев я сделал обоснованные предположения относительно правильного ответа; у вас есть более глубокое понимание? Пожалуйста, поделитесь.) ...- Введите ключ и метку сертификата:
- Выберите алгоритм:
r
(для RSA) - Введите размер ключа в битах:
2048
- Выберите алгоритм подписи:
5
(для MD5) - Введите строку вызова:
- Потом куча вопросов к РДН
- Отправьте созданный файл CSR (CertificateSigningRequest.certSigningRequest) на портал подготовки Apple под новым идентификатором Apple ID.
- Подтвердите запрос и загрузите файл .cer
security unlock-keychain
security add-certificate ios_development.cer
Это приближает нас на один шаг ...
Проблема 3: профиль инициализации и разблокировка связки ключей
Я создал специальный профиль обеспечения на портале Provisioning Portal только для использования с CI в надежде, что если произойдет что-то плохое, я уменьшу влияние. Лучшая практика или чрезмерная осторожность?
sudo su jenkins
mkdir ~/Library/MobileDevice
mkdir ~/Library/MobileDevice/Provisioning\ Profiles
- Переместите профиль обеспечения, который вы настроили на портале Provisioning Portal, в эту новую папку. Теперь мы в двух шагах от возможности запускать xcodebuild из командной строки от имени jenkins, а это значит, что мы также близки к возможности запускать сборки Jenkins CI.
security unlock-keychain -p <keychain password>
xcodebuild -target MyTarget -sdk iphoneos
Теперь мы получаем успешную сборку из командной строки при входе в систему как демон jenkins, поэтому, если мы создадим проект в свободном стиле и добавим эти последние два шага (# 5 и # 6 выше), мы сможем автоматизировать сборку наш проект iOS!
Возможно, в этом нет необходимости, но я чувствовал себя лучше, вернув jenkins UserShell обратно в / usr / bin / false после того, как я успешно выполнил всю эту настройку. Я параноик?
Проблема 4: Связка ключей по умолчанию все еще недоступна!
( РЕДАКТИРОВАТЬ: я опубликовал правки в свой вопрос, перезагрузился, чтобы убедиться, что мое решение было на 100%, и, конечно же, я пропустил шаг )
Даже после всех вышеперечисленных шагов вам нужно будет изменить список Launch Daemon в /Library/LaunchDaemons/org.jenkins-ci.plist, как указано в этом ответе . Обратите внимание, что это тоже ошибка openrdar .
Должно получиться так:
<?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>
<!-- **NEW STUFF** -->
<key>SessionCreate</key>
<true />
</dict>
</plist>
С такой настройкой я также рекомендовал бы плагин Xcode для Jenkins , который немного упрощает настройку скрипта xcodebuild. На этом этапе я также рекомендую прочитать страницы руководства по xcodebuild - черт возьми, вы так далеко зашли в Терминале, верно?
Эта установка не идеальна, и мы будем благодарны за любые советы или идеи.
Мне было нелегко выбрать «правильный» ответ, поскольку для решения своей проблемы я использовал коллекцию мнений почти всех. Я попытался дать всем хотя бы один голос, но награду ответ Саймону, потому что он в основном отвечал на исходный вопрос. Кроме того, Сами Тикка заслуживает большой похвалы за свои усилия по тому, чтобы Дженкинс работал через AppleScript как простое приложение для OS X. Если вы заинтересованы только в том, чтобы Дженкинс начал работать и быстро работать в рамках вашего пользовательского сеанса (то есть не в качестве безголового сервера), его решение гораздо больше похоже на Mac.
Я надеюсь, что мои усилия вызовут дальнейшее обсуждение и помогут следующей бедной душе, которая приходит в голову, думая, что сможет настроить Jenkins CI для своих проектов iOS за выходные из-за всех замечательных вещей, которые они слышали об этом.
Обновление: 9 августа 2013 г.
Я подумал, что вернусь к этому 18 месяцев спустя с таким количеством голосов и фаворитов, извлекая некоторые краткие уроки.
Урок 1. Не раскрывайте Дженкинса в Интернете
На WWDC 2012 года я задал этот вопрос инженерам Xcode и OS X Server. Я получил какофонию «не делай этого!» ни от кого я спросил. Все они согласились, что автоматизированный процесс сборки - это здорово, но сервер должен быть доступен только в локальной сети. Инженеры OS X Server предложили разрешить удаленный доступ через VPN.
Урок 2. Теперь есть новые варианты установки
Недавно я рассказывал о своем опыте работы с Jenkins в CocoaHeads и, к своему большому удивлению, обнаружил несколько новых методов установки - Homebrew и даже версию Bitnami для Mac App Store . Это определенно стоит проверить. Джонатан Райт подробно описывает, как заставить Homebrew Jenkins работать .
Урок 3: Нет, серьезно, не выкладывайте свою сборку в Интернет
Из исходного сообщения довольно ясно, что я не системный администратор и не эксперт по безопасности. Здравый смысл в отношении личных вещей (брелки, учетные данные, сертификаты и т. Д.) Заставил меня чувствовать себя довольно неловко, когда я размещал свой ящик Jenkins в Интернете. Ник Арнотт из Neglected Potential довольно легко смог подтвердить мои хиби-джиби в этой статье .
TL; DR
Моя рекомендация другим, кто хочет автоматизировать процесс сборки, изменилась за последние полтора года. Убедитесь, что ваша машина Jenkins находится за вашим брандмауэром. Установите и настройте Jenkins в качестве специального пользователя Jenkins с помощью установщика, версии Bitnami Mac App Store, AppleScript Сами Тикки и т. Д .; это решает большую часть головной боли, о которой я подробно рассказал выше. Если вам нужен удаленный доступ, настройка служб VPN в OS X Server занимает максимум десять минут. Я использую эту установку более года и очень ей доволен. Удачи!