Diferencia entre Xcode y git para resolver paquetes rápidos

9

Entonces el fondo es este: tengo un proyecto Xcode que depende de un paquete rápido que está en un repositorio privado en github. Por supuesto, esto requiere una clave para acceder. Hasta ahora, he logrado configurar CI de modo que pueda ingresar a la instancia y git cloneal repositorio requerido para el paquete swift. Desafortunadamente, cuando lo ejecuta xcbuildcomo lo hace CI, no funciona y recibo este mensaje:

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

Por el contrario, git clonefelizmente obtendrá este repositorio como se ve aquí:

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.

Para un poco más de contexto, esto se ejecuta en CircleCI, configurado con una clave de implementación en GitHub, que se ha agregado al trabajo en CI.

Cualquier sugerencia sobre lo que podría ser diferente entre la forma en que Xcode intenta obtener dependencias y la forma en que lo hace vainilla git sería genial. Gracias.

Ratbum
fuente
Actualmente tengo el mismo problema con las acciones de GitHub que mi CI
bscothern
No es una respuesta, pero a veces en el pasado (especialmente Xcode 10), los detalles de autenticación git tenían una tendencia a desaparecer sin ningún motivo (está bien al inicio, luego caca). Xcode 11 resuelve eso.
Alex

Respuestas:

5

Esto parece ser un error en Xcode 11 con SSH. Cambiar a HTTPS para resolver paquetes Swift soluciona el problema:

Entonces de esto:

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

a:

E29801192303068A00018344 /* XCRemoteSwiftPackageReference "ProjectDependency" */ = {
        isa = XCRemoteSwiftPackageReference;
        repositoryURL = "https://github.com/company-uk/ProjectDependency.git";
        requirement = {
                branch = "debug";
                kind = branch;
        };
};
Ratbum
fuente
Esto funciona para compilaciones locales, pero no para máquinas CI en las que no puede iniciar sesión en Xcode en nada. Esto siempre produce este error de Xcode: xcodebuild: error: no se pudieron resolver las dependencias del paquete: la autenticación falló porque no se proporcionaron credenciales. Mi experiencia ha sido que la versión SSH funciona si su clave ssh está configurada correctamente en ~ / .ssh y GitHub. Siempre que también haya iniciado sesión en GitHub en Xcode.
bscothern
Esto está funcionando para mí en CI; No estoy en la oficina hasta el lunes, así que no puedo investigar cómo, pero definitivamente está haciendo el trabajo.
ratbum
3

Para las canalizaciones de CI donde no puede iniciar sesión en GitHub u otros hosts de repositorio, esta es la solución que encontré que omite las restricciones / errores de Xcode en los paquetes privados de Swift.

Utilice las URL https para las dependencias privadas porque xcodebuild ignora actualmente la configuración ssh aunque la documentación diga lo contrario.

Una vez que pueda construir localmente con https, vaya a su host de repositorio y cree un token de acceso personal (PAT). Para las instrucciones de GitHub se encuentran aquí .

Con su sistema CI, agregue este PAT como una variable de entorno secreta. En la secuencia de comandos a continuación se conoce como GITHUB_PAT.

Luego, en su canalización de CI antes de ejecutar, xcodebuildasegúrese de ejecutar una versión modificada adecuadamente de este 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

Este script encontrará todas las referencias https e inyectará el PAT para que pueda usarse sin contraseña.

No olvides:

  • Reemplace [org_name]con el nombre de su organización.
  • Reemplácelo ${GITHUB_PAT}con el nombre de su secreto CI si lo nombró de manera diferente.
  • Configure el grepcomando para ignorar cualquier ruta que no desee que el script modifique.
bscothern
fuente