Sự khác biệt giữa Xcode và git để giải quyết các gói swift


9

Vì vậy, nền tảng là đây: Tôi có một dự án Xcode phụ thuộc vào gói swift trong kho lưu trữ riêng trên github. Tất nhiên, điều này đòi hỏi một chìa khóa để truy cập. Cho đến nay, tôi đã quản lý để cấu hình CI sao cho tôi có thể ssh vào thể hiện và git clonekho lưu trữ bắt buộc cho gói swift. Thật không may khi chạy nó với xcbuildCI, nó không hoạt động và tôi nhận được thông báo này:

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

Ngược lại, git clonesẽ vui vẻ lấy repo này như đã thấy ở đây:

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.

Để biết thêm một chút bối cảnh, điều này đang chạy trên CircleCI, được thiết lập với khóa Triển khai trên GitHub, đã được thêm vào Công việc trên CI.

Bất kỳ đề xuất nào về những gì có thể khác nhau giữa cách Xcode cố gắng tìm nạp các phụ thuộc và cách vanilla git thực hiện sẽ rất tuyệt. Cảm ơn.


Tôi hiện đang gặp vấn đề tương tự với các hành động của GitHub như CI của tôi
bscothern

Không phải là một câu trả lời, nhưng đôi khi trong quá khứ (đặc biệt là Xcode 10), các chi tiết xác thực git có xu hướng biến mất mà không có lý do (ok khi khởi động, sau đó là pooof). Xcode 11 giải quyết điều đó.
Alex

Câu trả lời:


5

Đây dường như là một lỗi trong Xcode 11 với SSH. Chuyển sang HTTPS để giải quyết Gói Swift khắc phục sự cố:

Vì vậy, từ đây:

E29801192303068A00018344 /* XCRemoteSwiftPackageReference "ProjectDependency" */ = {
        isa = XCRemoteSwiftPackageReference;
        repositoryURL = "git@github.com:company-uk/ProjectDependency.git";
        requirement = {
                branch = "debug";
                kind = branch;
        };
};

đến:

E29801192303068A00018344 /* XCRemoteSwiftPackageReference "ProjectDependency" */ = {
        isa = XCRemoteSwiftPackageReference;
        repositoryURL = "https://github.com/company-uk/ProjectDependency.git";
        requirement = {
                branch = "debug";
                kind = branch;
        };
};

Điều này hoạt động cho các bản dựng cục bộ nhưng không phải máy CI, nơi bạn không thể đăng nhập Xcode vào bất cứ thứ gì. Điều này luôn dẫn đến lỗi này từ Xcode: xcodebuild: error: Không thể giải quyết các phụ thuộc gói: Xác thực thất bại vì không có thông tin đăng nhập được cung cấp. Kinh nghiệm của tôi là phiên bản SSH hoạt động nếu khóa ssh của bạn được cấu hình đúng trong ~ / .ssh và GitHub. Miễn là bạn cũng đã đăng nhập vào GitHub trong Xcode.
bscothern

Điều này đang làm việc cho tôi trên CI; Tôi không ở văn phòng cho đến thứ Hai vì vậy không thể điều tra làm thế nào, nhưng nó chắc chắn đang thực hiện công việc.
ratbum

3

Đối với các đường ống CI nơi bạn không thể đăng nhập vào GitHub hoặc các máy chủ lưu trữ khác, đây là giải pháp tôi tìm thấy bỏ qua các hạn chế / lỗi của Xcode xung quanh các gói Swift riêng tư.

Sử dụng url https cho các phụ thuộc riêng tư vì cấu hình ssh hiện bị xcodebuild bỏ qua mặc dù tài liệu nói khác.

Khi bạn có thể xây dựng cục bộ bằng https, hãy truy cập máy chủ lưu trữ của bạn và tạo mã thông báo truy cập cá nhân (PAT). Đối với hướng dẫn GitHub được tìm thấy ở đây .

Với hệ thống CI của bạn, hãy thêm PAT này như một biến môi trường bí mật. Trong kịch bản dưới đây, nó được gọi là GITHUB_PAT.

Sau đó, trong đường ống CI của bạn trước khi bạn chạy, xcodebuildhãy đảm bảo bạn chạy phiên bản sửa đổi phù hợp của tập lệnh bash này:

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

Tập lệnh này sẽ tìm thấy tất cả các tài liệu tham khảo https và đưa PAT vào nó để có thể sử dụng nó mà không cần mật khẩu.

Đừng quên:

  • Thay thế [org_name]bằng tên tổ chức của bạn.
  • Thay thế ${GITHUB_PAT}bằng tên của CI Secret nếu bạn đặt tên khác.
  • Định cấu hình greplệnh để bỏ qua bất kỳ đường dẫn nào bạn không muốn sửa đổi bởi tập lệnh.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.