迅速なパッケージを解決するためのXcodeとgitの違い


9

だから背景はこれです:githubのプライベートリポジトリにある迅速なパッケージに依存するXcodeプロジェクトがあります。もちろん、これにはアクセスするためのキーが必要です。これまでのところ、インスタンスとgit cloneswiftパッケージに必要なリポジトリに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のDeployキーでセットアップされています。

Xcodeが依存関係をフェッチしようとする方法とバニラgitがそれを行う方法との間の違いについての提案は素晴らしいでしょう。ありがとう。


私は現在、GitHubアクションで自分のCIと同じ問題を抱えています
bscothern

答えではありませんが、過去(特にXcode 10)には、理由もなくgit認証の詳細が消える傾向がありました(起動時にOK、次にpooof)。Xcode 11はそれを解決します。
Alex

回答:


5

これは、SSHを使用するXcode 11のバグのようです。Swiftパッケージを解決するために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:エラー:パッケージの依存関係を解決できませんでした:資格情報が提供されなかったため、認証に失敗しました。私の経験では、sshキーが〜/ .sshとGitHubで正しく設定されていれば、SSHバージョンが機能します。XcodeでGitHubにもサインインしている限り。
bscothern

これはCIで私のために働いています。私は月曜日までオフィスにいないので、どのように調査することができないが、それは間違いなく仕事をしている。
19

3

GitHubまたは他のリポジトリホストにサインインできないCIパイプラインの場合、これは私が見つけたソリューションであり、プライベートSwiftパッケージに関するXcodeの制限/バグをバイパスします。

ドキュメントに特に記載されていなくても、ssh構成は現在xcodebuildによって無視されているため、プライベート依存関係にはhttps URLを使用してください。

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.