web-dev-qa-db-fra.com

Différence entre Xcode et git pour résoudre les packages Swift

Donc, l'arrière-plan est le suivant: j'ai un projet Xcode qui dépend d'un Swift qui est dans un référentiel privé sur github. Bien sûr, cela nécessite une clé pour accéder. Jusqu'à présent, j'ai réussi à configurer CI de telle sorte que je puisse ssh dans l'instance et git clone le référentiel requis pour le Swift. Malheureusement lors de son exécution avec xcbuild comme le fait 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 [email protected]:company-uk/ProjectDependency.git
xcodebuild: error: Could not resolve package dependencies:
  Authentication failed because the credentials were rejected

En revanche, git clone récupérera ce repo avec plaisir comme vu ici:

static:ios distiller$ git clone [email protected]: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.

9
ratbum

Cela semble être un bogue dans Xcode 11 avec SSH. Passer à HTTPS pour résoudre Swift Packages 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;
        };
};
5
ratbum

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 privés Swift.

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 à l'hôte de votre 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 xcodebuild assurez-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] avec le nom de votre organisation.
  • Remplacer ${GITHUB_PAT} avec le nom de votre CI Secret si vous l'avez nommé différemment.
  • Configurez la commande grep pour ignorer tous les chemins que vous ne souhaitez pas modifier par le script.
3
bscothern