Différence entre Xcode et git pour la résolution de packages rapides

9

Donc, l'arrière-plan est le suivant: j'ai un projet Xcode qui dépend d'un package rapide qui est dans un référentiel privé sur github. Bien sûr, cela nécessite une clé d'accès. Jusqu'à présent, j'ai réussi à configurer CI de telle sorte que je puisse ssh dans l'instance et git clonele référentiel requis pour le package swift. Malheureusement, lors de son exécution avec xcbuildcomme CI, cela ne fonctionne pas et je reçois ce message:

static:ios distiller$ xcodebuild -showBuildSettings -workspace ./Project.xcworkspace \
    -scheme App\ Prod
Resolve Package Graph
Fetching git@github.com:company-uk/ProjectDependency.git
xcodebuild: error: Could not resolve package dependencies:
  Authentication failed because the credentials were rejected

En revanche, git clonerécupérera volontiers ce dépôt comme on le voit ici:

static:ios distiller$ git clone git@github.com:company-uk/ProjectDependency.git
Cloning into 'ProjectDependency'...
Warning: Permanently added the RSA host key for IP address '11.22.33.44' to the list of known hosts.
remote: Enumerating objects: 263, done.
remote: Counting objects: 100% (263/263), done.
remote: Compressing objects: 100% (171/171), done.
remote: Total 1335 (delta 165), reused 174 (delta 86), pack-reused 1072
Receiving objects: 100% (1335/1335), 1.11 MiB | 5.67 MiB/s, done.
Resolving deltas: 100% (681/681), done.

Pour un peu plus de contexte, cela fonctionne sur CircleCI, configuré avec une clé Deploy sur GitHub, qui a été ajoutée au Job sur CI.

Toutes les suggestions sur ce qui pourrait être différent entre la façon dont Xcode essaie de récupérer les dépendances et la façon dont vanilla git le ferait seraient formidables. Merci.

ratbum
la source
J'ai actuellement le même problème avec GitHub Actions que mon CI
bscothern
Pas une réponse, mais parfois dans le passé (en particulier Xcode 10), les détails d'authentification git avaient tendance à disparaître sans raison (ok au démarrage, puis pooof). Xcode 11 résout cela.
Alex

Réponses:

5

Cela semble être un bogue dans Xcode 11 avec SSH. Le passage à HTTPS pour résoudre les packages Swift résout le problème:

Donc à partir de là:

E29801192303068A00018344 /* XCRemoteSwiftPackageReference "ProjectDependency" */ = {
        isa = XCRemoteSwiftPackageReference;
        repositoryURL = "[email protected]:company-uk/ProjectDependency.git";
        requirement = {
                branch = "debug";
                kind = branch;
        };
};

à:

E29801192303068A00018344 /* XCRemoteSwiftPackageReference "ProjectDependency" */ = {
        isa = XCRemoteSwiftPackageReference;
        repositoryURL = "https://github.com/company-uk/ProjectDependency.git";
        requirement = {
                branch = "debug";
                kind = branch;
        };
};
ratbum
la source
Cela fonctionne pour les builds locaux mais pas pour les machines CI où vous ne pouvez pas connecter Xcode à quoi que ce soit. Cela entraîne toujours cette erreur de Xcode: xcodebuild: error: Impossible de résoudre les dépendances de package: l'authentification a échoué car aucune information d'identification n'a été fournie. D'après mon expérience, la version SSH fonctionne si votre clé ssh est configurée correctement dans ~ / .ssh et GitHub. Tant que vous êtes également connecté à GitHub dans Xcode.
bscothern
Cela fonctionne pour moi sur CI; Je ne suis pas au bureau avant lundi, je ne peux donc pas enquêter, mais il fait définitivement le travail.
ratbum
3

Pour les pipelines CI où vous ne pouvez pas vous connecter à GitHub ou à d'autres hôtes de référentiel, c'est la solution que j'ai trouvée qui contourne les restrictions / bogues de Xcode autour des packages Swift privés.

Utilisez les URL https pour les dépendances privées car la configuration ssh est actuellement ignorée par xcodebuild même si la documentation indique le contraire.

Une fois que vous pouvez créer localement avec https, accédez à votre hôte de référentiel et créez un jeton d'accès personnel (PAT). Pour les instructions GitHub se trouvent ici .

Avec votre système CI, ajoutez ce PAT en tant que variable d'environnement secrète. Dans le script ci-dessous, il est appeléGITHUB_PAT .

Ensuite, dans votre pipeline CI avant d'exécuter, xcodebuildassurez-vous d'exécuter une version modifiée de manière appropriée de ce script bash:

for FILE in $(grep -Ril "https://github.com/[org_name]" .); do
    sed -i '' "s/https:\/\/github.com\/[org_name]/https:\/\/${GITHUB_PAT}@github.com\/[org_name]/g" ${FILE}
done

Ce script trouvera toutes les références https et y injectera le PAT afin qu'il puisse être utilisé sans mot de passe.

N'oubliez pas:

  • Remplacer [org_name] par le nom de votre organisation.
  • Remplacer ${GITHUB_PAT} par le nom de votre CI Secret si vous l'avez nommé différemment.
  • Configurez la grepcommande pour ignorer tous les chemins que vous ne souhaitez pas modifier par le script.
bscothern
la source