Configurer fastlane sur un serveur de build Mac dédié
Sur un serveur de build Mac, installez fastlane avec Bundler, que fastlane préfère, ou avec Homebrew. Gardez la signature dans match, lancez-le en readonly sur la CI, et connectez-vous à Apple avec une clé API App Store Connect. Commencez les lanes CI par setup_ci, pour que fastlane utilise un trousseau temporaire. Votre job CI ne lance alors qu’une commande : bundle exec fastlane beta.
Ce qu’il vous faut d’abord
- Un Mac avec Xcode, accès administrateur et Homebrew.
- Un agent CI sur ce Mac : GitHub Actions, GitLab, Buildkite, Jenkins ou CircleCI.
- Un compte App Store Connect avec le droit de créer des clés API.
- Un dépôt Git privé pour match, ou un bucket Google Cloud ou S3.
1. Installez fastlane
La documentation de fastlane, lue en octobre 2026, préfère Bundler. Elle prend en charge Ruby 3.2 ou plus récent, et préfère 3.3 ou plus récent. Elle déconseille le Ruby système de macOS. Installez un Ruby récent avec un gestionnaire de versions comme rbenv. Ajoutez ensuite un Gemfile au projet :
source "https://rubygems.org" gem "fastlane"
gem install bundler bundle update git add Gemfile Gemfile.lock
Bundler fige la version de fastlane dans Gemfile.lock. Chaque machine et chaque run CI obtiennent la même. Lancez-le avec bundle exec fastlane.
Sur un seul serveur de build, la voie la plus simple est Homebrew. Il apporte son propre Ruby :
brew install fastlane
Choisissez une seule voie par projet. C’est en les mélangeant qu’on se retrouve avec deux versions de fastlane sur une machine.
2. Créez une clé API App Store Connect
fastlane recommande les clés API plutôt que les connexions par identifiant Apple : pas de code à deux facteurs, plus de vitesse, plus de fiabilité. Dans App Store Connect, ouvrez Users and Access, puis Integrations, puis App Store Connect API. Créez une Team Key. fastlane précise que les appels de provisionnement demandent une clé d’équipe. Donnez-lui le rôle le plus restreint qui fonctionne. Notez l’Issuer ID et le Key ID. Téléchargez tout de suite le fichier .p8, car Apple ne le laisse télécharger qu’une fois.
mkdir -p ~/.appstoreconnect mv ~/Downloads/AuthKey_ABC123XYZ.p8 ~/.appstoreconnect/ chmod 600 ~/.appstoreconnect/AuthKey_ABC123XYZ.p8
Gardez la clé sur le Mac de build ou dans le coffre à secrets de votre CI. Ne la committez jamais.
3. Configurez match une fois, depuis une machine de développement
bundle exec fastlane match init bundle exec fastlane match development bundle exec fastlane match appstore
match init demande où stocker les certificats et écrit un Matchfile. Les deux commandes suivantes créent les certificats et les profils, et les enregistrent chiffrés dans ce stockage. Choisissez une phrase de passe solide. La CI la lit dans la variable MATCH_PASSWORD.
fastlane recommande le mode readonly sur toutes les CI. La CI ne fait alors que télécharger ce qui existe, et ne crée ni ne révoque jamais rien.
4. Écrivez les lanes
default_platform(:ios)
platform :ios do
lane :test do
run_tests(
scheme: "MyApp",
devices: ["iPhone 17"],
result_bundle: true
)
end
lane :beta do
setup_ci
api_key = app_store_connect_api_key(
key_id: ENV["ASC_KEY_ID"],
issuer_id: ENV["ASC_ISSUER_ID"],
key_filepath: ENV["ASC_KEY_PATH"]
)
match(type: "appstore", readonly: is_ci, api_key: api_key)
increment_build_number(
build_number: latest_testflight_build_number(api_key: api_key) + 1
)
build_app(scheme: "MyApp")
upload_to_testflight(api_key: api_key, skip_waiting_for_build_processing: true)
end
endsetup_ci crée un trousseau temporaire, passe match en readonly, et règle les chemins des logs et des résultats de test. Il n’agit que lorsque fastlane détecte une exécution en CI. Si la vôtre n’est pas détectée, passez force: true. Sauter le traitement du build termine le job plus tôt. Mais fastlane précise que cela saute aussi la distribution aux testeurs externes.
5. Appelez-le depuis la CI
Toutes les CI lancent les mêmes lignes shell. Stockez les secrets dans votre CI, pas dans le dépôt.
export LANG=en_US.UTF-8 export LC_ALL=en_US.UTF-8 bundle install bundle exec fastlane beta # needs MATCH_PASSWORD, ASC_KEY_ID, ASC_ISSUER_ID and ASC_KEY_PATH set as CI secrets
Sur GitHub Actions, ces lignes vont dans une étape run, avec les secrets passés en env. Un Mac MacRun arrive avec le logiciel du runner GitHub Actions déjà installé. Notre guide de configuration iOS sur GitHub Actions montre un workflow complet. Sur GitLab, Buildkite ou CircleCI, mettez les mêmes lignes dans le script du job. Sur Jenkins, utilisez une étape sh.
Comment tout cela survit aux redémarrages
fastlane n’est pas un service. Il tourne dans le job de votre agent CI. Ce qui doit survivre à un redémarrage, c’est l’agent et sa session. Configurez l’agent comme LaunchAgent avec la connexion automatique, comme dans nos guides GitLab Runner et Buildkite. Le trousseau temporaire de setup_ci est recréé à chaque exécution. Un trousseau de session verrouillé après un redémarrage ne peut donc pas le bloquer.
Erreurs courantes et solutions
Elles sont documentées par fastlane.
- Des erreurs d’encodage bizarres ou des plantages en CI. fastlane a besoin d’une locale UTF-8. Réglez
LANGetLC_ALLsuren_US.UTF-8. - Le job reste bloqué sur une demande de code à deux facteurs. Utilisez la clé API. Avec un identifiant Apple, réglez
SPACESHIP_ONLY_ALLOW_INTERACTIVE_2FApour qu’il échoue vite à la place. - match essaie de créer de nouveaux certificats en CI. Utilisez
readonly, ou appelez d’abordsetup_ci. - match n’arrive pas à cloner son dépôt. GitHub n’accepte pas une même deploy key sur deux dépôts. Utilisez un compte machine en lecture seule, ou
git_private_key, ouMATCH_GIT_BASIC_AUTHORIZATION. - Les profils sont installés mais Xcode ne les voit pas. Xcode 16 a déplacé le dossier des profils. fastlane suit le Xcode sélectionné, donc lancez
xcode_selectavant match sur les machines qui ont deux Xcode.
Pourquoi un Mac dédié aide
build_app et run_tests sont des builds Xcode. Sur une machine qui garde le DerivedData et les gems installées, ils sont bien plus rapides. Dans notre benchmark sur l’app iOS Wikipedia avec Xcode 26.6, un build propre a pris 86 secondes sur un M6. Il a pris 183 secondes sur un runner macos-26 hébergé par GitHub. Un job après un petit changement a pris 27 secondes à chaud, contre 269 à froid.
Quand vous n’avez pas besoin d’un serveur de build
Si vous envoyez sur TestFlight une fois par semaine, un runner hébergé ou Xcode Cloud demande moins de travail. Voir notre guide des alternatives à Xcode Cloud pour ce compromis. Notez aussi ce que MacRun ne fait pas. Nous ne gérons pas la signature de code pour vous. Vous lancez match vous-même, comme sur cette page. Nous ne proposons pas non plus de SLA.
Prêt pour un serveur de build ? Les tarifs listent tous les modèles, et la documentation d’installation montre comment vous connecter.
Questions fréquentes
Faut-il installer fastlane avec Homebrew ou Bundler sur un serveur de build ?
+
fastlane préfère Bundler, car Gemfile.lock fige la version. Homebrew est plus simple sur une seule machine et apporte son propre Ruby.
Que fait fastlane setup_ci ?
+
Il crée un trousseau temporaire, passe match en readonly, et règle les chemins des logs et des résultats de test. Il n’agit qu’en CI, sauf si vous passez force: true.
Pourquoi utiliser une clé API App Store Connect avec fastlane ?
+
Elle ne demande pas de code à deux facteurs, et fastlane la décrit comme plus rapide et plus fiable qu’une session par identifiant Apple. Créez une Team Key pour l’accès au provisionnement.
match doit-il tourner en mode readonly sur la CI ?
+
Oui. fastlane le recommande. La CI ne fait alors que télécharger les certificats et profils existants, et ne les crée ni ne les révoque jamais.