前述
本文是一次探【Mo】索【Yu】過程的記述垒酬,為了節(jié)約您的寶貴時間,需要執(zhí)行步驟的,請直接查閱步驟總結(jié),您的一鍵三連是我持續(xù)分享的最大動力秀撇,拜謝??件相!
遇到問題
眾所周知,Swift Package Manager是Apple官方出品的一套包管理工具,內(nèi)置于Xcode柠傍,其具有較好的離散型逞泄,編譯時再拉取依賴的特性使得宿主工程更輕便患整,相較傳統(tǒng)cocoapod有親爹支持,又輕量的優(yōu)點(diǎn)喷众。我司在整體切換到xcframework后也開始轉(zhuǎn)投Swift Package Manager的懷抱各谚。
然而使用過程中我們發(fā)現(xiàn)CI在拉取依賴時會發(fā)生鑒權(quán)問題,這在Xcode健全的GUI界面下到千,本不應(yīng)該是個棘手的問題昌渤,然而,在根據(jù)Apple官方文檔中的描述我們發(fā)現(xiàn)憔四,SPM的CI鑒權(quán)方式膀息,Apple只提供了SSH和Xcode Server兩條路子般眉,(Xcode Server用的人太少,不在本文討論范圍)潜支。也就是說如果我們使用Jenkins進(jìn)行自動化構(gòu)建甸赃,此時又使用了需要鑒權(quán)的SPM,若不巧又碰上因特殊原因SSH不能被CI機(jī)器訪問冗酿,那么你就跟我一樣遇到了一個尷尬的無法讓Jenkins通過鑒權(quán)拉取SPM依賴的問題埠对,如下圖所示
作出假設(shè)
在遇到該問題時,我們首先考慮的是事先將密碼扔給Git裁替,因為我們知道理論上鸠窗,需要鑒權(quán)的Git倉庫,在我們的每一次操作時都需要進(jìn)行用戶名和密碼的鑒權(quán)胯究,是Git工具緩存了我們的鑒權(quán)憑證,使得在我們的日常使用中躁绸,只需要在首次clone Git倉庫的時候需要進(jìn)行鑒權(quán)裕循。也就是說,如果提前將需要鑒權(quán)的Git倉庫的憑據(jù)設(shè)置到Git工具净刮,讓Git在每次拉取的時候自動把鑒權(quán)的用戶名和密碼填上剥哑,就能解決HTTP鏈接下Git倉庫的鑒權(quán)問題,這TM不就是半小時的事情淹父,Nice??【事實上 這是個Flag】
瘋狂踩坑
- 遠(yuǎn)程連接沒有命令回顯
使用SSH遠(yuǎn)程連接CI機(jī)器時株婴,在終端執(zhí)行git credential-osxkeychain
相關(guān)指令是沒有回顯的,但實際上它已經(jīng)執(zhí)行成功了暑认,所以千萬不要在這種狀態(tài)下執(zhí)行git credential-osxkeychain get
來查看保存的憑證困介,否則你會懷疑人生。
正確的做法是使用GUI工具如VNC或者M(jìn)ac自帶的屏幕共享工具連接CI機(jī)器蘸际,再到機(jī)器上打開終端執(zhí)行指令座哩。這樣就能看到正確的回顯以使得工作得以正常進(jìn)行。
- 設(shè)置了憑據(jù)也驗證設(shè)置成功了粮彤,Git命令行依然需要輸入憑據(jù)
設(shè)置的憑據(jù)需要保證host路徑根穷、protocol協(xié)議與Git倉庫高度一致,打錯了即使能保存進(jìn)去也是用不了的导坟。
特別的屿良,如果Git倉庫路徑上帶端口,那么host需要寫全域名和端口號惫周,如
host=xxx.xxx.xxx:1234
- 鑰匙串訪問設(shè)置賬號密碼無效
直接在鑰匙串訪問上Git工具也是無法用來鑒權(quán)的尘惧,還是需要通過執(zhí)行git credential-osxkeychain store
來保存
- 把SPM放到工程倉庫本地企圖更改SPM cache路徑
在Fastlane中可以使用cloned_source_packages_path
參數(shù)將依賴放到工程中,然后再自定義SPM以來包路徑闯两,理論上可以實現(xiàn)使用工程文件夾下的SPM依賴包來進(jìn)行編譯褥伴,但實際上經(jīng)過多次后嘗試發(fā)現(xiàn)谅将,它會報出一個invalid錯誤,如下圖所示
并且這樣的操作把依賴?yán)搅斯こ棠夸浵轮芈`背了我們使用SPM減少cocoapods對項目工程的侵入這一初衷饥臂,所以不建議大家嘗試,如果讀者知道為何這個自定義的本地SPM路徑不能正常編譯歡迎評論或給我留言似踱。
- 密碼已成功配置隅熙,但Xcode自帶的SPM獲取不到鑒權(quán)信息
經(jīng)過正確的設(shè)置后,我們已經(jīng)可以直接用git clone
指令拉取SPM依賴核芽,而不需要輸入鑒權(quán)信息了囚戚。但在xcode中使用其自帶的包管理工具添加SPM依賴時,還是會提示輸入鑒權(quán)信息轧简,這是因為用xcode打開工程時驰坊,它默認(rèn)使用了Xcode自帶的Git來進(jìn)行操作,讀取的是它自己維護(hù)的鑒權(quán)信息哮独,而我們保存的憑據(jù)是保存在了系統(tǒng)的Git工具上拳芙,Xcode GUI無法讀取到,因為它是兩個不同的Git皮璧,使用兩套不同的鑒權(quán)信息舟扎。
成效初顯
從前面的五個大坑里爬出來后,終于在命令行下使用git clone
指令可以直接把Http的依賴庫拉取到本地悴务,而不需要再輸入用戶名和密碼了睹限。??????
完美交差
經(jīng)過一頓猛如虎的操作,終于在Jenkins的控臺上出現(xiàn)了拉取SPM依賴成功的Log??
步驟總結(jié)
- 檢查Mac啟用的鑒權(quán)協(xié)助工具
使用命令git config -l | grep credential.helper
查看讯檐,Mac是否使用了osxkeychain
羡疗,如果沒有請使用度娘將這里配置為osxkeychain
- 設(shè)置xcodebuild/Fastlane使用CI機(jī)器的Git
由于xcode自帶Git,默認(rèn)xcodebuild
命令使用的是xcode自帶的Git别洪,然而它并不會從系統(tǒng)的osxkeychain
中獲取鑒權(quán)信息顺囊。因此這里需要在xcodebuild
命令后加上-scmProvider system
,指定xcode使用CI機(jī)器的Git而不是xcode自帶的蕉拢。
如果CI使用Fastlane特碳,則需要在gym里加上use_system_scm: true
如:
gym(
toolchain: "xxx",
scheme: "#{SCHEME}",
export_method: "#{EXPORT_METHOD}",
configuration: option[:configuration],
output_directory: "#{OUTPUT_DIRECTORY}",
include_symbols: true,
include_bitcode: false,
xcargs: 'DEBUG_INFORMATION_FORMAT="dwarf-with-dsym"',
output_name: "#{IPA_NAME}",
export_xcargs: "-allowProvisioningUpdates",
use_system_scm: true
)
- 將Git憑據(jù)設(shè)置到CI機(jī)器
這里可以使用交互式命令git credential-osxkeychain store
將Git憑據(jù)保存到CI機(jī)器,如:
$git credential-osxkeychain store
host=xxx.xxx.xxx:xxx
protocol=http
username=xxxx
password=xxxx
$git credential-osxkeychain get
host=xxx.xxx.xxx:xxx
>password=xxxx
>username=xxxx
注意:這里store的時候password=xxxx
后面需要按兩次回車晕换,以確認(rèn)前面的輸入午乓。同理,get的時候host=xxx.xxx.xxx:xxx后面也是需要兩個回車闸准,當(dāng)看到命令行輸出了正確的password和username即為保存成功益愈。另外,如果這里Git倉庫路徑有端口號,請在host中輸入帶端口號蒸其、帶全域名的url敏释,不然會掉入前文所述的坑中,切記摸袁!
第一次操作credential-osxkeychain store
時钥顽,可能會彈出Git讀取Keychain的許可對話框,建議選擇永遠(yuǎn)允許靠汁,并輸入CI機(jī)器的管理員密碼蜂大,之后執(zhí)行所有Git操作時,需要讀取Keychain中保存的憑據(jù)便不會再彈出對話框
如果這里想用CI命令保存用戶名和密碼蝶怔,那么可以將下方信息保存到一個文件中奶浦,如Password
host=xxx.xxx.xxx:xxx
protocol=http
username=xxxx
password=xxxx
然后在對應(yīng)路徑執(zhí)行cat Password | git credential-osxkeychain store
即可
如果在使【Da】用【Gong】過程中發(fā)現(xiàn)除了上述坑點(diǎn)以外的大坑,或依照本指南無法完成CI和SPM的配置踢星,歡迎與我取得聯(lián)系澳叉,我將給予一定的幫助,并把遺漏坑點(diǎn)補(bǔ)充到這篇指南中沐悦。再次感謝各位大佬對我【Da Gong Ren】的支持耳高,期望本指南能為您節(jié)省寶貴的時間。
參考文獻(xiàn)
- https://developer.apple.com/documentation/swift_packages/building_swift_packages_or_apps_that_use_them_in_continuous_integration_workflows
- https://blog.miniasp.com/post/2018/05/28/Git-Credential-Howto
- https://git-scm.com/book/zh/v2/Git-%E5%B7%A5%E5%85%B7-%E5%87%AD%E8%AF%81%E5%AD%98%E5%82%A8
- https://uptech.team/blog/swift-package-manager
- https://docs.github.com/cn/github/using-git/caching-your-github-credentials-in-git