Tóm lược:
Việc thiết lập Jenkins trên OS X đã trở nên dễ dàng hơn đáng kể với trình cài đặt gần đây nhất ( kể từ 1.449 - ngày 9 tháng 3 năm 2012 ), tuy nhiên việc quản lý quá trình ký mã vẫn rất khó khăn và không có câu trả lời đơn giản.
Động lực:
Chạy một máy chủ CI không có đầu tuân theo các phương pháp hay nhất phổ biến để chạy các dịch vụ trên OS X ( Một số trong số đó được giải thích ở đây bằng ngôn ngữ đơn giản ).
Lý lịch:
- Ngày 12 tháng 10 năm 2009 - Cách tự động hóa các bản dựng ứng dụng iPhone của bạn với Hudson
- Ngày 15 tháng 6 năm 2011 - Jenkins trên Mac OS X; khóa công khai git w / ssh
- Ngày 23 tháng 6 năm 2011 - Triển khai liên tục các ứng dụng iOS với Jenkins và TestFlight
- Ngày 26 tháng 7 năm 2011 - Thiếu chứng chỉ và khóa trong chuỗi khóa khi sử dụng Jenkins / Hudson làm Tích hợp liên tục cho phát triển iOS và Mac
- Ngày 30 tháng 8 năm 2011 - Không tìm thấy Tệp cấp phép Xcode với Jenkins
- Ngày 20 tháng 9 năm 2011 - Cách thiết lập Jenkins CI trên máy Mac
- Ngày 14 tháng 9 năm 2011 - Bắt Jenkins chạy trên máy Mac
- Ngày 12 tháng 11 năm 2011 - Cách thực hiện: Cài đặt Jenkins trên OS X và làm cho nó xây dựng các công cụ Mac
- Ngày 23 tháng 1 năm 2012 - Các thay đổi sắp tới của trình cài đặt Jenkins OSX
- Ngày 7 tháng 3 năm 2012 - Cảm ơn bạn đã sử dụng OSX Installer
Quá trình:
Cài đặt Jenkins CI qua OS X gói cài đặt . Đối với bước "Loại cài đặt", hãy nhấp vào nút Tùy chỉnh và chọn "Bắt đầu khi khởi động với tên 'jenkins.'"
Thảo luận:
Kỳ vọng ngây thơ vào thời điểm này là một dự án theo phong cách tự do với kịch bản xây dựng xcodebuild -target MyTarget -sdk iphoneos
sẽ hoạt động. Như được chỉ ra bởi tiêu đề của bài đăng này, nó không và không thành công với:
Code Sign error: The identity 'iPhone Developer' doesn't match any valid certificate/private key pair in the default keychain
Rõ ràng là những gì cần phải xảy ra - bạn cần thêm chứng chỉ ký mã hợp lệ và khóa cá nhân vào chuỗi khóa mặc định. Trong quá trình nghiên cứu cách thực hiện điều này, tôi đã không tìm thấy giải pháp nào không mở ra hệ thống ở một mức độ dễ bị tổn thương nào đó.
Vấn đề 1: Không có chuỗi khóa mặc định cho daemon jenkins
sudo -u jenkins security default-keychain
... cho ra "Không tìm thấy chuỗi khóa mặc định"
Như đã chỉ ra bên dưới bởi Ivo Dancet , UserShell được đặt thành / usr / bin / false cho daemon jenkins theo mặc định (tôi nghĩ đây là một tính năng, không phải lỗi); làm theo câu trả lời của anh ấy để thay đổi UserShell thành bash. Sau đó, bạn có thể sử dụng sudo su jenkins
để đăng nhập với tư cách người dùng jenkins và nhận được lời nhắc bash.
sudo su jenkins
cd ~/Library
mkdir Keychains
cd Keychains
security create-keychain <keychain-name>.keychain
security default-keychain -s <keychain-name>.keychain
Rất tốt. Bây giờ chúng tôi đã có một chuỗi khóa mặc định; chúng ta hãy tiếp tục phải không? Nhưng, trước tiên, tại sao chúng tôi thậm chí còn bận tâm tạo một chuỗi khóa mặc định?
Hầu hết tất cả các câu trả lời, đề xuất hoặc cuộc trò chuyện mà tôi đã đọc trong suốt quá trình nghiên cứu đều gợi ý rằng người ta chỉ nên đưa các chứng chỉ và khóa ký mã của họ vào chuỗi khóa hệ thống. Nếu bạn chạy security list-keychains
như một dự án kiểu tự do trong Jenkins, bạn thấy rằng chuỗi khóa duy nhất có sẵn là chuỗi khóa hệ thống; Tôi nghĩ rằng đó là nơi mà hầu hết mọi người nảy ra ý tưởng đặt chứng chỉ và chìa khóa của họ vào đó. Tuy nhiên, đây có vẻ là một ý tưởng rất tồi - đặc biệt là bạn sẽ cần phải tạo một tập lệnh văn bản thuần túy với mật khẩu để mở chuỗi khóa .
Vấn đề 2: Thêm chứng chỉ ký mã và khóa cá nhân
Đây là nơi tôi thực sự bắt đầu cảm thấy khó chịu. Tôi có cảm giác rằng tôi nên tạo một khóa công khai / riêng tư mới duy nhất để sử dụng với Jenkins. Quá trình suy nghĩ của tôi là nếu daemon jenkins bị xâm phạm, thì tôi có thể dễ dàng thu hồi chứng chỉ trong Cổng cấp phép của Apple và tạo một khóa công khai / riêng tư khác. Nếu tôi sử dụng cùng một khóa và chứng chỉ cho tài khoản người dùng của mình và Jenkins, thì điều đó có nghĩa là rắc rối hơn (thiệt hại?) Nếu dịch vụ jenkins bị tấn công.
Chỉ vào câu trả lời của Simon Urbanek, bạn sẽ mở khóa chuỗi khóa từ một tập lệnh với mật khẩu văn bản thuần túy. Có vẻ như vô trách nhiệm khi giữ bất cứ thứ gì ngoại trừ các chứng chỉ và chìa khóa "dùng một lần" trong móc khóa của jenkins daemon.
Tôi rất quan tâm đến bất kỳ cuộc thảo luận nào ngược lại. Tôi có đang thận trọng quá mức không?
Để tạo CSR mới dưới dạng daemon jenkins trong Terminal, tôi đã làm như sau ...
sudo su jenkins
certtool r CertificateSigningRequest.certSigningRequest
Bạn sẽ được nhắc về những điều sau đây (hầu hết những điều này tôi đã phỏng đoán có học thức để đưa ra câu trả lời chính xác; bạn có cái nhìn sâu sắc hơn không? Vui lòng chia sẻ.) ...- Nhập khóa và nhãn chứng chỉ:
- Chọn thuật toán:
r
(cho RSA) - Nhập kích thước khóa theo bit:
2048
- Chọn thuật toán chữ ký:
5
(cho MD5) - Nhập chuỗi thử thách:
- Sau đó, một loạt các câu hỏi cho RDN
- Gửi tệp CSR đã tạo (CertificateSignedRequest.certSignsRequest) tới Cổng cấp phép của Apple theo ID Apple mới
- Phê duyệt yêu cầu và tải xuống tệp .cer
security unlock-keychain
security add-certificate ios_development.cer
Điều này đưa chúng ta đến gần hơn một bước ...
Sự cố 3: Hồ sơ cấp phép và mở khóa chuỗi khóa
Tôi đã tạo một hồ sơ cấp phép đặc biệt trong Cổng cung cấp chỉ để sử dụng với CI với hy vọng rằng nếu điều gì đó xấu xảy ra, tôi sẽ làm cho tác động nhỏ hơn một chút. Thực hành tốt nhất hay thận trọng quá mức?
sudo su jenkins
mkdir ~/Library/MobileDevice
mkdir ~/Library/MobileDevice/Provisioning\ Profiles
- Di chuyển hồ sơ cấp phép mà bạn thiết lập trong Cổng cấp phép vào thư mục mới này. Bây giờ chúng ta chỉ còn hai bước ngắn nữa là có thể chạy xcodebuild từ dòng lệnh dưới dạng jenkins và điều đó có nghĩa là chúng ta cũng sắp có thể chạy các bản dựng Jenkins CI.
security unlock-keychain -p <keychain password>
xcodebuild -target MyTarget -sdk iphoneos
Bây giờ chúng ta có một bản dựng thành công từ một dòng lệnh khi đăng nhập bằng daemon jenkins, vì vậy nếu chúng ta tạo một dự án kiểu tự do và thêm hai bước cuối cùng đó (# 5 và # 6 ở trên), chúng ta sẽ có thể tự động hóa việc xây dựng dự án iOS của chúng tôi!
Nó có thể không cần thiết, nhưng tôi cảm thấy tốt hơn nên đặt jenkins UserShell trở lại / usr / bin / false sau khi tôi đã nhận thành công tất cả thiết lập này. Tôi có bị hoang tưởng không?
Sự cố 4: Chuỗi khóa mặc định vẫn không khả dụng!
( CHỈNH SỬA: Tôi đã đăng các chỉnh sửa cho câu hỏi của mình, khởi động lại để đảm bảo rằng giải pháp của tôi là 100% và tất nhiên, tôi đã bỏ qua một bước )
Ngay cả sau tất cả các bước trên, bạn sẽ cần phải sửa đổi danh sách Launch Daemon tại /Library/LaunchDaemons/org.jenkins-ci.plist như đã nêu trong câu trả lời này . Xin lưu ý rằng đây cũng là một lỗi openrdar .
Nó sẽ giống như thế nà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>
<!-- **NEW STUFF** -->
<key>SessionCreate</key>
<true />
</dict>
</plist>
Với thiết lập này, tôi cũng muốn giới thiệu plugin Xcode cho Jenkins , giúp thiết lập tập lệnh xcodebuild dễ dàng hơn một chút. Tại thời điểm này, tôi cũng khuyên bạn nên đọc các trang người đàn ông cho xcodebuild - bạn đã làm được điều đó đến mức này trong Terminal, phải không?
Thiết lập này không hoàn hảo và bất kỳ lời khuyên hoặc thông tin chi tiết nào đều được đánh giá cao.
Tôi đã gặp khó khăn khi chọn một câu trả lời "đúng" vì những gì tôi thường sử dụng để giải quyết vấn đề của mình là một tập hợp tất cả mọi người. Tôi đã cố gắng đưa ra cho mọi người ít nhất một phiếu ủng hộ, nhưng trao câu trả lời cho Simon vì anh ấy chủ yếu trả lời câu hỏi ban đầu. Hơn nữa, Sami Tikka xứng đáng được ghi nhận rất nhiều vì những nỗ lực của anh ấy đã khiến Jenkins hoạt động thông qua AppleScript như một ứng dụng OS X đơn giản. Nếu bạn chỉ quan tâm đến việc Jenkins khởi động và tiến hành nhanh chóng trong phiên người dùng của mình (tức là không phải là một máy chủ không đầu) thì giải pháp của anh ấy giống Mac hơn nhiều.
Tôi hy vọng rằng những nỗ lực của tôi sẽ khơi dậy cuộc thảo luận sâu hơn và giúp những người nghèo tiếp theo nghĩ rằng họ có thể thiết lập Jenkins CI cho các dự án iOS của họ trong một ngày cuối tuần vì tất cả những điều tuyệt vời mà họ đã nghe về nó.
Cập nhật: ngày 9 tháng 8 năm 2013
Với rất nhiều lượt ủng hộ và yêu thích, tôi nghĩ rằng tôi sẽ quay trở lại nơi này 18 tháng sau với một số bài học kinh nghiệm ngắn gọn.
Bài học 1: Đừng để Jenkins tiếp xúc với internet công cộng
Tại WWDC 2012, tôi đã đưa câu hỏi này đến các kỹ sư Xcode và OS X Server. Tôi đã nhận được một tràng nhạc "đừng làm vậy!" từ bất kỳ ai tôi đã hỏi. Tất cả đều đồng ý rằng quá trình xây dựng tự động là rất tốt, nhưng máy chủ chỉ nên truy cập được trên mạng cục bộ. Các kỹ sư của OS X Server đề xuất cho phép truy cập từ xa qua VPN.
Bài 2: Hiện có các tùy chọn cài đặt mới
Gần đây, tôi đã nói chuyện với CocoaHeads về trải nghiệm Jenkins của mình và tôi rất ngạc nhiên khi tìm thấy một số phương pháp cài đặt mới - Homebrew và thậm chí là phiên bản Bitnami Mac App Store . Đây chắc chắn là những thứ đáng để kiểm tra. Jonathan Wright có một ý chính chi tiết để Homebrew Jenkins hoạt động .
Bài học 3: Không, nghiêm túc, không để lộ hộp xây dựng của bạn lên internet
Từ bài đăng ban đầu, khá rõ ràng rằng tôi không phải là quản trị viên hệ thống hay chuyên gia bảo mật. Cảm giác chung về những thứ riêng tư (móc khóa, thông tin đăng nhập, chứng chỉ, v.v.) khiến tôi cảm thấy khá bất an khi đưa hộp Jenkins của mình lên internet. Nick Arnott tại Tiềm năng bị lãng quên đã có thể xác nhận khá dễ dàng những người yêu thích của tôi trong bài viết này .
TL; DR
Đề xuất của tôi cho những người khác đang tìm cách tự động hóa quy trình xây dựng của họ đã thay đổi trong năm rưỡi qua. Đảm bảo rằng máy Jenkins của bạn nằm sau tường lửa của bạn. Cài đặt và thiết lập Jenkins trở thành người dùng Jenkins chuyên dụng bằng cách sử dụng trình cài đặt, phiên bản Bitnami Mac App Store, AppleScript của Sami Tikka, v.v.; điều này giải quyết hầu hết các vấn đề mà tôi đã trình bày ở trên. Nếu bạn cần truy cập từ xa, việc thiết lập dịch vụ VPN trong OS X Server mất mười phút. Tôi đã sử dụng thiết lập này hơn một năm và rất hài lòng với nó. Chúc may mắn!