2026 Jenkins et agents Mac SSH distantsContrôleur Linux · Nœuds de build macOS · Comparer aux actions GitHub

You already run Jenkins on Linux, mais les versions iOS/macOS sont coincées entre l'achat de matériel, la mise en file d'attente des coureurs hébergés ou la garde d'ordinateurs portables. Pour les équipes qui réfléchissentVPS operations, ce guide ouvre une quatrième voie : conserver le contrôleur sous Linux, attacherMac distants dédiés as SSH agents. Vous obtenez sept mines terrestres d'examen, un tableau de comparaison avecCoureurs auto-hébergés GitHub Actions, a Runbook d'intégration en six étapes(identifiants, labels, simultanéité,xcodebuild, artefacts) et des liens croisés avec nosrunner, SSH checklist, and Fastlane + CI articles.

01

Avant de câbler Jenkins : sept hypothèses qui font dérailler les critiques « Contrôleur Linux + agent Mac distant »

De nombreuses entreprises ne manquent pas de Mac : il leur manque unvérifiable, évolutif et compatible avec la restaurationcontrat : conservez le contrôleur sous Linux familier, déplacez la diffusion de la version macOS vers des Mac cloud dédiés. Les sept éléments ci-dessous transforment « nous croyons en Jenkins » en un tableau des risques que vous pouvez signer.

  1. 01

    Traiter le Mac distant comme « Linux qui exécute xcodebuild » : ignoring TCC, le trousseau et les dépendances occasionnelles de l'interface graphique font exploser la signature et le provisionnement de première exécution.

  2. 02

    Réutilisation d'un compte macOS personnel pour CI :les politiques de veille, les invites de mise à jour et les sessions de bureau interrompent les véritables flux sans surveillance : créez un utilisateur CI dédié et alignez-vous surreproducible builds.

  3. 03

    Dimensionnement de la concurrence uniquement par cœurs de processeur :Les pics de mémoire Xcode et l'amplification d'écriture NVMe mordent généralement avant le CPU ; sans seauDerivedData, deux tâches peuvent se bloquer mutuellement.

  4. 04

    Ignorer les différences de chemin SSH entre le contrôleur et l'agent :bastions, rotation des clés etStrictHostKeyCheckingles politiques doivent résider dans IaC, sinon vous obtenez des files d'attente entièrement rouges le jour de la rotation.

  5. 05

    Laisser les plugins se substituer à la conception :le lourd Groovy et le shell ad hoc sur les agents allongent le MTTR : définissez un ensemble minimal de plugins et des versions explicites de la chaîne d'outils.

  6. 06

    Laisser les artefacts uniquement sur l'agent :Sans archivage sur un stockage objet ou sans référentiel d'artefacts, le disque et la conformité en souffrent tous deux : liez la rétention à la politique du pipeline.

  7. 07

    Pas de projet de « première fenêtre humaine » :Les installations initiales de matériel de signature peuvent encore nécessiter une confirmation unique de VNC ou de bureau avant de revenir au mode sans tête : consultez leListe de contrôle SSH vs VNC.

La cause première la plus courante est de traiter le « Mac distant » comme un calcul brut au lieu d'unhôte de chaîne d'outils Apple avec état. Les équipes de plate-forme doivent conserver les empreintes digitales des images, les versions de la chaîne d'outils, les limites du trousseau et les filigranes de nettoyage de la même manière que vous le feriez pour les répliques de bases de données. Associer avecpools de création d'entreprise: lorsque plusieurs applications partagent un hôte, les étiquettes Jenkins doivent être plus fines que « n'importe quel Mac », sinon la sémantique de file d'attente ne peut pas exprimer l'isolement.

Par rapport aux actions GitHub, le véritable delta n'est pas « peut-il compiler » maissources d'événements et limites des informations d'identification: Jenkins brille dans l'orchestration cross-repo et les tâches de style cron ; Les actions brillent dans les flux de travail natifs des relations publiques. Si vous avez déjà standardisé le Job DSL et les approbations, l'ajout de macOS via SSH est souvent moins perturbateur que le démarrage d'une deuxième religion CI. Pourtant, si vous êtes axé sur les relations publiques de bout en bout, les coureurs auto-hébergés peuvent avoir besoin de moins de colle. Lire lerunner guidemettre en cache les sections avant d'enregistrer les nœuds ; la plupart des contrats d'annuaire se traduisent directement.

Le tableau suivant verrouille la comparaison afin que vous puissiez choisir un plan de contrôle sans remettre en cause les logos chaque trimestre.

02

Agents Jenkins SSH vs coureurs auto-hébergés GitHub Actions : événements, informations d'identification et chargement des opérations

