web-dev-qa-db-ja.com

解決のためのXcodeとgitの違いSwiftパッケージ

だから背景はこれです:私は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がそれを行う方法との違いについての提案は、すばらしいでしょう。ありがとう。

9
ratbum

これは、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;
        };
};
5
ratbum

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コマンドを構成します。
3
bscothern