だから背景はこれです:私はgithubのプライベートリポジトリにあるSwiftパッケージに依存するXcodeプロジェクトを持っています。もちろん、これにはアクセスするためのキーが必要です。これまでのところ、インスタンスにsshで接続できるようにCIを構成し、git clone
Swiftパッケージに必要なリポジトリ。残念ながら、CIのようにxcbuild
で実行すると、動作せず、次のメッセージが表示されます。
static:ios distiller$ xcodebuild -showBuildSettings -workspace ./Project.xcworkspace \
-scheme App\ Prod
Resolve Package Graph
Fetching [email protected]: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 [email protected]: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が依存関係をフェッチしようとする方法と、Vanilla gitがそれを行う方法との違いについての提案は、すばらしいでしょう。ありがとう。
これは、SSHを使用するXcode 11のバグのようです。 Swiftパッケージを解決するためにHTTPSに切り替えると、問題が修正されます。
だからこれから:
E29801192303068A00018344 /* XCRemoteSwiftPackageReference "ProjectDependency" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "[email protected]: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;
};
};
GitHubまたは他のリポジトリホストにサインインできないCIパイプラインの場合、これは、プライベートSwiftパッケージに関するXcodeの制限/バグを回避することがわかったソリューションです。
ドキュメントに特に記載されていなくても、ssh構成は現在xcodebuildによって無視されているため、プライベート依存関係にはhttps URLを使用してください。
Httpsを使用してローカルでビルドできるようになったら、リポジトリのホストに移動して個人用アクセストークン(PAT)を作成します。 GitHubの場合、説明は here にあります。
CIシステムで、このPATを秘密の環境変数として追加します。以下のスクリプトではGITHUB_PAT
。
次に、xcodebuild
を実行する前にCIパイプラインで、この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
コマンドを構成します。