Aller au contenu
CI/CD & Automatisation medium

Runners GitHub-hosted vs Self-hosted

10 min de lecture

Le choix entre runners GitHub-hosted et self-hosted dépend de vos contraintes : performances, sécurité, coût et accès aux ressources internes. Ce guide donne les critères pour trancher.

  • Comparer GitHub-hosted et self-hosted sur les critères qui comptent
  • Identifier les cas d'usage idéaux de chaque type
  • Calculer le seuil de rentabilité d'un runner self-hosted
  • Combiner les deux dans une architecture hybride
  • Migrer progressivement un workflow vers le self-hosted

Avant d'entrer dans le détail, ce tableau pose les sept critères qui opposent les deux types de runners.

CritèreGitHub-hostedSelf-hosted
MaintenanceAucuneÀ votre charge
Démarrage~20-40sInstantané si pré-chaud
EnvironnementPropre à chaque jobPersistant
CoûtMinutes facturées (privé)Infrastructure à payer
RéseauInternet uniquementAccès réseau interne
SécuritéIsolation garantieVotre responsabilité
SpecsFixes (4 CPU, 16 Go)Personnalisables
  1. Projets open source : gratuit et illimité
  2. Builds standards : Node.js, Python, Java sans dépendances exotiques
  3. Équipe sans ops : pas de maintenance d'infrastructure
  4. Sécurité critique : isolation garantie entre jobs
permissions: {}
jobs:
test:
runs-on: ubuntu-24.04
permissions:
contents: read
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
persist-credentials: false
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: 20
cache: npm
- run: npm ci
- run: npm test

Zéro maintenance :

  • Mises à jour automatiques des logiciels
  • Patches de sécurité appliqués par GitHub
  • Pas de serveurs à gérer

Isolation parfaite :

  • VM neuve à chaque job
  • Pas de risque de contamination entre jobs
  • Secrets inaccessibles entre runs

Logiciels pré-installés :

  1. Accès réseau interne : bases de données, registries privés
  2. Hardware spécialisé : GPU, ARM, grandes quantités de RAM
  3. Builds longs/fréquents : économies sur les minutes
  4. Cache persistant : éviter de re-télécharger les dépendances
  5. Contraintes légales : données ne devant pas sortir du réseau
permissions: {}
jobs:
build:
runs-on: [self-hosted, linux, x64]
permissions:
contents: read
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
persist-credentials: false
- name: Build avec accès au registry interne
env:
IMAGE_TAG: ${{ github.sha }}
run: |
docker login registry.internal.company.com
docker build -t "registry.internal.company.com/app:$IMAGE_TAG" .

Performances :

  • Pas de cold start si runner pré-chaud
  • Cache local (dépendances, images Docker)
  • Hardware sur-mesure (SSD NVMe, 128 Go RAM)

Accès réseau :

  • Déploiement direct sur Kubernetes interne
  • Tests contre bases de données internes
  • Pas de tunnel ou VPN à configurer

Coût prévisible :

  • Pas de facturation à la minute
  • Rentable pour les gros volumes

Le coût est souvent le facteur décisif. Comparons la facturation à la minute des runners hosted au coût fixe d'une machine self-hosted.

Minutes gratuites (plan Free) : 2 000/mois
Prix après quota :
- Linux : $0.008/min
- Windows: $0.016/min
- macOS : $0.08/min

Exemple : 10 000 minutes Linux/mois = 8 000 minutes facturées = $64/mois

VM Linux (4 CPU, 16 Go) chez un cloud provider :
- ~$80-150/mois selon le provider
- Peut servir plusieurs repos

Seuil de rentabilité : environ 10 000-15 000 minutes/mois

Au-delà du coût, la vitesse sépare nettement les deux options, au démarrage du job comme pendant le build.

TypeCold startWarm start
GitHub-hosted20-40sN/A (toujours cold)
Self-hosted0-5s0s (runner pré-chaud)
# GitHub-hosted : télécharge le cache à chaque job
- uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
with:
path: ~/.npm
key: npm-${{ hashFiles('package-lock.json') }}
# Temps de restore : 10-30s selon la taille
# Self-hosted : cache local sur disque
# Temps de restore : < 1s

La meilleure approche est souvent de combiner les deux :

permissions: {}
jobs:
# Tests rapides sur GitHub-hosted
lint:
runs-on: ubuntu-24.04
permissions:
contents: read
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
persist-credentials: false
- run: npm run lint
# Build lourd sur self-hosted
build:
needs: lint
runs-on: [self-hosted, linux, docker]
permissions:
contents: read
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
persist-credentials: false
- run: docker build -t app .
# Déploiement interne sur self-hosted
deploy:
needs: build
runs-on: [self-hosted, production-network]
steps:
- run: kubectl apply -f k8s/

Pour trancher rapidement, cochez les cases qui correspondent à votre situation : la colonne qui en récolte le plus l'emporte.

  • Le projet est open source
  • Les builds durent moins de 10 minutes
  • Pas besoin d'accès réseau interne
  • L'équipe n'a pas de capacité ops
  • L'isolation entre jobs est critique
  • Plus de 10 000 minutes/mois
  • Besoin de GPU ou hardware spécialisé
  • Accès au réseau interne requis
  • Builds très longs (> 30 min)
  • Contraintes de localisation des données

Inutile de tout basculer d'un coup. Une migration réussie est progressive : on cible quelques workflows, on teste, puis on étend.

Commencez par les workflows :

  • Les plus longs (économies maximales)
  • Nécessitant un accès réseau interne
  • Les plus fréquents
Fenêtre de terminal
# Télécharger le runner
curl -O -L https://github.com/actions/runner/releases/download/v2.xxx.x/actions-runner-linux-x64-2.xxx.x.tar.gz
# Installer
tar xzf ./actions-runner-linux-x64-*.tar.gz
# Configurer
./config.sh --url https://github.com/OWNER/REPO --token TOKEN
# Démarrer
./run.sh
jobs:
build:
# Phase 1 : tester sur self-hosted
# runs-on: ubuntu-24.04
runs-on: [self-hosted, linux, x64]
  • GitHub-hosted = zéro maintenance, isolation garantie, idéal pour 90 % des cas.
  • Self-hosted = vos machines, pour le GPU, le réseau interne et les gros volumes.
  • Le seuil de rentabilité du self-hosted tourne autour de 10 000–15 000 minutes/mois.
  • Une architecture hybride combine les deux : tests rapides hosted, builds lourds self-hosted.
  • Un runner self-hosted sur un dépôt public est un risque majeur, réservez-le aux dépôts privés.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn