Разница между Xcode и git для разрешения быстрых пакетов

9

Итак, история такова: у меня есть проект Xcode, который зависит от быстрого пакета, который находится в частном репозитории на github. Конечно, для этого требуется ключ для доступа. До сих пор мне удалось настроить CI таким образом, чтобы я мог использовать ssh в экземпляре и git cloneтребуемом хранилище для пакета swift. К сожалению, когда он работает с 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, который был добавлен к Заданию на CI.

Любые предложения о том, что может отличаться между тем, как Xcode пытается получить зависимости, и тем, как это делает vanilla git, было бы замечательно. Спасибо.

ratbum
источник
В настоящее время у меня та же проблема с действиями GitHub, что и у моего CI
bscothern
Не ответ, но иногда в прошлом (особенно в Xcode 10) детали аутентификации git имели тенденцию исчезать без всякой причины (нормально при запуске, затем pooof). Xcode 11 решает это.
Alex

Ответы:

5

Кажется, это ошибка в Xcode 11 с SSH. Переход на HTTPS для решения Swift Packages устраняет проблему:

Итак, из этого:

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;
        };
};
ratbum
источник
Это работает для локальных сборок, но не для машин CI, где вы не можете подписать XCode ни во что. Это всегда приводит к этой ошибке из Xcode: xcodebuild: error: Невозможно разрешить зависимости пакета: аутентификация не удалась, потому что учетные данные не были предоставлены. Мой опыт показывает, что версия SSH работает, если ваш ключ ssh настроен правильно в ~ / .ssh и GitHub. Пока вы также вошли в GitHub в Xcode.
bscothern
Это работает для меня на CI; Я не нахожусь в офисе до понедельника, поэтому не могу выяснить, как, но он определенно делает свою работу.
ratbum
3

Для конвейеров CI, где вы не можете войти в GitHub или другие хосты репозитория, я обнаружил, что это решение обходит ограничения / ошибки Xcode в отношении частных пакетов Swift.

Используйте https url для личных зависимостей, потому что конфигурация ssh в настоящее время игнорируется 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команду, чтобы игнорировать любые пути, которые вы не хотите изменять скриптом.
bscothern
источник