Mise en service et connexion
Vérifiez la commande et les identifiants de la machine, établissez votre première connexion SSH et ajoutez votre clé publique.
Voir les étapes de connexionVérifiez d’abord la connexion, figez ensuite la chaîne d’outils, puis configurez la CI. Suivez les étapes dans l’ordre pour transformer un Mac physique dédié en machine de build reproductible. Pas de machine virtuelle : macOS est accessible en interface graphique comme en ligne de commande.
Vous avez déjà une machine ? Commencez par « Mise en service et connexion » ci-dessous. Vous hésitez encore ? Validez d’abord un build avec un seul job, puis déterminez le niveau de concurrence nécessaire.
Vérifiez la commande et les identifiants de la machine, établissez votre première connexion SSH et ajoutez votre clé publique.
Voir les étapes de connexionUtilisez SSH pour les scripts et la CI, et le partage d’écran VNC pour déboguer Xcode, les simulateurs et l’interface graphique.
Voir les paramètres de connexionEnregistrez un runner auto-hébergé, distinguez les tags de la chaîne d’outils et limitez d’abord chaque machine à un seul build simultané.
Configurer un runnerVérifiez la période de facturation, les options et la date d’expiration. Pour les commandes, les paiements et les renouvellements, fiez-vous à l’état indiqué dans la console.
Voir le guide de facturationAucune section ne correspond. Essayez « connexion », « certificat » ou « facturation », ou effacez la recherche pour afficher toutes les étapes. Pour un problème lié à une machine précise, connectez-vous à la console et ouvrez un ticket.
Voici un ordre d’opérations recommandé, et non un délai garanti de mise en service ou de traitement. Vérifiez d’abord dans la console que le service est actif, puis utilisez l’adresse, le port et le nom d’utilisateur réellement fournis pour cette instance. Ne devinez pas les identifiants à partir d’un exemple.
Connectez-vous à la console et vérifiez le modèle, le nœud et la durée de location dans les détails du service concerné. Notez l’identifiant de la machine : il servira à retrouver le bon contexte lors d’un dépannage, d’un renouvellement ou d’une demande d’assistance. L’adresse de connexion et les identifiants initiaux sont accessibles uniquement depuis un compte autorisé.
Renseignez les informations fournies par la console dans les paramètres de connexion locaux. Lors de la première connexion, vérifiez l’empreinte de la clé de l’hôte. Si vous ne disposez pas d’une source fiable pour la vérifier, demandez confirmation via un ticket plutôt que d’ignorer le contrôle. Une fois connecté, vérifiez le système et l’utilisateur.
Dans une session SSH interactive, exécutez passwd, puis suivez les instructions pour modifier le mot de passe de l’utilisateur actuel. Ne placez jamais le mot de passe dans les arguments d’une commande, un dépôt, une conversation ou les journaux de build. Gardez la session actuelle ouverte et ouvrez-en une autre pour vérifier que les nouveaux identifiants fonctionnent.
Générez une clé dédiée sur votre ordinateur et ajoutez uniquement la clé publique à la machine. Une fois la connexion par clé vérifiée, vous pourrez modifier la configuration de l’authentification par mot de passe. Avant de toucher aux paramètres du service SSH, gardez une session fonctionnelle ouverte pour éviter de perdre l’accès à la machine.
ssh -p "$MAC_SSH_PORT" "$MAC_USER@$MAC_HOST"
whoami
sw_vers
uname -m
xcode-select -p
df -h
passwd
Avant de vous connecter, définissez localement MAC_SSH_PORT,MAC_USERetMAC_HOSTà l’aide des valeurs indiquées dans la console. Exécutez les autres commandes sur la machine après connexion ;xcode-select -p permet de vérifier le chemin des outils de développement actuellement sélectionnés.
install -d -m 700 "$HOME/.ssh"
touch "$HOME/.ssh/authorized_keys"
chmod 600 "$HOME/.ssh/authorized_keys"
printf '%s\n' "$LOGIN_PUBLIC_KEY" >> "$HOME/.ssh/authorized_keys"
Commencez par définir LOGIN_PUBLIC_KEY avec le texte complet de votre clé publique, puis exécutez la commande d’ajout. Ne téléversez pas de clé privée et n’ajoutez pas plusieurs fois la même clé publique. Un délai d’expiration de connexion, un échec d’authentification et un changement de clé d’hôte sont des problèmes distincts : précisez lequel dans votre ticket.
Commencez par noter les versions de Xcode, du SDK et du runtime requises par le projet, plutôt que de passer directement à la dernière version. La compatibilité entre macOS et Xcode détermine les versions installables. Pour un projet existant, conservez d’abord la combinaison qui a déjà permis de compiler localement, puis validez toute mise à niveau séparément.
Si xcodesn’est pas encore installé sur la machine, installez-le selon la procédure approuvée par votre équipe. Pour installer une version donnée, utilisez un paquet Xcode local obtenu légalement et compatible avec les exigences du projet. Les variables ci-dessous, XCODE_VERSION et XCODE_XIP correspondent respectivement au numéro de version vérifié et au chemin absolu du paquet d’installation. N’intégrez pas les étapes interactives de l’installation à un job de build sans intervention.
xcodes installed
xcodes install "$XCODE_VERSION" --path "$XCODE_XIP"
xcodes installed
export DEVELOPER_DIR="$XCODE_APP/Contents/Developer"
xcodebuild -version
xcodebuild -showsdks
xcrun simctl list runtimes
XCODE_APP doit pointer vers le chemin réel de l’application installée. Pour la CI, définissez de préférence DEVELOPER_DIRdans l’environnement du job afin d’éviter que plusieurs jobs ne se disputent la sélection globale. Si vous devez vraiment changer les outils par défaut du système, exécutez sudo xcode-select --switch "$XCODE_APP/Contents/Developer"puis vérifiez à nouveau xcodebuild -version.
Lancez une première fois la version de Xcode sélectionnée et terminez la préparation des composants nécessaires. Vous pouvez utiliser l’interface graphique à distance, puis installer le runtime requis dans les réglages des composants de Xcode. Exécutez xcrun simctl list devices available, choisissez un simulateur correspondant à vos tests, démarrez-le une fois en mode interactif et attendez qu’il soit prêt avant de lancer un test minimal. L’archivage d’une app pour un appareil physique et les tests sur simulateur sont deux étapes distinctes. Ne confondez pas l’absence d’un runtime avec un problème de chaîne d’outils d’archivage.
Au début des journaux CI, vérifiez au minimum la version de Xcode, la liste des SDK et l’identifiant du commit. Après un changement de version de Xcode, régénérez la clé de cache et vérifiez les dépendances tierces, la signature et l’exportation. Modifier uniquement les tags du runner sans vérifier le chemin réel des outils ne garantit pas un environnement de build cohérent.
Les jobs exécutés sur un même nœud physique partagent le processeur, la mémoire, le disque et l’environnement utilisateur. Au départ, limitez chaque machine à un seul build à la fois. Lorsque l’archivage, la signature et le nettoyage sont stables, augmentez la concurrence en fonction de l’utilisation maximale observée ou ajoutez des nœuds distincts.
Dans les paramètres du projet, créez un runner de projet, préparez son jeton d’authentification et définissez les tags macos,arm64etios-archive . Placez temporairement l’URL de l’instance et le jeton d’authentification dans GITLAB_URLetGITLAB_RUNNER_TOKEN, puis enregistrez un exécuteur shell sous un compte dédié aux builds. Une fois l’opération terminée, supprimez la variable temporaire contenant le jeton.
gitlab-runner register \
--non-interactive \
--url "$GITLAB_URL" \
--token "$GITLAB_RUNNER_TOKEN" \
--executor "shell" \
--description "armrdp-ios-archive"
unset GITLAB_RUNNER_TOKEN
gitlab-runner verify
Dans le config.toml réellement utilisé par ce runner, définissez la valeur globale concurrent = 1et réglez le runner concerné sur limit = 1. Démarrez ensuite le runner selon le mode de gestion des services correspondant à la version installée. Une vérification interactive réussie ne signifie pas que le service fonctionne en arrière-plan.
ios_archive:
tags:
- macos
- arm64
- ios-archive
script:
- xcodebuild -version
- xcodebuild archive -workspace "$IOS_WORKSPACE" -scheme "$IOS_SCHEME" -destination 'generic/platform=iOS' -archivePath "$CI_PROJECT_DIR/output/App.xcarchive"
artifacts:
paths:
- output/App.xcarchive
expire_in: 7 days
Dans les variables du projet, définissez les valeurs réelles de IOS_WORKSPACE et IOS_SCHEME, puis préparez la signature comme indiqué à la section suivante. Cet exemple réalise uniquement l’archivage : il ne comprend ni exportation ni téléversement. La conservation des artefacts pendant 7 jours n’est qu’une valeur d’exemple, que vous pouvez adapter à la politique de conservation de votre équipe. N’ajoutez pas de certificats, de clés privées ni de trousseaux temporaires aux artefacts.
Téléchargez le programme compatible avec macOS ARM64 en suivant les instructions d’installation du runner fournies dans les paramètres du dépôt, puis ouvrez le répertoire décompressé. Définissez REPOSITORY_URL sur l’URL du dépôt actuel etRUNNER_TOKEN sur le jeton d’enregistrement utilisé pour cette opération. Les tags doivent figurer à la fois dans la configuration d’enregistrement et dans le workflow afin que les jobs soient dirigés vers la bonne chaîne d’outils.
./config.sh \
--url "$REPOSITORY_URL" \
--token "$RUNNER_TOKEN" \
--name "armrdp-ios-archive" \
--labels "macos,arm64,ios-archive" \
--work "_work"
unset RUNNER_TOKEN
./run.sh
name: iOS archive
on:
workflow_dispatch:
permissions:
contents: read
concurrency:
group: ios-archive
cancel-in-progress: false
jobs:
archive:
runs-on: [self-hosted, macos, arm64, ios-archive]
env:
DEVELOPER_DIR: ${{ vars.DEVELOPER_DIR }}
IOS_WORKSPACE: ${{ vars.IOS_WORKSPACE }}
IOS_SCHEME: ${{ vars.IOS_SCHEME }}
steps:
- uses: actions/checkout@v4
- name: Archive
run: |
xcodebuild -version
xcodebuild archive \
-workspace "$IOS_WORKSPACE" \
-scheme "$IOS_SCHEME" \
-destination 'generic/platform=iOS' \
-archivePath "$RUNNER_TEMP/App.xcarchive"
Commencez par définir le chemin des outils, le workspace et le scheme dans les variables du dépôt. Cet exemple se déclenche manuellement pour faciliter la validation initiale de l’environnement. N’exposez pas directement un runner contenant des identifiants de signature à du code externe non fiable. Un processus runner ne traite qu’un job à la fois ;concurrency limite également l’exécution des workflows d’un même groupe, mais ne constitue pas une limite des ressources à l’échelle de la machine.
Une fois les tests validés, configurez l’exécution permanente à l’aide du script de service fourni avec le programme téléchargé, puis vérifiez que le compte du service est le même que celui utilisé pour les tests manuels. Si la signature est configurée sous un compte et que le service tourne sous un autre, le build interactif peut réussir alors que la CI ne trouve ni le certificat ni le profil de provisionnement.
Le certificat de distribution, sa clé privée et le profil de provisionnement doivent correspondre à l’équipe et au Bundle Identifier utilisés par le projet. Validez d’abord la signature dans un job contrôlé avant de l’automatiser. Ne désactivez pas les contrôles de signature pour masquer un échec d’exportation.
Utilisez un trousseau dédié aux tâches automatisées et injectez son mot de passe via une variable secrète protégée de la CI. Après l’importation du certificat, autorisez uniquement les outils de signature qui en ont besoin ; ne donnez pas accès à la clé privée à toutes les applications. Les commandes ci-dessous vérifient que l’utilisateur actuel voit une identité de signature valide, mais ne garantissent pas que le profil de provisionnement, la configuration d’exportation et les réglages du projet correspondent parfaitement.
security list-keychains -d user
security find-identity -v -p codesigning
printf '%s\n' "$HOME/Library/MobileDevice/Provisioning Profiles"
printf '%s\n' "$HOME/Library/Developer/Xcode/UserData/Provisioning Profiles"
L’emplacement des profils de provisionnement peut varier selon la version de Xcode. Fiez-vous au chemin réellement utilisé par la chaîne d’outils active. Après l’importation, vérifiez la date d’expiration, l’identifiant de l’app et le type de signature. Si l’archivage réussit mais que l’exportation échoue, vérifiez en priorité la méthode d’exportation, l’identifiant de l’équipe et les correspondances des profils, plutôt que de réinstaller Xcode sans cesse.
Si votre équipe utilise déjà fastlane match, conservez le dépôt de certificats chiffré et les règles d’accès existants. Pour la phase de validation, utilisez bundle exec fastlane match appstore --readonlyafin de récupérer d’abord les éléments de signature existants, sans risquer de modifier les certificats de l’équipe depuis la machine de build. Gérez séparément les identifiants d’accès au dépôt, le mot de passe de déchiffrement et celui du trousseau. Ne mettez les variables de signature de production à disposition que des branches protégées ou de jobs manuels contrôlés.
À la fin du job, supprimez les fichiers temporaires et verrouillez le trousseau temporaire. Ne conservez dans les journaux que les codes d’erreur et les résultats nécessaires ; n’y affichez ni clés privées, ni mots de passe de certificats, ni jetons d’enregistrement, ni valeurs complètes des variables secrètes. Un Mac physique dédié isole les ressources, mais les autorisations des identifiants du projet doivent toujours respecter le principe du moindre privilège.
Vous pouvez ajouter un SSD de +1TB ou +2TB. Vérifiez d’abord dans la commande et sur la machine que l’extension a bien été effectuée, puis planifiez la migration. Le nom du volume, le point de montage et le système de fichiers dépendent des informations réellement fournies : ne reprenez pas à l’aveugle l’identifiant d’un disque provenant d’une autre machine.
Exécutez diskutil list et df -hpour vérifier la capacité et le point de montage. N’effacez pas et ne partitionnez pas un disque dont vous ne connaissez pas la nature. Créez un répertoire de cache accessible en écriture par le compte de build et testez la lecture et l’écriture avec un petit fichier. Vérifiez le comportement du montage après redémarrage avant de faire utiliser le nouveau chemin au runner permanent.
Avant la migration, cessez d’accepter de nouveaux jobs et attendez la fin des archivages et signatures en cours. DerivedData est un cache régénérable : mieux vaut le recréer au nouvel emplacement que copier un ancien cache potentiellement en cours d’écriture. L’exemple utilise l’option explicite -derivedDataPathet ne nécessite pas de déplacer tout le répertoire utilisateur vers le volume ajouté.
diskutil list
df -h
test -d "$BUILD_VOLUME" && test -w "$BUILD_VOLUME"
mkdir -p "$BUILD_VOLUME/DerivedData/$CACHE_KEY"
xcodebuild archive \
-workspace "$IOS_WORKSPACE" \
-scheme "$IOS_SCHEME" \
-destination 'generic/platform=iOS' \
-derivedDataPath "$BUILD_VOLUME/DerivedData/$CACHE_KEY" \
-archivePath "$BUILD_VOLUME/Archives/$BUILD_ID/App.xcarchive"
Avant l’exécution, définissez BUILD_VOLUME sur un point de montage dont l’accès en écriture a été vérifié.CACHE_KEY doit distinguer le dépôt, la version de Xcode et la configuration de build ;BUILD_ID doit identifier le job en cours de manière unique pour éviter que plusieurs jobs n’écrasent leurs archives. Les jobs exécutés en parallèle ne doivent pas partager le même répertoire DerivedData accessible en écriture.
Commencez par un build sans cache, puis observez les accès au cache et la consommation du disque lors des jobs suivants. Définissez des règles de conservation distinctes pour les archives, les données des simulateurs et le cache des dépendances. Avant toute suppression, vérifiez qu’aucun job n’utilise encore ces fichiers. Enregistrez les artefacts de build séparément dans un stockage géré par votre équipe ; le cache de la machine ne peut pas servir d’unique sauvegarde. Avant la fin de la location, exportez vos données et vérifiez que la sauvegarde est lisible.
Pour tout problème concernant une machine, une commande ou un paiement, connectez-vous à la console et ouvrez un ticket afin qu’il soit associé au bon service. Si vous ne pouvez pas vous connecter, écrivez à support@armrdp.com. Ces deux moyens sont les canaux de contact officiels.
| Champ | Informations à fournir | Utilité |
|---|---|---|
| Identifiant de la machine ou de la commande | Identifiant correspondant dans la console et nœud utilisé | Retrouver le bon service sans confondre les instances |
| Date et heure de l’incident | Heures de début et de fin, fuseau horaire, incident toujours en cours ou non | Faire correspondre les données du service avec les journaux des jobs |
| Type de problème | Délai de connexion dépassé, échec d’authentification, de build ou de signature, ou état de facturation | Distinguer un problème de réseau, de chaîne d’outils ou de facturation |
| Étapes de reproduction | Ordre des opérations, commande minimale, résultat attendu et résultat obtenu | Fournir le contexte nécessaire et limiter les échanges de clarification |
| Environnement et journaux | Version de Xcode, compte exécutant le service runner et journaux expurgés autour de l’erreur | Vérifier si le problème est lié à la version ou aux autorisations |
| Impact sur l’activité | Un job ou toute la machine est-il concerné ? Existe-t-il une solution de build de remplacement ? | Préciser l’ampleur de l’impact et les mesures déjà prises |
L’avancement du ticket et le délai de réponse dépendent des informations réellement affichées dans la console. Une première réponse ne signifie pas que le problème est résolu. Un problème de connexion peut nécessiter des vérifications de l’état de la machine et du chemin d’accès ; un problème de build demande généralement les journaux du job et des étapes de reproduction ; un problème de paiement doit être associé à la commande et à la transaction. Ces cas ne peuvent pas être ramenés à un délai de résolution unique.
Pendant l’attente, ajoutez les nouveaux éléments au même ticket et indiquez depuis combien de temps vous attendez et si l’impact s’est étendu. Évitez de réinstaller, d’effacer le disque ou de lancer un nettoyage massif susceptible de modifier l’état du système. Si l’erreur apparaît uniquement en CI, comparez l’exécution interactive et celle du service sous le même compte. Pour un problème de signature, ne fournissez que des messages d’erreur expurgés.
Les services sont prépayés à la journée, à la semaine, au mois ou au trimestre. Dans le détail de la commande, vérifiez également le modèle, le nœud, les dates de début et de fin de la période et les options. Pour le renouvellement, l’activation du renouvellement automatique et le résultat du paiement, fiez-vous aux paramètres actuels de la console et à la confirmation effective. Le fait d’avoir soumis un paiement ne signifie pas que la commande est active : ne vous fiez pas uniquement à une capture d’écran de la page de paiement.
Les seuls moyens de paiement acceptés sont USDT-TRC20 et Visa / Mastercard / Amex (via Stripe). Tous les paiements sont traités en dollars américains ; les moyens disponibles sont confirmés par le système de paiement au moment de l’achat. Pour un paiement sur blockchain, vérifiez le réseau, les coordonnées du destinataire et le montant. Si une vérification est nécessaire, fournissez l’identifiant de la commande et celui de la transaction, jamais la clé privée de votre portefeuille ni le numéro complet de votre carte.
Avant l’expiration, cessez de lancer de nouveaux builds, exportez les modifications de code, les artefacts d’archivage et les paramètres nécessaires, puis vérifiez que vous pouvez les restaurer depuis votre propre stockage. Si vous souhaitez poursuivre, confirmez la nouvelle date d’expiration après le renouvellement. Si vous mettez fin à la location, ne comptez pas sur la machine comme espace d’archivage à long terme après son échéance.
Commencez avec une seule machine et un seul job pour valider la chaîne d’outils, la signature et les artefacts, puis passez à plusieurs runners. Louez un Mac physique dédié à la journée à partir de $21.1/jour. La disponibilité en temps réel est indiquée dans la console.