Różnica między Xcode a git do rozwiązywania szybkich pakietów


9

Tak więc tło jest następujące: mam projekt Xcode, który zależy od szybkiego pakietu, który znajduje się w prywatnym repozytorium na github. Oczywiście wymaga to klucza dostępu. Do tej pory udało mi się skonfigurować CI tak, że mogę ssh w instancji i git clonewymaganym repozytorium dla szybkiego pakietu. Niestety, gdy działa z xcbuildCI tak jak CI, to nie działa i pojawia się ten komunikat:

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

Natomiast git clonechętnie pobierze to repozytorium, jak pokazano tutaj:

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.

Dla nieco większego kontekstu działa to na CircleCI, skonfigurowanym za pomocą klucza Wdróż na GitHub, który został dodany do zadania w CI.

Wszelkie sugestie dotyczące tego, co może różnić się między sposobem, w jaki Xcode próbuje pobrać zależności, a sposobem, w jaki robi to waniliowy git, byłoby świetne. Dzięki.


Mam obecnie ten sam problem z GitHub Actions, co mój CI
bscothern,

Nie jest to odpowiedź, ale czasami w przeszłości (szczególnie Xcode 10) szczegóły uwierzytelniania git miały tendencję do znikania bez żadnych powodów (ok przy uruchomieniu, a potem kupie). Xcode 11 rozwiązuje to.
Alex

Odpowiedzi:


5

To wydaje się być błędem w Xcode 11 z SSH. Przejście na HTTPS w celu rozwiązania pakietów szybkich rozwiązuje problem:

Więc z tego:

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

do:

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

Działa to dla lokalnych kompilacji, ale nie dla maszyn CI, gdzie nie można podpisać Xcode na niczym. To zawsze powoduje błąd z Xcode: xcodebuild: error: Nie można rozwiązać zależności pakietu: Uwierzytelnienie nie powiodło się, ponieważ nie podano poświadczeń. Z mojego doświadczenia wynika, że ​​wersja SSH działa, jeśli Twój klucz ssh jest poprawnie skonfigurowany w ~ / .ssh i GitHub. Tak długo, jak jesteś zalogowany do GitHub w Xcode.
bscothern,

To działa dla mnie w CI; Nie jestem w biurze do poniedziałku, więc nie mogę dowiedzieć się, jak to zrobić, ale zdecydowanie wykonuje swoją pracę.
ratbum

3

W przypadku potoków CI, w których nie można zalogować się do GitHub lub innych hostów repozytorium, znalazłem rozwiązanie, które omija ograniczenia / błędy Xcode wokół prywatnych pakietów Swift.

Użyj adresów URL https dla prywatnych zależności, ponieważ konfiguracja ssh jest obecnie ignorowana przez xcodebuild, nawet jeśli dokumentacja mówi inaczej.

Gdy będziesz mógł budować lokalnie za pomocą https, przejdź do hosta repozytorium i utwórz osobisty token dostępu (PAT). Instrukcje GitHub znajdują się tutaj .

W systemie CI dodaj ten PAT jako tajną zmienną środowiskową. W skrypcie poniżej jest to określane jako GITHUB_PAT.

Następnie w potoku CI przed uruchomieniem xcodebuildupewnij się, że uruchomiłeś odpowiednio zmodyfikowaną wersję tego skryptu 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

Ten skrypt znajdzie wszystkie referencje https i wstrzykuje do niego PAT, dzięki czemu można go używać bez hasła.

Nie zapomnij:

  • Zamień [org_name]na nazwę swojej organizacji.
  • Zamień ${GITHUB_PAT}na nazwę swojego klucza tajnego CI, jeśli nazwałeś go inaczej.
  • Skonfiguruj greppolecenie, aby ignorowało ścieżki, których skrypt nie chce modyfikować.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.