身為 Mac 管理者,你與機構中使用 macOS 開發 Apple 平台專用 App 的開發者的關係,經常會碰上很多難題。他們知識淵博,而且對 macOS 充滿熱誠,但這也代表他們對 Mac 工具與配置設定有很高的要求,甚至為了要把東西弄最好,而請你別礙著他們。
macOS 上最重要的開發工具,就屬 Xcode,而 Mac 管理者在受監管環境部署 Xcode 時,時常遇到許多挑戰。
備註:筆者在書寫此篇網誌的當下,Xcode 14.3.1 為當時的最新版本,Xcode 15 則尚處於 beta 測試階段。Xcode 14 與 Xcode 15 的 Xcode 受管理部署作業出現了一些異動,但對後者的影響較大。由於 Xcode 15 仍在測試階段,因此在 9 月版本尚未發佈前,可能還會有其它變更。
安裝 Xcode
首當其衝的難題,就是如何在多台 Mac 上安裝 Xcode。Xcode 是個相當特殊的挑戰,原因在於它會佔據龐大的儲存空間,Xcode 14 最大可能佔 23 GB,Xcode 15 最大則佔 11.7 GB (稍後我們會探討為何 Xcode 15 佔的容量小上許多)。
Mac 上的 App Store
Apple 將 Xcode 上架至 Mac 的 App Store,這對 Mac 管理者來說,代表他們能透過「App 和書籍」(原「大量採購」或 VPP) 來部署 Xcode。你可以透過「Apple 商務管理」或「Apple 校務管理」,來獲取指定數量的 Xcode 免費許可,再藉由裝置管理軟體的部署功能,將 App 推送至裝置上。以此方式部署 App 會有幾個缺點,而 Xcode 不尋常的本質與所佔容量,更是加劇了這些缺點。
當前的 (macOS Venture 及先前版本) MDM 協定在伺服器發送安裝 App 的指令後,用戶端並不會回應伺服器端,因此本機使用者無法看到安裝的進度,甚至完全無法察覺背景正在下載和安裝一個龐大的程式。假設出於某些原因而導致安裝失敗,不論是使用者還是 MDM 伺服器,都不會接收到通知,而造成下載和安裝失敗的原因又有百百種。
當使用者在下載或安裝期間,不小心闔上筆電、讓筆電進入睡眠狀態,或將裝置帶離網路覆蓋範圍時,就會使安裝失敗。雖然不管安裝什麼東西,都不一定一安裝就成功,但礙於 Xcode 的所佔容量,發生失敗的機率比較高,因此安裝失敗時不會接收到通知只會加劇這個問題。
透過 App Store 進行安裝的一項優勢,是不需要向外連接網際網路,就能享有 Mac 的「內容快取」功能,加快下載的速度。
Apple 宣佈將變更 iOS 17 和 macOS Sonoma 的 MDM 通訊協定,這項變動將大幅改善從 Mac 的 App Store 購入 App 的受管部署流程,若 MDM 開發商要採用並導入這項新功能,或讓使用者、開發者及機構採用新版 Xcode 與作業系統,都還需要一段時間。要可以享有這項新功能,還需要再等一陣子。
安裝政策
總體來說,要安裝來自 Mac App Store 的 App,讓使用者自行透過 Self Service 自助服務區來下載,才是更可靠的方式。很大一部分的原因在於,使用者看得到正在安裝的程式以及安裝進度。但是透過政策安裝,比透過「App 和書籍」大量安裝 App 來得可靠 (針對 Ventura 與較早版本而言)。
使用「App 和書籍」安裝的另一項特點在於,部署的 App 永遠都是非 beta 測試版的最新版本。只要安裝完成,且在 Xcode 未啟用時,Xcode 理應就會自動下載和套用更新。如果是 beta 測試版或者較舊版本,你將無法管理部署,而這對不同的機構來說,可能是利,也可能是弊。
重新打包 Xcode
如果想透過政策來安裝 Xcode,你必須提供含有 Xcode 的安裝套件或 pkg 檔案。
Apple 將 Xcode 的下載內容發佈於他們的開發者平台,該頁面陳列了諸如 beta 測試版與舊版的 Xcode (以及更多其它內容)。 你需要一組 Apple 開發者帳號來造訪該頁面,但免費等級的帳號就已非常足夠 (我自己也非常喜歡這個網頁,這讓我可以一覽所有 Xcode 版本)
Xcode 會以 xip 的歸檔形式存在,只要在 Finder 裡對檔案點兩下,馬上能將該檔案展開。展開會需要花費一些時間,因為這個檔案裡畢竟存放了超過 10 萬個文件,而在展開前,也會需要確認簽署的正當性以及檔案是否完整。
解開 Xcode 檔案後,你就能進行重新打包。你不需要什麼高級的打包軟體,你需要的只是 productbuild 指令:
% productbuild --component /path/to/Xcode.app /Applications Xcode-14.3.1.pkg
--component 旗標後,第一段標明 Xcode 安裝包的路徑,第二段則是目標系統的位置,最後一部分則是建立這個 pkg 檔要使用的名稱,我十分建議要在檔名上列出版本號。Xcode 不一定要安裝到 /Applications,也不需要啟用或設置這個重新打包的指令。
這可能會花上不少時間。
備註 1:如果你很在意下載時間和檔案大小,建議可以加上「--componentcompression auto」來節省最多 25% 的時間。這個方法會讓你花更多時間去壓縮檔案 (解壓到目標用戶端的時間也會增加),但是好處就是檔案不會這麼大。更多細節可以查看這篇文章。
備註 2:如果你需要在同個系統內安裝多個版本的 Xcode (如 beta 測試版與當前版本),那麼請將安裝包的「relocatable」旗標換掉。更多操作說明可以查看這篇文章,不過最簡單的方法仍然是使用我的 quickpkg 工具。
首次啟用設定 (適用不具備管理者權限的使用者)
部署完 Xcode App,不代表 Mac 管理者的任務已經結束,我們還需要把 Xcode 配置為使用者可用的狀態。第一次在新系統啟用 Xcode 時,系統會彈出視窗,顯示需要管理者權限來安裝額外的組件。
如果使用者具備管理者權限,那麼這就不會是個問題,他們可以直接自行授權安裝。只不過,一些部署流程的使用者只具備標準權限,因此無法授權這個步驟。
對於「標準權限使用者是個『過時產物』,早已無法適應許多部署作業」的說法,眾說紛紜,主要是因為標準使用者從這個架構和 macOS 內建的安全性框架獲得的優勢十分有限 (請見 Graham Gilbert 的文章和簡報)。
部分的部署作業,比如學校或各類教育機構,並沒有選擇的餘地。一些 Mac 管理者雖然願意嘗試不一樣的做法,但是在為機構抉擇管理與資安事項時,必須謹慎選擇。不論原因為何,多數的我們只能湊合使用標準權限使用者。
說了這麼多,將背景中運行的某些配置自動化,整體來說一定可以提升體驗,所以即便使用者都具備管理者權限,你可能還是會想執行這個動作。
下方為第一次啟動 Xcode 時,需要管理者授權的步驟:
- 在安裝多個版本的 Xcode 時,選取新的版本
- 接受 Xcode 和 Apple 的軟體開發工具包 (SDK) 協議
- 安裝額外的組件
- 為非管理者的使用者,啟用開發工具的資安機制
以上皆有專門的指令列工具可使用,因此只需要腳本就可以將這些步驟自動化。這些指令需以 Root 身分執行,例如從 Jamf Pro 以安裝後腳本政策執行。
首先,我們需要確認指令列工具使用的 Xcode 為我們方才安裝的最新版本,且包含了 xcode-select 指令;接著我們透過 xcodebuild 來接受許可,並執行「首次啟用」工作流程。以上步驟皆需要有管理者權限才能執行。
下個步驟我們將 everyone 群組加至 _developer group。稍等準備就緒後,下一行我們將啟用 DevToolSecurity。這個步驟可讓 _developer group 的管理者或成員不用以密碼授權,就能執行特定除錯工具或性能分析。
將 everyone 加至 _developer group 代表我們預先將所有使用者加至系統,到這個批准權限的群組裡,這也包含在執行腳本後所建立的使用者。如果你不希望這麼寬鬆,你可以將 dseditgroup 改為只新增當下已經登入的使用者。
DevToolsSecurity 啟用的流程,大致上只與指令列工具和腳本的除錯與性能工作流程相關,若你對資安較為敏感,可以請開發人員測試能不能在不觸發的情況下,依然正常執行他們的工作流程。
管理 Xcode 14 和 15 的平台 SDK
還有一個東西是你可能會想預先進行安裝的。過去幾年間,Apple 已大幅縮減 Xcode 下載內容的所佔容量:
- Xcode 11: 7.5 GB
- Xcode 12: 11 GB
- Xcode 13: 10 GB
- Xcode 14: 7 GB*
- Xcode 15: 3.1 GB**
*不含 watchOS 和 tvOS SDK
**不含 iOS、watchOS、tvOS 及 visionOS SDK
省去的佔用容量,大多是因為 Xcode 不再包含所有平台的 SDK。(Xcode 14 可支援 macOS 與 iOS;Xcode 15 僅為 macOS 提供支援)。在各平台開發和模擬 App 時,都少不了平台 SDK,第一次在想要下載和安裝的平台啟用時,都會觸發使用者。
這不代表避開了大型下載檔,它們只是被延後了。Xcode 15 和 Apple 的所有平台 (iOS、watchOS 及 tvOS) 加總起來一共超過 17GB,若加上 visionOS,又會多增加 7GB。因此新版 Xcode 的所佔容量反而和以往的差別不大,但至少 Xcode 安裝速度變得更快了,代表可以增加從 Mac 的 App Store 或透過「App 和書籍」安裝的可靠度。
好消息是,受監管部署作業不再需要 Xcode 使用者具備管理者權限,即可下載和安裝額外的 SDK。他們可以在初次跳出提示視窗時,直接選擇要下載的內容,或者可以之後再從 Xcode 設定中的「平台」選項取得其它平台。
如果你仍想讓使用者的生活更輕鬆一些,比如當你在教室部署 Xcode 時,你不想將大家的時間浪費在安裝程式,或者,你為了實現不需要使用者操作的完全自動化軟體組建流程,而需要在 Mac 上部署 Xcode。在這種情況下,你就會希望能自動部署必要的平台 SDK。
令人感到驚喜巧合的地方是,Apple 發佈的一些說明文章,也同樣建議管理者使用 xcodebuild 指令。
xcodebuild 中有三個選項與此相關:-downloadAllPlatforms 將下載所有可用的平台。這固然很方便,但是 Xcode 20 所有平台加總起來超過 15 GB,因此 -downloadAllBeforeSelectedPlatforms 在 Xcode 更新後,應該比較實用。
最後,還有 -downloadPlatform,這個指令會下載指定的平台。說明文章中未提及各平台的名稱,但也不難猜測:iOS、watchOS、tvOS 和 xrOS (至於 visionOS SDK,因為仍在 beta 測試階段,所以可能還是會有變動?)
如果你在已經安裝平台時再次執行指令,則指令不會去下載重複的平台,因此我們可以將全部需要的平台添加到配置腳本的結尾處:
Xcode 14 已含 iOS SDK,而 xcodebuild 會偵測到現有的 SDK,因此不會重複下載。我的測試中顯示,這次的下載動作運用了本地快取伺服器,下載速度因而大幅提升。
我在驗證 Xcode 15 的安裝時,彈出了一個會讓使用者看到的進度條。當使用者在沒有進行啟動的情況下看到進度條,可能會讓他們感到不安,但如果這是初步部署工作流程的一部分,則應該不會構成什麼問題。
總結
你可以在 GitHub 上找到含有可在政策中使用的所有步驟的腳本。
對於我們廣大的用戶來說,Xcode 是一款相當重要的 App,而安裝這款 App,也帶來不少罕見的挑戰。此篇網誌分享的工具和腳本,應該能幫助你為你和你的使用者提供更出色的體驗。
這裡分享的方法,在我測試時反映出的效果很好,但對於某些環境來說這可能不是唯一,甚至不是最好的辦法。
訂閱 Jamf 部落格
將市場走向資訊、Apple 最新消息、Jamf 新聞等,直接發送到你的收件匣。
若要進一步了解我們如何蒐集、使用、揭露、傳輸及儲存您的資訊,請前往我們的隱私權政策頁面。