2012-03-08 10 views
15

Nasz serwer kompilacji Jenkins CI jest skonfigurowany na komputerze Mac Mini z systemem OSX Lion (10.7.3) i mam problem z uzyskaniem go do podpisania kompilacji systemu iOS, aby można było go przesłać do do TestFlight.Nie można podpisać kompilacji systemu iOS z Jenkinsem

Proces działa jako zwykły użytkownik o nazwie jenkins i jest uruchamiany podczas uruchamiania przy użyciu launchd. (Urządzenie nie jest przystosowany do zewnętrznego świata, więc nie powinno być żadnych problemów z bezpieczeństwem to działa w ramach normalnego konta użytkownika).

Oto błąd na wyjściu z konsoli 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 

Częścią problemu wydaje się, że tylko Brelok system dostępny jest, gdy proces rozpoczyna się od launchd w bagażniku. Dodałem skrypt do procesu budowania notować keychains:

[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 

udało mi się znaleźć dwa obejścia, ale żaden z nich jest naprawdę wykonalne:

  1. Jeśli zalogować się do serwera i ponownym uruchomieniu proces launchd za każdym razem komputer zostanie uruchomiony ponownie następnie Jenkins jest w stanie załadować pęk kluczy logowania i dostępu do podpisywania certyfikatów:

    sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist 
    sudo launchctl load /Library/LaunchDaemons/org.jenkins-ci.plist 
    
  2. Możemy dodać certyfikaty do kluczy systemowych, ale oznacza to, że nie możemy używać tego komputera do tworzenia naszych dystrybucji dystrybucji aplikacji. (Xcode nie lubi pęku kluczy systemu).

Czy ktoś inny znalazł inne możliwe rozwiązania? Czy jest coś jeszcze oprócz launchd, którego mogę używać do uruchamiania procesów podczas uruchamiania w systemie OSX?

+0

Will Xcode wciąż mają problemy, jeżeli te same klucze są _both_ w login- i pęku kluczy systemu? –

+0

Umieszczenie kluczy w obu miejscach to kolejne obejście, ale z doświadczenia wiem, że naprawdę może powodować problemy z programem dostępu do pęku kluczy. Wydaje się być zagubiony i nie usuwa kluczy, które istnieją w dwóch brelokach. –

+1

Zobacz pytanie dotyczące wymiany stosów na dostępne rozwiązanie: http://stackoverflow.com/questions/6827874/missing-certificates-and-keys-in-the-keychain-while-using-jenkins-hudson-as-cont –

Odpowiedz

21

Rozwiązałem ten problem, dodając SessionCreate = true do mojego pliku org.jenkins-ci.plist. To połączenie inicjuje system zabezpieczeń.

Źródło: http://developer.apple.com/library/mac/#technotes/tn2083/_index.html

Zobacz kopalni w całości poniżej:

<?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

Potwierdzono, że działa również dla mnie, więc zmieniłem znacznik wyboru mojej odpowiedzi. To był ostatni brakujący element układanki. Dziękuję Ci bardzo! –

+1

Witaj, SessionCreate jest poprawnie umieszczona w moim pliku .plist, a lista zabezpieczeń - breloki wyświetlają Jenkins login.keychain, ale nadal otrzymuję ten sam błąd podczas budowania. Dowolny pomysł? – Claus

+0

Czy zrestartowałeś lub zrestartowałeś jenkins? Nie jestem pewien, jest wiele rzeczy, które mogą pójść nie tak. Upewnij się również, że para kluczy certyfikatu/klucza prywatnego znajduje się w pęku kluczy użytkownika Jenkins. Na koniec kliknij prawym przyciskiem myszy i pod dostępem Kontrola dostępu uzyskaj dostęp do wszystkich aplikacji. – markshiz

3

Miałem ten sam problem. Główny problem jest spowodowany, gdy launchd uruchamia LaunchDaemon. Nawet jeśli określisz użytkownika, dla którego chcesz uruchomić proces launchd, nie uruchomisz go tak, jakbyś był zalogowany jako ten użytkownik. Właśnie dlatego nie widzisz łańcucha kluczy logowania na liście breloków dostępnych dla Jenkinsa.

Natknąłem się na pracę związaną z wywoływaniem su - yourbuilduser -c ./start-jenkins.sh, gdzie start-jenkins.sh jest niestandardowym skryptem startowym z pliku launchd plist (jako LaunchDaemon). To gwarantuje dostęp do pęku kluczy logowania, ale sprawia, że ​​Jenkins jest trudny do opanowania przez launchd. W szczególności, nie możesz zatrzymać Jenkinsa dzwoniąc pod numer launctl unload ..., musisz zabić proces ręcznie.

Obecnie korzystamy z naszego iOS CI, używając plist w LaunchAgents (który po prostu uruchamia Jenkinsa używając java -jar jenkins.war) zamiast w LaunchDaemons. Żmudne oznacza to, że twój użytkownik musi być zalogowany na serwerze (nie jest to problem, jeśli twój komputer znajduje się w twojej prywatnej sieci lub w poprawnie skonfigurowanym DMZ), ale oznacza to również, że proces Jenkinsa można kontrolować z poziomu launchctl i że ma on dostęp do pęku kluczy użytkownika. Możesz ustawić użytkownika tak, aby automatycznie logował się, aby uzyskać Jenkinsa podczas uruchamiania.

Udało mi się zautomatyzować prawie każdy aspekt rurociągu dostawy ciągłej dla plików binarnych iOS. Jest to jedyna część, w której moje rozwiązanie nie jest właściwe (najlepiej, gdybym mógł skorzystać z LaunchDaemon, który miałby dostęp do pęku kluczy użytkownika).

+0

Nie jestem pewien, czy podążam Ty, ale myślę, że mówisz, że masz użytkownika Jenkins ustawionego na Automatyczne logowanie, a następnie dodałeś skrypt powłoki jako jeden z elementów logowania tego użytkownika. Czy to jest poprawne? –

+0

OK, nie dodawaj plist do/Library/LaunchDeamons, dodaj go do/Users/youruserhere/Library/LaunchAgents, a następnie ustaw tego użytkownika na automatyczne logowanie. Ta instancja Jennkins będzie miała dostęp do keychain logowania użytkownika youruserhere. Być może będziesz musiał odblokować go podczas pracy z dżinsami, która buduje twój kod. –

+0

Pozostawienie zalogowanego użytkownika Jenkins nie jest idealne, ale nie jest to przełamanie umowy i powoduje, że serwer CI jest w pełni zautomatyzowany. Dzięki za pomoc! –

4

Możesz także wypróbować mój alternatywny instalator Jenkinsa, który uruchamia aplikację Jenkins jako aplikację.

Projekt ma numer https://github.com/stisti/jenkins-app. Pliki do pobrania są na https://github.com/stisti/jenkins-app/downloads

Jenkins musi działać w kontekście użytkownika, aby mieć dostęp do pęku kluczy.

+1

Chciałbym wiedzieć o tym projekcie kilka miesięcy temu. –

+0

To jest naprawdę łatwe w konfiguracji i obsłudze. Znacznie lepsze niż domyślne ustawienie Jenkinsa dla moich celów. –

Powiązane problemy