Різниця між Xcode та git для вирішення швидких пакетів


9

Отже, фон такий: у мене є проект Xcode, який залежить від швидкого пакету, який знаходиться в приватному сховищі на github. Звичайно, для цього потрібен ключ для доступу. Поки що мені вдалося налаштувати CI таким чином, що я можу перейти до екземпляра та git cloneнеобхідного сховища для швидкого пакету. На жаль, коли він працює з xcbuildCI, це не працює, і я отримую це повідомлення:

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

На відміну від цього, git cloneрадісно отримаємо це репо, як видно тут:

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.

Дещо більше контексту, це працює на CircleCI, створеному за допомогою ключа Deploy на GitHub, який був доданий до Job on CI.

Будь-які пропозиції щодо того, що може відрізнятися між тим, як Xcode намагається отримати залежність, і тим, як це робить ванільний git, було б чудово. Дякую.


На даний момент у мене є та сама проблема з діями GitHub, як і у мого CI
до

Не відповідь, але іноді в минулому (особливо Xcode 10), дані автентифікації git мали тенденцію зникати без будь-яких причин (нормально при запуску, потім пуфі). Xcode 11 вирішує це.
Олексій

Відповіді:


5

Здається, це помилка в Xcode 11 із SSH. Перехід на HTTPS для вирішення пакетів Swift виправляє проблему:

Отже, з цього:

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

до:

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

Це працює для локальних побудов, але не для машин CI, де ви не можете ввійти Xcode ні в що. Це завжди призводить до цієї помилки з Xcode: xcodebuild: error: Не вдалося вирішити залежність пакета: Автентифікація не вдалася, оскільки не було надано облікових даних. Мій досвід показав, що версія SSH працює, якщо ваш ключ ssh правильно налаштований у ~ / .ssh та GitHub. Поки ви також увійшли в GitHub в Xcode.
бскорто

Це працює для мене на CI; Я не в офісі до понеділка, тому не можу розслідувати, як, але це, безумовно, робить роботу.
ratbum

3

Для конвеєрів CI, де ви не можете ввійти в GitHub чи інші хости репозиторію, це рішення, яке я знайшов, що обходить обмеження / помилки Xcode навколо приватних пакетів Swift.

Використовуйте https URL-адреси для приватних залежностей, оскільки xsh-конфігурація в даний час ігнорується xcodebuild, хоча документація говорить про інше.

Після того, як ви зможете побудувати локально за допомогою https, перейдіть до хосту вашого сховища та створіть персональний маркер доступу (PAT). Інструкції GitHub можна знайти тут .

За допомогою системи CI додайте цей PAT як таємну змінну середовища. У нижченаведеному сценарії воно позначається як GITHUB_PAT.

Потім у своєму конвеєрі CI перед запуском xcodebuildпереконайтеся, що ви запустили належним чином модифіковану версію цього сценарію 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

Цей скрипт знайде всі https-посилання та введе в нього PAT, щоб його можна було використовувати без пароля.

Не забувайте:

  • Замініть [org_name]назвою вашої організації.
  • Замініть ${GITHUB_PAT}на ім’я вашого CI Secret, якщо ви його назвали іншим чином.
  • Налаштуйте grepкоманду, щоб ігнорувати будь-які шляхи, які ви не хочете змінити сценарієм.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.