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.
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;
};
};
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:
[org_name]
avec le nom de votre organisation.${GITHUB_PAT}
avec le nom de votre CI Secret si vous l'avez nommé différemment.grep
pour ignorer tous les chemins que vous ne souhaitez pas modifier par le script.