Il n'y a pas de solution miracle : vous choisissez unmodèle mental d'orchestration and a credential boundary, pas un logo. Écrivez trois SLA dans la révision : latence de la file d'attente, échecs explicables et coût de rotation des clés.

DimensionAgent Jenkins + SSH (macOS)Coureur auto-hébergé GitHub Actions
Event modelWebhooks génériques, cron, builds paramétrés ; connectable sur les hôtes GitÉtroitement couplé aux événements GitHub (RP, push, release) ; coût de migration plus élevé ailleurs
CredentialsLe contrôleur détient de manière centralisée les clés et les rôles SSH : renforcez le plan du contrôleurLes jetons Runner et les portées org/repo sont relativement standardisés
Parallélisme et files d'attenteÉtiquettes + capacité des nœuds + plugins d'accélérateur : flexibles mais lourds en configurationLes matrices et la concurrence vivent dans YAML avec une courbe d'apprentissage plus douce
ObservabilityL'agrégation des journaux de build est mature ; les métriques/alertes sont du bricolageL'interface utilisateur et les API de la plateforme sont unifiées ; une personnalisation approfondie nécessite souvent des tiers
Best fitLignes multi-produits, magasins d'artefacts sur site, hôtes Git mixtes, approbations lourdesOrganisations d'ingénierie centrées sur GitHub avec une prestation axée sur les relations publiques

Louer un Mac « comme un VPS », selon les termes de Jenkins, signifie acheter unprofil de nœud enregistrable: SSH corrigé, niveaux de disque prévisibles et possibilité d'imprimer les versions de la chaîne d'outils dans les métadonnées des nœuds.

Si Jenkins remporte votre avis, traitez-lenode propertiescomme première classe : chemin Xcode, version Swift, Ruby/Bundler lorsque CocoaPods est impliqué et si les tâches GUI sont autorisées – tout doit être affirmé dans une sortie de tâche d'intégrité. Associer avecinstantanés vs nœuds de longue durée: les agents à longue durée de vie s'appuient sur un nettoyage progressif ; Les références d'instantanés s'appuient sur des images réchauffées et des tests de fumée d'annulation.

Si vous devez exploiter à la fois des coureurs et des Jenkins sur la même flotte, unifiezRépartition des données dérivéescontrats : séparer les utilisateurs Unix ou les racines distinctes au lieu de « espérer que les horaires échelonnés évitent les collisions ».

03

Six étapes pour enregistrer un Mac distant en tant qu'agent Jenkins SSH et atteindre la première version verte

L'ordre compte : l'identité et les répertoires en premier, les sondes de la chaîne d'outils en second, la concurrence en dernier. Aligner avecreproducible buildsAinsi, Jenkins ne prouve pas seulement que « SSH fonctionne » tandis que la signature reste floue.

  1. 01

    Créez un utilisateur dédié et travaillez en root : e.g. /Users/ci/jenkins; forbid sharing ~/Desktopavec les humains ; le contrôleur utilise uniquement l’authentification par clé.

  2. 02

    Créez le nœud Jenkins : launch via SSH, définissez l'hôte, les informations d'identification, la racine distante et le chemin JVM pour le côté macOS.

  3. 03

    Label for intent: at least ios, xcode-16, heavy-pod: sépare les installations à forte dépendance des tâches de compilation uniquement.

  4. 04

    Exécutez d’abord une tâche de santé : print xcode-select -p, swift --version, instantanés de disque et de mémoire ; conserver le journal comme preuve d'acceptation.

  5. 05

    Transmettez des DerivedData explicites dans les pipelines : match Gouvernance SwiftPM/Pods-bucket par dépôt, éviter les défauts~/Library/Developer/Xcode/DerivedData sharing.

  6. 06

    Définissez les délais d'attente, les archives et le nettoyage :téléchargez les journaux, la conservation en cas d'échec et les règles de planification d'arrêt lorsque le disque franchit votre filigrane.

groovy · Esquisse de pipeline déclaratif
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 } }
}
info

Tip:si les pipelines expédient également aux magasins, lisezFastlane + CIet alignez les utilisateurs de build, les partitions de trousseau et les clés API App Store Connect avec les domaines d'informations d'identification Jenkins.

Les jours de mise à niveau du contrôleur, effectuez la même validation avant/après les mises à niveau et comparez la sortie d'empreinte digitale ainsi que les distributions au moment de la construction. Contrerunner caching: Les lingettes de l'espace de travail Jenkins sont trop agressives et pleines de forcepod installchaque course ; les nettoyages trop conservateurs remplissent les disques : définissez des niveaux de rétention avec la plate-forme et le produit.

