Unterschied zwischen Xcode und Git zum Auflösen schneller Pakete

9

Der Hintergrund ist also folgender: Ich habe ein Xcode-Projekt, das von einem schnellen Paket abhängt, das sich in einem privaten Repository auf Github befindet. Dies erfordert natürlich einen Schlüssel für den Zugriff. Bisher habe ich es geschafft, CI so zu konfigurieren, dass ich ssh in die Instanz und git clonedas erforderliche Repository für das schnelle Paket einbinden kann. Leider xcbuildfunktioniert es nicht, wenn es wie CI ausgeführt wird, und ich erhalte die folgende Meldung:

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

Im Gegensatz dazu git clonewird dieses Repo gerne abgerufen, wie hier zu sehen:

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.

Für etwas mehr Kontext wird dies auf CircleCI ausgeführt, das mit einem Bereitstellungsschlüssel auf GitHub eingerichtet wurde, der dem Job auf CI hinzugefügt wurde.

Vorschläge, was sich zwischen der Art und Weise, wie Xcode versucht, Abhängigkeiten abzurufen, und der Art und Weise, wie Vanilla Git dies tut, unterscheiden könnte, wäre großartig. Vielen Dank.

Ratbum
quelle
Ich habe derzeit das gleiche Problem mit GitHub-Aktionen wie mein CI
bscothern
Keine Antwort, aber manchmal in der Vergangenheit (insbesondere Xcode 10) neigten die Git-Authentifizierungsdetails dazu, ohne Grund zu verschwinden (ok beim Start, dann pooof). Xcode 11 löst das.
Alex

Antworten:

5

Dies scheint ein Fehler in Xcode 11 mit SSH zu sein. Der Wechsel zu HTTPS zum Auflösen von Swift-Paketen behebt das Problem:

Also daraus:

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

zu:

E29801192303068A00018344 /* XCRemoteSwiftPackageReference "ProjectDependency" */ = {
        isa = XCRemoteSwiftPackageReference;
        repositoryURL = "https://github.com/company-uk/ProjectDependency.git";
        requirement = {
                branch = "debug";
                kind = branch;
        };
};
Ratbum
quelle
Dies funktioniert für lokale Builds, jedoch nicht für CI-Computer, auf denen Sie Xcode nicht signieren können. Dies führt immer zu diesem Fehler von Xcode: xcodebuild: Fehler: Paketabhängigkeiten konnten nicht aufgelöst werden: Die Authentifizierung ist fehlgeschlagen, da keine Anmeldeinformationen angegeben wurden. Ich habe die Erfahrung gemacht, dass die SSH-Version funktioniert, wenn Ihr SSH-Schlüssel in ~ / .ssh und GitHub korrekt konfiguriert ist. Solange Sie auch in Xcode bei GitHub angemeldet sind.
bscothern
Das funktioniert für mich bei CI; Ich bin erst am Montag im Büro, kann also nicht untersuchen, wie, aber es macht definitiv den Job.
Ratbum
3

Für CI-Pipelines, bei denen Sie sich nicht bei GitHub oder anderen Repository-Hosts anmelden können, ist dies die Lösung, die ich gefunden habe und die die Einschränkungen / Fehler von Xcode bei privaten Swift-Paketen umgeht.

Verwenden Sie https-URLs für die privaten Abhängigkeiten, da die ssh-Konfiguration derzeit von xcodebuild ignoriert wird, obwohl in der Dokumentation etwas anderes angegeben ist.

Sobald Sie mit https lokal erstellen können, gehen Sie zu Ihrem Repository-Host und erstellen Sie ein persönliches Zugriffstoken (PAT). Anweisungen zu GitHub finden Sie hier .

Fügen Sie mit Ihrem CI-System diese PAT als geheime Umgebungsvariable hinzu. Im folgenden Skript wird es als bezeichnet GITHUB_PAT.

Stellen Sie dann in Ihrer CI-Pipeline vor dem Ausführen xcodebuildsicher, dass Sie eine entsprechend geänderte Version dieses Bash-Skripts ausführen:

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

Dieses Skript findet alle https-Referenzen und fügt die PAT ein, sodass sie ohne Kennwort verwendet werden kann.

Vergiss nicht:

  • Ersetzen Sie [org_name]durch Ihren Organisationsnamen.
  • Ersetzen Sie ${GITHUB_PAT}durch den Namen Ihres CI-Geheimnisses, wenn Sie es anders benannt haben.
  • Konfigurieren Sie den grepBefehl so, dass alle Pfade ignoriert werden, die vom Skript nicht geändert werden sollen.
bscothern
quelle