讓CI里的Swift Package Manager HTTP鑒權(quán)也能666的避坑指南

前述

本文是一次探【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依賴的問題埠对,如下圖所示

鑒權(quán)失敗

作出假設(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】

瘋狂踩坑

  1. 遠(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)行。

  1. 設(shè)置了憑據(jù)也驗證設(shè)置成功了粮彤,Git命令行依然需要輸入憑據(jù)

設(shè)置的憑據(jù)需要保證host路徑根穷、protocol協(xié)議與Git倉庫高度一致,打錯了即使能保存進(jìn)去也是用不了的导坟。

特別的屿良,如果Git倉庫路徑上帶端口,那么host需要寫全域名和端口號惫周,如

host=xxx.xxx.xxx:1234

  1. 鑰匙串訪問設(shè)置賬號密碼無效

直接在鑰匙串訪問上Git工具也是無法用來鑒權(quán)的尘惧,還是需要通過執(zhí)行git credential-osxkeychain store來保存

  1. 把SPM放到工程倉庫本地企圖更改SPM cache路徑

在Fastlane中可以使用cloned_source_packages_path參數(shù)將依賴放到工程中,然后再自定義SPM以來包路徑闯两,理論上可以實現(xiàn)使用工程文件夾下的SPM依賴包來進(jìn)行編譯褥伴,但實際上經(jīng)過多次后嘗試發(fā)現(xiàn)谅将,它會報出一個invalid錯誤,如下圖所示

SPM緩存失效

并且這樣的操作把依賴?yán)搅斯こ棠夸浵轮芈`背了我們使用SPM減少cocoapods對項目工程的侵入這一初衷饥臂,所以不建議大家嘗試,如果讀者知道為何這個自定義的本地SPM路徑不能正常編譯歡迎評論或給我留言似踱。

  1. 密碼已成功配置隅熙,但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??

Jenkins拉取SPM依賴成功

步驟總結(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)

  1. https://developer.apple.com/documentation/swift_packages/building_swift_packages_or_apps_that_use_them_in_continuous_integration_workflows
  2. https://blog.miniasp.com/post/2018/05/28/Git-Credential-Howto
  3. 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
  4. https://uptech.team/blog/swift-package-manager
  5. https://docs.github.com/cn/github/using-git/caching-your-github-credentials-in-git
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末所踊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子概荷,更是在濱河造成了極大的恐慌秕岛,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件误证,死亡現(xiàn)場離奇詭異继薛,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)愈捅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門遏考,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蓝谨,你說我怎么就攤上這事灌具。” “怎么了譬巫?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵咖楣,是天一觀的道長。 經(jīng)常有香客問我芦昔,道長诱贿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮珠十,結(jié)果婚禮上料扰,老公的妹妹穿的比我還像新娘。我一直安慰自己焙蹭,他們只是感情好晒杈,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著壳嚎,像睡著了一般桐智。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上烟馅,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天说庭,我揣著相機(jī)與錄音,去河邊找鬼郑趁。 笑死刊驴,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的寡润。 我是一名探鬼主播捆憎,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼梭纹!你這毒婦竟也來了躲惰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤变抽,失蹤者是張志新(化名)和其女友劉穎础拨,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绍载,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡诡宗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了击儡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片塔沃。...
    茶點(diǎn)故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖阳谍,靈堂內(nèi)的尸體忽然破棺而出蛀柴,到底是詐尸還是另有隱情,我是刑警寧澤矫夯,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布名扛,位于F島的核電站,受9級特大地震影響茧痒,放射性物質(zhì)發(fā)生泄漏肮韧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望弄企。 院中可真熱鬧超燃,春花似錦、人聲如沸拘领。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽约素。三九已至届良,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間圣猎,已是汗流浹背士葫。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留送悔,地道東北人慢显。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像欠啤,于是被迫代替她去往敵國和親荚藻。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容