Xcode 與受管理部署流程

這篇網誌將分享如何透過 App Store 和政策來安裝 Xcode,我們也會為不具備管理者權限的使用者,分享如何配置這個 App,以及如何管理 Xcode 14 和 15 的平台 SDK。

August 8 2023 作者

Armin Briegel

Developer using Xcode on their managed Macbook

身為 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 新聞等,直接發送到你的收件匣。

若要進一步了解我們如何蒐集、使用、揭露、傳輸及儲存您的資訊,請前往我們的隱私權政策頁面。

標籤: