2026 Mac distants partagés pour GitHub Actions :
Merge Queue vs labels Runner pour éviter que les vérifications de merge meurent de faim

Double file d'attente · Routage des labels · Concurrency · Observabilité de la voie merge

2026 GitHub Merge Queue et runner Mac auto-hébergé distant

Sur plusieurs Mac distants loués avec runners self-hosted, l'erreur fréquente est de croire que la Merge Queue orchestre aussi la capacité machine : la file GitHub ordonne les changements et les garde-fous vers la branche par défaut, mais le backlog runner reste dicté par labels et groupes de concurrence. Cet article sépare les deux files avec un tableau de partage du plan de contrôle, propose le routage ci-pr / ci-merge / ci-release, les règles concurrency et cancel-in-progress, et des critères p95 pour décider entre ajouter des Mac ou régler GitHub en premier ; liens vers pool de build partagé, mutex de sièges et orchestration Mac Mesh.

01

Deux files et six douleurs : pourquoi la famine merge persiste avec la Merge Queue

La Merge Queue protège l'intégrité de la branche par défaut : elle enchaîne les lots de vérifications avant intégration ; elle ne garantit pas des CPU libres sur vos runners Mac distants. Si PR et merge partagent les mêmes labels runs-on, GitHub peut avancer les fusions pendant que les runners sont saturés par des jobs PR optionnels.

  1. 01

    Confusion des deux files : interpréter le \"Queued\" d'Actions comme si la Merge Queue boostait toujours les jobs merge.

  2. 02

    Labels mélangés : un ci vague empile nightly, PR et merge sur les mêmes runners.

  3. 03

    Mauvaises annulations : cancel-in-progress: true sur la voie merge comme pour les PR déchiquette les lots.

  4. 04

    Collisions de concurrence : plusieurs dépôts partagent la même chaîne concurrency et s'annulent.

  5. 05

    Observabilité faible : on ne sépare pas attente merge queue et runner occupé.

  6. 06

    Décalage de lease mesh : la voie merge veut une occupation stable mais sans seuils de bail.

Astuce : si vous comparez encore portable et distant plutôt que le plan de contrôle CI, lisez d'abord édition locale légère vs builds distants lourds.

02

Plan de contrôle et labels : quand créer une voie ci-merge

Le tableau ci-dessous sert aux revues ; faire les deux n'a de sens que si la capacité runner est honnête, pas du théâtre de labels.

Plan de contrôleGitHub Merge QueueBacklog runner (file machines)
CouvreOrdre vers la branche par défaut, lots merge, sémantique des checks requisQuel Mac exécute quel job workflow quand
Ne couvre pasCombien de cœurs perf sont libres sur votre M4Si une PR doit logiquement passer devant
Échec typiqueLots timeout malgré une logique saine mais manque de CPUJobs merge longtemps en queue alors que la file est courte
Premier levierResserrez checks requis et hypothèses de lotsCoupez les labels runs-on, ajoutez runners ou sièges réservés

Des merges fluides dépendent d'une capacité runner honnêtement réservée au merge, pas du seul interrupteur Merge Queue.

Schéma de labels recommandé (adapter les raccourcis d'équipe)

  • Bruit PR : self-hosted + macOS + ci-pr + pin de toolchain (ex. xcode-16-2).
  • Voie merge : mêmes pins plus un suffixe de capacité honnête ci-merge servi par au moins un runner Mac distant.
  • Release : ci-release séparé du merge pour ne pas affamer le trunk.
03

Runbook en six étapes : figer la voie merge dans le YAML, pas dans Slack

Ces étapes complètent le guide SSH du pool partagé : là on joint le runner ; ici on définit qui possède quelle timeline CPU.

  1. 01

    Inventorier les checks requis : listez ce qui bloque réellement la branche par défaut, durées, ce qui peut monter en PR.

  2. 02

    Fractionner runs-on : attribuez ci-merge aux workflows ou jobs merge-only ; une machine peut porter plusieurs labels mais réservez des créneaux ou des nœuds dédiés.

  3. 03

    Auditer concurrency : PR avec cancel-in-progress: true ; merge/release avec cancel-in-progress: false ou clés plus étroites.

  4. 04

    Nommer les groupes concurrency : inclure dépôt, workflow et suffixe d'environnement.

  5. 05

    Instrumenter : séparer sur le tableau de bord attente merge queue et minutes occupées runner.

  6. 06

    Revue de barrière : deux fois par semaine file courte mais merge longtemps en queue ? changez d'abord la topologie runner.

yaml
concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name }}
  cancel-in-progress: ${{ github.event_name == 'pull_request' }}

jobs:
  merge-gate:
    runs-on: [self-hosted, macOS, ci-merge, xcode-16-2]
    timeout-minutes: 45
    steps:
      - run: echo "merge lane only"
04

Signaux et critères : ajouter des Mac ou régler GitHub en premier

Les motifs viennent de post-mortems courants ; remplacez les seuils par vos données. Ne mélangez pas les deux files d'attente sur un même graphique.

SignalCause probablePremier geste
Longue merge queue, runners inactifsChecks requis ou politique de lots trop strictsRevoir le graphe des checks et les hypothèses de parallélisme
File courte, job merge longtemps en queueRoutage des labels ou trop peu de runnersSéparer ci-merge, ajouter nœuds ou sièges
Lots infra en échecTimeouts, disque, trousseau, réseauComparer journaux runner et checklist gouvernance des signatures
PR rapides, merges lentsPR et merge se disputent les mêmes labelsFractionner runs-on et réduire jobs PR optionnels

Attention : du matériel plus rapide sans séparation des labels décale souvent la famine vers les nuits de release ; à terme il faut des noms de capacité distincts.

05

Métriques citées et garde-fous (revue d'ingénierie)

Les plages ci-dessous sont des ancrages typiques pour équipes réparties ; reliez vos champs SQL ou API au runbook interne.

  • Attente file job merge : si P95 dépasse 20 minutes sur deux semaines de release avec profondeur de merge queue sous 3, vérifiez d'abord l'honnêteté des labels runner.
  • Préemption PR : workflows optionnels sur runners ci-merge avec busy minutes au-dessus de 85 % en journée, déplacez nightly vers le pool ci-pr.
  • Vagues d'annulation : plus d'une validation merge annulée par semaine, auditez une concurrency partagée avec les PR.
Taille d'équipeCadence merge trunkPremier geste recommandé
PetitePlusieurs fois par jourUn runner ci-merge dédié + checks requis stricts
MoyenneLots continusRunners multi-régions + pool release explicite
PlateformePool partagé multi-dépôtsStandards de labels d'org + tableau des coûts queue vs runner

Un portable comme runner temporaire apporte veille thermique et login interactif peu auditable ; des Mac en colocation ajoutent achat et câblage. Peu contractuel pour un SLO de merge vérifiable.

Pour des pools Mac distants où iOS CI/CD et jobs longs d'agents IA coexistent, la location cloud de Mac Mini VpsMesh est souvent le meilleur choix : étendez la flotte par région et SKU, placez merge, release et bruit quotidien sur des nœuds nommés, mettez disponibilité et politique de sièges dans des engagements ops, pas dans Slack.

FAQ

FAQ

Pas forcément une machine physique dédiée, mais il faut honnêtement séparer labels et concurrence sinon le bruit PR affame les vérifications merge. Mieux : lier ci-merge à des sièges fixes ou nœuds dédiés. Montée en charge : page Tarifs et page Commander.

Les pushes PR rendent les anciens checks obsolètes ; annuler trop de lots merge augmente le risque de changements fusionnés sans boucle d'automatisation fermée. Encodez la politique dans le YAML et reliez les runbooks depuis le Centre d'aide.

D'abord pool de build partagé pour SSH et enregistrement runner, puis cet article pour scinder la voie merge ; verrous de sièges dans l'article mutex TTL.