You already run Jenkins on Linux, 그러나 iOS/macOS 빌드는 하드웨어 구매, 호스팅 실행자 대기 또는 노트북 보모 사이에서 정체됩니다. 생각하는 팀을 위해VPS operations, 이 가이드에서는 네 번째 경로를 엽니다. 컨트롤러를 Linux에 유지하고 연결합니다.전용 원격 Mac as SSH agents. 7개의 리뷰 지뢰와 비교표가 제공됩니다.GitHub Actions 자체 호스팅 실행기, a 6단계 온보딩 런북(자격 증명, 라벨, 동시성,xcodebuild, 아티팩트) 및 우리의 상호 링크runner, SSH checklist, and Fastlane + CI articles.
많은 기업에는 Mac이 부족하지 않습니다.감사 가능, 확장 가능, 롤백 친화적계약: 컨트롤러를 익숙한 Linux에 유지하고 macOS 빌드 팬아웃을 전용 클라우드 Mac으로 이동합니다. 아래 7개 항목은 "우리는 Jenkins를 믿습니다"를 서명할 수 있는 위험 표로 바꿉니다.
원격 Mac을 "xcodebuild를 실행하는 Linux"처럼 취급: ignoring TCC, 키체인 및 간헐적인 GUI 종속성은 첫 실행 서명 및 프로비저닝을 폭발시킵니다.
CI에 개인 macOS 계정 재사용:절전 정책, 업데이트 프롬프트 및 데스크탑 세션은 진정한 무인 흐름을 중단합니다. 전용 CI 사용자를 생성하고 이에 맞춰 조정합니다.reproducible builds.
CPU 코어별로 동시성 크기 조정:Xcode 메모리 스파이크 및 NVMe 쓰기 증폭은 일반적으로 CPU보다 먼저 발생합니다. 버킷하지 않고DerivedData, 두 작업이 서로 교착 상태에 빠질 수 있습니다.
컨트롤러와 에이전트 간의 SSH 경로 차이를 무시합니다.요새, 키 순환 및StrictHostKeyChecking정책은 IaC에 있어야 합니다. 그렇지 않으면 순환일에 모두 빨간색 대기열을 받게 됩니다.
플러그인 확장을 디자인 대신 사용:무거운 Groovy와 에이전트의 임시 셸은 MTTR을 연장합니다. 최소한의 플러그인 세트와 명시적인 도구 체인 버전을 정의합니다.
에이전트에만 아티팩트를 남겨 둡니다.객체 스토리지나 아티팩트 저장소에 보관하지 않으면 디스크와 규정 준수 모두 문제가 발생합니다. 즉, 파이프라인 정책에 보존이 묶여 있기 때문입니다.
"최초의 인간 창" 계획은 없습니다:초기 서명 자료 설치에는 헤드리스로 돌아가기 전에 일회성 VNC 또는 데스크톱 확인이 필요할 수 있습니다.SSH와 VNC 체크리스트.
일반적인 근본 원인은 "원격 Mac"을 원시 컴퓨팅으로 처리하는 것입니다.상태 저장 Apple 툴체인 호스트. 플랫폼 팀은 데이터베이스 복제본과 마찬가지로 이미지 지문, 도구 체인 버전, 키체인 경계 및 정리 워터마크를 유지 관리해야 합니다. 다음과 페어링엔터프라이즈 빌드 풀: 여러 앱이 호스트를 공유하는 경우 Jenkins 레이블은 "모든 Mac"보다 더 정밀해야 합니다. 그렇지 않으면 대기열 의미론이 격리를 표현할 수 없습니다.
GitHub Actions에 비해 실제 델타는 "컴파일할 수 있는가"가 아니라이벤트 소스 및 자격 증명 경계: Jenkins는 저장소 간 오케스트레이션 및 크론 스타일 작업에서 빛을 발합니다. 액션은 PR 기반 워크플로에서 빛을 발합니다. Job DSL 및 승인을 이미 표준화한 경우 SSH를 통해 macOS를 추가하는 것이 두 번째 CI 종교를 시작하는 것보다 덜 방해가 되는 경우가 많습니다. 하지만 PR 중심의 엔드투엔드라면 자체 호스팅 실행기에 접착제가 덜 필요할 수 있습니다. 읽기runner guide노드를 등록하기 전에 섹션을 캐시합니다. 대부분의 디렉토리 계약은 직접 번역됩니다.
다음 표에서는 분기마다 로고를 다시 확인하지 않고도 제어 평면을 선택할 수 있도록 비교를 잠급니다.
만병통치약은 없습니다. 귀하는 다음 중 하나를 선택하고 있습니다.오케스트레이션 정신 모델 and a credential boundary, 로고가 아닙니다. 검토 시 대기열 대기 시간, 설명 가능한 오류, 키 순환 비용 등 세 가지 SLA를 작성합니다.
| Dimension | Jenkins + SSH 에이전트(macOS) | GitHub Actions 자체 호스팅 실행기 |
|---|---|---|
| Event model | 일반 웹훅, cron, 매개변수화된 빌드 Git 호스트에 연결 가능 | GitHub 이벤트(PR, 푸시, 릴리스)와 긴밀하게 결합됩니다. 다른 곳으로의 마이그레이션 비용 증가 |
| Credentials | 컨트롤러는 중앙에서 SSH 키와 역할을 보유하여 컨트롤러 플레인을 강화합니다. | 러너 토큰과 조직/저장소 범위는 상대적으로 표준화되어 있습니다. |
| 병렬성과 큐 | 라벨 + 노드 용량 + 스로틀 플러그인 - 유연하지만 구성이 많이 필요함 | 행렬과 동시성은 보다 완만한 학습 곡선을 통해 YAML에 존재합니다. |
| Observability | 빌드 로그 집계가 성숙되었습니다. 측정항목/경고는 DIY입니다. | 플랫폼 UI와 API가 통합되었습니다. 심층적인 맞춤화에는 제3자가 필요한 경우가 많습니다. |
| Best fit | 다중 제품 라인, 온프레미스 아티팩트 저장소, 혼합 Git 호스트, 많은 승인 | PR 중심 제공을 갖춘 GitHub 중심 엔지니어링 조직 |
Jenkins 용어로 "VPS처럼" Mac을 임대한다는 것은 Mac을 구입하는 것을 의미합니다.등록 가능한 노드 프로필: SSH 수정, 예측 가능한 디스크 계층, 툴체인 버전을 노드 메타데이터에 스탬프 처리하는 기능이 포함되었습니다.
Jenkins가 리뷰에서 승리하면 치료를 받으십시오.node properties일류: Xcode 경로, Swift 버전, CocoaPods가 포함된 Ruby/Bundler 및 GUI 작업 허용 여부 등 모두 상태 작업 출력에서 확인되어야 합니다. 다음과 페어링스냅샷과 수명이 긴 노드: 수명이 긴 에이전트는 증분 정리에 의존합니다. 스냅샷 기준은 재가열된 이미지와 롤백 스모크 테스트에 의존합니다.
동일한 함대에서 러너와 Jenkins를 모두 운영해야 하는 경우 통합파생 데이터 버킷팅계약: "충돌을 피하기 위해 시차를 두고 일정을 조정하는 것" 대신 별도의 Unix 사용자 또는 별도의 루트.
순서가 중요합니다. ID와 디렉터리가 먼저이고, 툴체인이 두 번째로 조사되고, 동시성이 맨 마지막입니다. 다음과 정렬reproducible builds따라서 Jenkins는 서명이 불안정한 상태에서 "SSH 작동"을 증명할 뿐만 아니라
전용 사용자 및 작업 루트를 만듭니다. e.g. /Users/ci/jenkins; forbid sharing ~/Desktop인간과; 컨트롤러는 키 기반 인증만 사용합니다.
Jenkins 노드를 만듭니다. launch via SSH, macOS 측에 대한 호스트, 자격 증명, 원격 루트 및 JVM 경로를 설정합니다.
Label for intent: at least ios, xcode-16, heavy-pod—컴파일 전용 작업과 무거운 종속성 설치를 분리합니다.
먼저 상태 작업을 실행하십시오. print xcode-select -p, swift --version, 디스크 및 메모리 스냅샷; 로그를 승인 증거로 저장합니다.
파이프라인에서 명시적인 DerivedData를 전달합니다. match SwiftPM/Pod 거버넌스—리포지토리당 버킷, 기본값 방지~/Library/Developer/Xcode/DerivedData sharing.
시간 초과, 보관 및 정리를 정의합니다.로그 업로드, 실패 시 보존, 디스크가 워터마크를 넘을 때 일정 중지 규칙.
pipeline {
agent { label 'ios && xcode-16' }
options { timestamps(); timeout(time: 45, unit: 'MINUTES') }
environment { DERIVED_DATA = "${WORKSPACE}/DerivedData" }
stages {
stage('Probe') { steps { sh 'xcode-select -p; xcodebuild -version; df -h' } }
stage('Build') {
steps {
sh 'xcodebuild -scheme "App" -configuration Release -destination "generic/platform=iOS" -derivedDataPath "$DERIVED_DATA" build'
}
}
}
post { always { archiveArtifacts artifacts: '**/build.log', allowEmptyArchive: true } }
}
Tip:파이프라인이 매장에도 배송된다면 읽어보세요.Fastlane + CI빌드 사용자, 키체인 파티션, App Store Connect API 키를 Jenkins 자격 증명 도메인과 정렬합니다.
컨트롤러 업그레이드일에는 업그레이드 전/후에 동일한 커밋을 카나리아하고 지문 출력과 빌드 시간 배포를 비교합니다. 에 맞서runner caching: 너무 공격적인 강제 풀린 Jenkins 작업 공간 지우기pod install매 실행; 너무 보수적인 디스크 채우기 - 플랫폼과 제품으로 보존 계층을 정의합니다.
공급업체가 비표준 SSH 포트와 루트가 아닌 사용자를 제공하는 경우 작업 전체에 분산되지 않고 자격 증명 설명에 연결 메타데이터를 저장합니다. 다음과 페어링하세요.SSH checklist for known_hosts호스트 키 검사를 전역적으로 비활성화하는 대신 정책을 사용합니다.
고전적인 실수는 "얼마나 많은xcodebuild프로세스가 적합합니다.” 실제로는pod install/ SPM은 다양한 단계에서 최고점을 해결하고 컴파일합니다. 스로틀과 라벨을 사용하여 모델링합니다.mutex resources. Pair with SwiftPM/Pod 거버넌스빠른 그린 빌드에서 무거운 해결 작업을 분리합니다.
시뮬레이터가 많은 UI 테스트는 컴파일 전용 작업과 비교하여 동시성 스토리를 변경합니다. 따르다XCTest / Simulator샤딩 지침을 따르고 자체 라벨이나 하위 노드 풀을 사용하여 해당 작업을 격리합니다.
Warning:디스크가 안전 워터마크 아래에 있을 때 예약을 계속하지 마십시오. 예약을 일시 중지하고 먼저 정리하십시오. 그렇지 않으면 Xcode와 git은 짧은 대기열보다 비용이 더 많이 드는 상태를 절반만 쓸 수 있습니다.
다중 지역 플릿은 인코딩해야 합니다.region노드 이름 및 레이블에 태그를 지정하고 아티팩트 송신 경로에 태그를 지정하여 실수로 빌드 실패로 오인되는 지역 간 대량 복사를 방지합니다. 와 함께rent vs buy TCO, 지연 시간과 송신 대역폭을 비용 모델에 조기에 적용합니다.
병렬성과 저장소 크기에 맞게 임계값을 조정하세요. 이러한 앵커는 보안 팀과 플랫폼 팀을 연결합니다. EU를 많이 사용하는 조직의 경우 로그어떤 기계가 어떤 서명 신원을 만졌는지DSGVO 감사 질문을 지원하기 위해 원격 노드는 익명 애완동물이 아니어야 합니다.
xcodebuild -version, swift --version, CocoaPods가 실행 중인 경우 Ruby/Bundler 및 디스크 모델; 변경 후 카나리아 작업을 다시 실행합니다.Office 노트북과 일회용 Mac mini에는 잠자기, 네트워크 지터, 툴체인 드리프트가 발생합니다. 순수 Linux는 Apple의 공식 iOS 스택을 실행할 수 없습니다. macOS 빌드를 Linux로 이동하는 동안 Jenkins를 Linux에 유지전용, 상시 접속, SSH 연결 가능노드는 "어딘가에 Mac이 필요합니다"를 운영 계약으로 전환합니다. 임시 하드웨어나 불안정한 가상화 호스트에 비해NodeMini의 Mac Mini 클라우드 대여고정 SSH, 투명 디스크 계층 및 반복 가능한 프로필을 결합하여 플랫폼 등급 CI에 더 적합합니다. 등급 비교rental rates and onboard via the help center.
이 런북을 내부 "도구 체인 변경 수준"에 바인딩합니다. Xcode 패치, 사소한 업그레이드, 주요 업그레이드는 서로 다른 승인, 카나리아 범위 및 캐시 무효화 규칙을 적용해야 합니다.
자동으로 아닙니다. Jenkins는 플러그형 파이프라인과 온프레미스 통합에서 승리합니다. PR 네이티브 이벤트에서 Actions가 승리합니다. 이미 Job DSL이 있는 경우 SSH 에이전트가 더 원활한 경우가 많습니다. GitHub 중심이라면 러너에게 접착제가 덜 필요할 수 있습니다. 하드웨어 계층 비교rental rates.
예. 잠자기, GUI 프롬프트 및 권한 드리프트를 방지하기 위해 집과 키체인을 개인 계정과 분리합니다. SSH 체크리스트 및 재현 가능한 빌드 기사와 일치합니다. 자세한 온보딩 세부 사항은help center.
기본 단일 작업 최대 RAM 및 NVMe 쓰기 증폭 후 P95를 보면서 동시성을 확장합니다. DerivedData 버킷 및 무거운 포드 설치를 제한합니다. 또한 읽어보세요self-hosted runnerJenkins 레이블에 매핑되는 캐시 패턴에 대한 문서입니다.