신속한 패키지를 해결하기위한 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.