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 tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn