Differenza tra Xcode e git per la risoluzione di pacchetti rapidi


9

Quindi lo sfondo è questo: ho un progetto Xcode che dipende da un pacchetto rapido che si trova in un repository privato su github. Naturalmente, questo richiede una chiave per accedere. Finora sono riuscito a configurare CI in modo tale da poter ssh nell'istanza e git clonenel repository richiesto per il pacchetto rapido. Sfortunatamente quando lo xcbuildeseguo come fa CI, non funziona e ricevo questo messaggio:

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

Al contrario, git cloneprenderò felicemente questo repository come visto qui:

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.

Per un po 'più di contesto, questo è in esecuzione su CircleCI, configurato con una chiave Deploy su GitHub, che è stata aggiunta al Job su CI.

Qualsiasi suggerimento su cosa potrebbe essere diverso tra il modo in cui Xcode cerca di recuperare le dipendenze e il modo in cui lo fa Vanilla Git sarebbe fantastico. Grazie.


Al momento sto
riscontrando

Non una risposta, ma a volte in passato (in particolare Xcode 10), i dettagli di autenticazione git avevano la tendenza a scomparire senza motivo (ok all'avvio, quindi pooof). Xcode 11 risolve questo.
Alex

Risposte:


5

Questo sembra essere un bug in Xcode 11 con SSH. Il passaggio a HTTPS per la risoluzione dei pacchetti Swift risolve il problema:

Quindi da questo:

E29801192303068A00018344 /* XCRemoteSwiftPackageReference "ProjectDependency" */ = {
        isa = XCRemoteSwiftPackageReference;
        repositoryURL = "git@github.com:company-uk/ProjectDependency.git";
        requirement = {
                branch = "debug";
                kind = branch;
        };
};

per:

E29801192303068A00018344 /* XCRemoteSwiftPackageReference "ProjectDependency" */ = {
        isa = XCRemoteSwiftPackageReference;
        repositoryURL = "https://github.com/company-uk/ProjectDependency.git";
        requirement = {
                branch = "debug";
                kind = branch;
        };
};

Funziona con build locali ma non con macchine CI in cui non puoi firmare Xcode in nulla. Ciò provoca sempre questo errore da Xcode: xcodebuild: errore: impossibile risolvere le dipendenze del pacchetto: autenticazione non riuscita perché non sono state fornite credenziali. La mia esperienza è stata che la versione SSH funziona se la tua chiave ssh è configurata correttamente in ~ / .ssh e GitHub. Finché si è anche connessi a GitHub in Xcode.
bscothern,

Questo sta funzionando per me su CI; Non sono in ufficio fino a lunedì, quindi non posso indagare su come, ma sicuramente sta facendo il lavoro.
Ratbum

3

Per le pipeline CI in cui non è possibile accedere a GitHub o ad altri host di repository, questa è la soluzione che ho scoperto che aggira le restrizioni / i bug di Xcode attorno ai pacchetti Swift privati.

Utilizzare gli URL https per le dipendenze private perché la configurazione ssh è attualmente ignorata da xcodebuild anche se la documentazione dice diversamente.

Una volta che puoi creare localmente con https vai al tuo repository host e crea un token di accesso personale (PAT). Per le istruzioni di GitHub sono disponibili qui .

Con il tuo sistema CI aggiungi questo PAT come variabile d'ambiente segreta. Nello script seguente viene indicato come GITHUB_PAT.

Quindi nella pipeline CI prima di eseguire xcodebuildassicurati di eseguire una versione opportunamente modificata di questo 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

Questo script troverà tutti i riferimenti https e inserirà il PAT in esso in modo che possa essere utilizzato senza una password.

Non dimenticare:

  • Sostituisci [org_name]con il nome della tua organizzazione.
  • Sostituisci ${GITHUB_PAT}con il nome del tuo CI CI se lo hai chiamato in modo diverso.
  • Configura il grepcomando per ignorare tutti i percorsi che non vuoi vengano modificati dallo script.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.