신속한 패키지를 해결하기위한 Xcode와 git의 차이점


9

그래서 배경은 이것입니다 : github의 개인 저장소에있는 신속한 패키지에 의존하는 Xcode 프로젝트가 있습니다. 물론 액세스하려면 키가 필요합니다. 지금까지 인스턴스와 git clone신속한 패키지에 필요한 저장소 로 ssh 할 수 있도록 CI를 구성했습니다 . 불행히도 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에서 실행 중이며 CI의 작업에 추가 된 GitHub의 배포 키로 설정되어 있습니다.

Xcode가 의존성을 가져 오는 방식과 바닐라 git이 수행하는 방식 사이에 다른 점에 대한 제안은 훌륭합니다. 감사.


저는 현재 GitHub Actions에서 CI와 같은 문제를
겪고 있습니다

대답은 아니지만 때로는 과거 (특히 Xcode 10)에서 git 인증 세부 정보가 아무런 이유없이 사라지는 경향이있었습니다 (시작시 pooof). Xcode 11이 해결합니다.
Alex

답변:


5

이것은 SSH가있는 Xcode 11의 버그 인 것 같습니다. 스위프트 패키지를 해결하기 위해 HTTPS로 전환하면 문제가 해결됩니다.

그래서 이것으로부터 :

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;
        };
};

이것은 로컬 빌드에서는 작동하지만 Xcode에 서명 할 수없는 CI 시스템에서는 작동하지 않습니다. 이로 인해 항상 Xcode에서이 오류가 발생합니다. xcodebuild : error : 패키지 종속성을 해결할 수 없습니다. 자격 증명이 제공되지 않아 인증에 실패했습니다. 내 경험은 ssh 키가 ~ / .ssh 및 GitHub에 올바르게 구성된 경우 SSH 버전이 작동한다는 것입니다. Xcode에서 GitHub에 로그인되어있는 한.
bscothern

이것은 CI에서 나를 위해 일하고 있습니다. 월요일까지 사무실에 없어서 어떻게 조사 할 수는 없지만 분명히 일을하고 있습니다.
ratbum

3

GitHub 또는 다른 리포지토리 호스트에 로그인 할 수없는 CI 파이프 라인의 경우 프라이빗 스위프트 패키지 주변의 Xcode 제한 / 버그를 우회하는 솔루션입니다.

ssh 구성은 문서에서 달리 명시되어 있지만 xcodebuild에서 현재 무시되므로 https 종속성을 개인 종속성에 사용하십시오.

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 비밀의 이름으로.
  • grep스크립트로 수정하지 않으려는 경로를 무시 하도록 명령을 구성하십시오 .
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.