2012-03-08 26 views
15

Máy chủ xây dựng Jenkins CI của chúng tôi được thiết lập trên Mac Mini chạy OSX Lion (10.7.3) và tôi gặp sự cố khi đăng ký iOS để có thể tải lên để TestFlight.Không thể ký các bản dựng iOS với Jenkins

Quy trình đang chạy với tư cách người dùng bình thường có tên jenkins và quá trình này bắt đầu lúc khởi động bằng cách sử dụng launchd. (Máy không truy cập được với thế giới bên ngoài, vì vậy không nên có bất kỳ vấn đề an ninh với hoạt động này dưới một tài khoản người dùng bình thường.)

Đây là lỗi trong giao diện điều khiển đầu ra từ 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 

phần của vấn đề có vẻ là chỉ System Keychain có sẵn khi quá trình này được bắt đầu từ launchd lúc khởi động. Tôi đã thêm một kịch bản để xây dựng quy trình vào danh sách các móc khóa:

[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 

tôi đã có thể tìm thấy hai cách giải quyết, nhưng không ai thực sự khả thi:

  1. Nếu chúng ta đăng nhập vào máy chủ và khởi động lại quá trình launchd mỗi khi máy được khởi động lại sau đó jenkins là có thể tải keychain đăng nhập và truy cập vào các chứng chỉ cho ký:

    sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist 
    sudo launchctl load /Library/LaunchDaemons/org.jenkins-ci.plist 
    
  2. Chúng tôi có thể thêm chứng chỉ vào Keychain hệ thống, nhưng điều này có nghĩa là chúng tôi không thể sử dụng máy này để thực hiện các bản dựng phân phối cửa hàng ứng dụng của chúng tôi. (Xcode không thích keychain hệ thống).

Có ai khác tìm thấy bất kỳ giải pháp khả thi nào khác không? Có cái gì khác ngoài launchd mà tôi có thể sử dụng để chạy các tiến trình lúc khởi động trên OSX?

+0

Will Xcode vẫn có vấn đề nếu các phím cùng là _both_ trong Thông tin Đăng nhập- và keychain hệ thống? –

+0

Việc đặt các khóa ở cả hai nơi là một giải pháp khác mà tôi cho rằng, nhưng từ kinh nghiệm trước đây tôi biết nó thực sự có thể gây ra vấn đề với chương trình Keychain Access. Nó dường như bị lẫn lộn và sẽ không xóa các khóa tồn tại trong hai móc khóa. –

+1

Xem câu hỏi trao đổi ngăn xếp này cho một giải pháp khả thi: http://stackoverflow.com/questions/6827874/missing-certificates-and-keys-in-the-keychain-while-using-jenkins-hudson-as-cont –

Trả lời

21

Tôi đã giải quyết vấn đề này bằng cách thêm SessionCreate = true vào tệp org.jenkins-ci.plist của tôi. Cuộc gọi này khởi tạo khung bảo mật.

Nguồn: http://developer.apple.com/library/mac/#technotes/tn2083/_index.html

Xem tôi trọn vẹn dưới đây:

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

Điều này được xác nhận là làm việc cho tôi, vì vậy tôi đã chuyển dấu kiểm trả lời của mình. Đây là mảnh ghép cuối cùng của câu đố. Cảm ơn nhiều! –

+1

Xin chào, SessionCreate được đặt chính xác trong tệp .plist của tôi và các móc khóa danh sách bảo mật hiển thị chuỗi đăng nhập Jenkins nhưng tôi vẫn gặp lỗi tương tự khi xây dựng. Bất kỳ ý tưởng? – Claus

+0

Bạn đã khởi động lại hoặc khởi động lại jenkins chưa? Không chắc, có nhiều thứ có thể sai. Ngoài ra, hãy đảm bảo cặp chứng chỉ/khóa cá nhân nằm trong keychain của người dùng jenkins. Cuối cùng, nhấp chuột phải vào khóa của bạn và dưới quyền Kiểm soát truy cập cấp quyền truy cập cho tất cả các ứng dụng. – markshiz

3

Tôi đã gặp vấn đề tương tự. Vấn đề chính là thực sự gây ra khi launchd khởi chạy một LaunchDaemon. Ngay cả khi bạn chỉ định người dùng mà bạn muốn chạy quá trình launchd dưới nó sẽ không chạy nó như thể bạn đã đăng nhập với tư cách người dùng đó. Đó là lý do tại sao bạn không nhìn thấy keychain đăng nhập trong danh sách các móc khóa có sẵn cho Jenkins.

Tôi đã xem một công việc liên quan đến việc gọi số su - yourbuilduser -c ./start-jenkins.sh, trong đó start-jenkins.sh là tập lệnh bắt đầu tùy chỉnh, từ lệnh khởi chạy plist (dưới dạng LaunchDaemon). Điều này đảm bảo truy cập vào keychain đăng nhập nhưng làm cho Jenkins khó kiểm soát từ launchd. Cụ thể, bạn không thể dừng Jenkins bằng cách gọi số launctl unload ... bạn phải hủy quá trình thủ công.

Hiện tại, chúng tôi đang chạy CI của chúng tôi bằng plist trong LaunchAgents (chỉ khởi động Jenkins sử dụng java -jar jenkins.war) thay vì trong LaunchDaemons. Điều này có nghĩa là người dùng của bạn phải đăng nhập vào máy chủ (không phải vấn đề nếu máy của bạn nằm trong mạng riêng của bạn hoặc trong DMZ được định cấu hình chính xác), tuy nhiên cũng có nghĩa là quy trình Jenkins có thể được điều khiển từ launchctl và nó có truy cập vào keychain của người dùng. Bạn có thể đặt người dùng tự động đăng nhập để bạn có được Jenkins khi khởi động.

Tôi đã quản lý để tự động hóa hầu hết mọi khía cạnh của một kênh phân phối liên tục cho các tệp nhị phân iOS. Đây là phần duy nhất mà giải pháp của tôi không cảm thấy đúng (lý tưởng, tôi chỉ có thể sử dụng LaunchDaemon truy cập vào keychain của người dùng).

+0

Không chắc chắn tôi theo bạn, nhưng tôi nghĩ rằng những gì bạn đang nói là bạn có người dùng Jenkins được đặt thành Tự động Đăng nhập, và sau đó thêm một kịch bản lệnh shell làm một trong các Mục Đăng nhập của người dùng đó. Đúng không? –

+0

OK, không thêm plist vào/Library/LaunchDeamons, thêm nó vào/Users/youruserhere/Library/LaunchAgents rồi đặt người dùng đó để tự động đăng nhập. Ví dụ jenkins này sẽ có acces để 'keychain đăng nhập của youruserhere. Bạn có thể phải mở khóa nó trong công việc jenkins để xây dựng mã của bạn. –

+0

Rời khỏi người dùng Jenkins đã đăng nhập không phải là lý tưởng, nhưng nó không phải là một máy cắt giao dịch, và nó làm cho máy chủ xây dựng CI hoàn toàn tự động. Cảm ơn đã giúp đỡ! –

4

Bạn cũng có thể thử trình cài đặt Jenkins thay thế của mình chạy Jenkins như một ứng dụng.

Dự án là https://github.com/stisti/jenkins-app. Tải xuống tại https://github.com/stisti/jenkins-app/downloads

Jenkins cần chạy trong ngữ cảnh người dùng để có quyền truy cập vào móc khóa.

+1

Tôi ước gì tôi biết về dự án này cách đây vài tháng. –

+0

Điều này thực sự dễ cài đặt và sử dụng. Tốt hơn nhiều so với cách Jenkins được thiết lập theo mặc định cho mục đích của tôi. –

Các vấn đề liên quan