Perbedaan antara Xcode dan git untuk menyelesaikan paket swift


9

Jadi latar belakangnya adalah ini: Saya memiliki proyek Xcode yang bergantung pada paket cepat yang ada di repositori pribadi di github. Tentu saja, ini memerlukan kunci untuk mengakses. Sejauh ini, saya sudah berhasil mengkonfigurasi CI sehingga saya bisa ssh ke instance dan git clonerepositori yang diperlukan untuk paket swift. Sayangnya ketika menjalankannya dengan xcbuildCI, tidak berfungsi dan saya mendapatkan pesan ini:

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

Sebaliknya, git cloneakan dengan senang hati mengambil repo ini seperti yang terlihat di sini:

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.

Untuk konteks yang sedikit lebih, ini berjalan di CircleCI, dibuat dengan kunci Deploy di GitHub, yang telah ditambahkan ke Job on CI.

Setiap saran tentang apa yang mungkin berbeda antara cara Xcode mencoba mengambil dependensi dan cara vanilla git melakukannya akan bagus. Terima kasih.


Saat ini saya mengalami masalah yang sama dengan Tindakan GitHub dengan CI saya
bscothern

Bukan jawaban, tapi terkadang di masa lalu (terutama Xcode 10), detail autentikasi git cenderung menghilang tanpa alasan (ok saat start up, lalu pooof). Xcode 11 memecahkan itu.
Alex

Jawaban:


5

Ini sepertinya bug di Xcode 11 dengan SSH. Beralih ke HTTPS untuk menyelesaikan Paket Swift memperbaiki masalah:

Jadi dari ini:

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

untuk:

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

Ini berfungsi untuk build lokal tetapi bukan mesin CI di mana Anda tidak dapat masuk Xcode ke apa pun. Ini selalu menghasilkan kesalahan ini dari Xcode: xcodebuild: error: Tidak dapat menyelesaikan dependensi paket: Otentikasi gagal karena tidak ada kredensial yang diberikan. Pengalaman saya adalah bahwa versi SSH berfungsi jika kunci ssh Anda dikonfigurasi dengan benar di ~ / .ssh dan GitHub. Selama Anda juga masuk ke GitHub di Xcode.
bscothern

Ini bekerja untuk saya di CI; Saya tidak di kantor sampai hari Senin jadi tidak bisa menyelidiki bagaimana, tetapi sudah pasti melakukan pekerjaan itu.
ratbum

3

Untuk saluran pipa CI di mana Anda tidak dapat masuk ke GitHub atau host repositori lainnya, ini adalah solusi yang saya temukan yang melewati pembatasan / bug Xcode di sekitar paket Swift pribadi.

Gunakan https url untuk dependensi pribadi karena konfigurasi ssh saat ini diabaikan oleh xcodebuild meskipun dokumentasi mengatakan sebaliknya.

Setelah Anda dapat membangun secara lokal dengan https, pergi ke host repositori Anda dan buat token akses pribadi (PAT). Untuk petunjuk GitHub dapat ditemukan di sini .

Dengan sistem CI Anda, tambahkan PAT ini sebagai variabel lingkungan rahasia. Dalam skrip di bawah ini disebut sebagai GITHUB_PAT.

Kemudian di dalam pipa CI Anda sebelum menjalankan, xcodebuildpastikan Anda menjalankan versi skrip bash yang dimodifikasi dengan tepat:

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

Script ini akan menemukan semua referensi https dan menyuntikkan PAT ke dalamnya sehingga dapat digunakan tanpa kata sandi.

Jangan lupa:

  • Ganti [org_name]dengan nama organisasi Anda.
  • Ganti ${GITHUB_PAT}dengan nama CI Secret Anda jika Anda menamainya secara berbeda.
  • Konfigurasikan grepperintah untuk mengabaikan jalur apa pun yang tidak ingin Anda modifikasi oleh skrip.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.