Si les fournisseurs proposent des ports SSH non standard et des utilisateurs non root, stockez les métadonnées de connexion dans les descriptions des informations d'identification, et non dispersées entre les tâches. Associez-le avec leSSH checklist for known_hostsau lieu de désactiver globalement les vérifications des clés d'hôte.

04

Concurrence, files d'attente et limitation des installations lourdes : exprimer la planification Jenkins comme modèle de capacité

L’erreur classique consiste à dimensionner la concurrence à partir de « combienxcodebuildles processus sont adaptés. En réalité,pod install/ SPM résout et compile les pics en différentes phases : utilisez des limitations et des étiquettes pour modélisermutex resources. Pair with Gouvernance SwiftPM/Podspour isoler les tâches à résolution lourde des constructions vertes rapides.

Les tests d'interface utilisateur basés sur un simulateur changent la situation de la concurrence par rapport aux tâches de compilation uniquement ; suivreXCTest / Simulatorconseils de partitionnement et isoler ces tâches avec leurs propres étiquettes ou pools de nœuds enfants.

warning

Warning:ne continuez pas la planification lorsque le disque est en dessous de votre filigrane de sécurité : suspendez la planification et nettoyez d'abord ; sinon, Xcode et git peuvent écrire à moitié un état qui coûte plus cher qu'une courte file d'attente.

Les flottes multirégionales doivent coderregiondans les noms et les étiquettes des nœuds, et marquez les chemins de sortie des artefacts pour éviter que les copies en masse accidentelles entre régions ne soient confondues avec des échecs de construction. Avecrent vs buy TCO, intégrez très tôt la latence et la bande passante de sortie au modèle de coûts.

05

Numéros de référence que vous pouvez coller dans une revue de conception (avec la note opérationnelle RGPD)

Adaptez les seuils à votre parallélisme et à la taille de vos dépôts ; ces points d'ancrage alignent les équipes de sécurité et de plateforme. Pour les organisations à forte composante européenne, connectez-vousquelles machines ont touché quelles identités de signaturepour prendre en charge les questions d'audit DSGVO : les nœuds distants ne doivent pas être des animaux de compagnie anonymes.

  • Disk watermark: keep ≥20%espace libre sur les volumes système ; en dessous, suspendez la planification avant les suppressions et enregistrez les chemins supprimés pour audit.
  • Concurrency probe:RAM de pointe de base pour une tâche unique, puis augmentez la simultanéité tout en regardant P95 ;Apple Siliconles pics de compilation/lien éclipsent souvent les moyennes.
  • Liste de contrôle d'acceptation des nœuds : record xcodebuild -version, swift --version, Ruby/Bundler lorsque CocoaPods est en jeu et modèle de disque ; réexécutez les tâches Canary après tout changement.

Les ordinateurs portables de bureau et les Mac mini uniques introduisent la mise en veille, la gigue du réseau et la dérive de la chaîne d'outils ; Linux pur ne peut pas exécuter la pile iOS officielle d'Apple. Garder Jenkins sous Linux tout en déplaçant les versions macOS versdédié, toujours actif, accessible via SSHnodes transforme « nous avons besoin d’un Mac quelque part » en un contrat d’exploitation. Par rapport au matériel ad hoc ou aux hôtes virtualisés instables,Location cloud Mac Mini de NodeMiniassocie SSH fixe, niveaux de disque clairs et profils reproductibles, ce qui est préférable pour les CI de niveau plate-forme. Comparez les niveaux dansrental rates and onboard via the help center.

Liez ce runbook aux « niveaux de modification de la chaîne d'outils » internes : les correctifs Xcode, les mises à niveau mineures et les mises à niveau majeures doivent comporter des approbations, une portée Canary et des règles d'invalidation du cache différentes.

FAQ

FAQ

Pas automatiquement. Jenkins gagne en termes de pipelines enfichables et d'intégration sur site ; Les actions gagnent sur les événements natifs de relations publiques. Si vous disposez déjà de Job DSL, les agents SSH sont souvent plus fluides ; si vous êtes centré sur GitHub, les coureurs auront peut-être besoin de moins de colle. Comparez les niveaux de matériel dansrental rates.

Oui : séparez l'accueil et le trousseau des comptes personnels pour éviter la mise en veille, les invites de l'interface graphique et la dérive des autorisations ; alignez-vous sur la liste de contrôle SSH et les articles sur les builds reproductibles. Plus de détails sur l'intégration se trouvent dans lehelp center.

RAM de pointe de base pour une tâche unique et amplification d'écriture NVMe, puis mise à l'échelle de la concurrence tout en regardant P95 ; bucket DerivedData et limiter les installations de pods lourdes. Lisez également leself-hosted runnerarticle pour les modèles de cache qui correspondent aux étiquettes Jenkins.