在上一篇文章中,我們完成了 iOS 專案的本地端準備工作。現在,我們將實際設定 Azure Pipelines,目標是讓專案能夠自動化建置並部署到 App Store Connect。
為了讓 Azure Pipelines 這類 CI/CD 工具能以自動化的方式將 App 上傳至 App Store Connect,我們必須先產生一組專用的 API 金鑰。這組金鑰將授權 Azure Pipelines 執行上傳等操作。
登入後,點擊進入「使用者與存取權限」區塊。
選取「使用者與存取權限」,並要求存取權限。
有了 Apple 提供的憑證後,接下來我們回到 Azure DevOps,設定 Pipeline 與 App Store Connect 之間的橋樑。
點擊「Get it free」並依照畫面指示完成安裝。此擴充功能提供了在 Pipeline 中與 App Store Connect 互動所需的任務(Task)。
回到專案頁面,點擊左下角的「Project settings」(齒輪圖示),在側邊欄的 Pipeline 區塊中找到「Service connections」。
點擊「Create Service Connection」,並在清單中選取我們剛剛安裝的「Apple App Store」。
值得一提的是,我們取得的 .p8 是 PEM 格式,有著 -----BEGIN PRIVATE KEY----- 和 -----END PRIVATE KEY----- 這樣的標頭和結尾。中間的亂碼部分是金鑰的實際資料,經過 Base64 編碼。但是,在 Azure 的 App Store Service 的 Key 欄位下面標注 "Base64-encoded content of the App Store Connect API P8 private key file",這表示你必須將整份 .p8 文件內容再作一次 base64 encode,然後將結果貼上來才可以。
這裡我是使用以下命令來轉換:
base64 -i YOUR_P8_KEY_FILE.p8 -o base64Encode_key
完成後儲存,這樣就成功建立了一個安全的服務連線。
回到專案,點選左下角齒輪,側邊欄 Pipeline -> Service connections,點選 Create Service Connection,選取 Apple App Store。
在撰寫完整的建置與部署腳本之前,建立一個簡單的 Pipeline 來測試連線是否成功。
Pipeline 的執行流程是由 YAML 檔案定義的。在專案新增一個專門存放 pipeline yaml 檔的 repo,並新增一個 test-connection.yaml 的檔案:
pool:
vmImage: 'macOS-13'
steps:
- script: echo "Fake IPA file" > fake.ipa
displayName: '建立假 IPA 檔案'
- task: AppStoreRelease@1
displayName: '測試 App Store 連線'
inputs:
serviceEndpoint: 'App Store Connect API'
appIdentifier: 'com.example.app'
releaseTrack: 'TestFlight'
ipaPath: 'fake.ipa'
- script: echo "App Store 連線測試完成"
發生錯誤「No hosted parallelism has been purchased or granted」,去查了一下發現,現在 Azure 雖然免費帳號有每月 1800 分鐘的 pipeline 執行時間,但這個必須要填表單申請,詳解可以參考前人文章。
參考資料:iT 邦幫忙教學
經過漫長的等待,終於開通權限了!讓我們重新 run 一次 pipeline:
Log 中的 Creating authorization token for App Store Connect API
這一行顯示,Fastlane(Azure DevOps 在背景使用的工具)已經成功使用我們在 Service Connection 中設定的 API Key、Key ID 和 Issuer ID 來向蘋果的伺服器進行驗證並取得了授權 token,而因為我們的 appIdentifier 設定為不存在的 com.example.app,因此報錯 [!] Couldn't find app 'com.example.app' on the account of '' on App Store Connect
,表示在我們的帳號下,找不到 Bundle Identifier 為 com.example.app 的應用程式。
今天的執行結果達成了我們「測試連線」的目的,並證明了連線是通的。接著,我們就可以替 app 做最後的一些小修改,並且可以正式撰寫 pipeline,將 App 部署到 App Store Connect 上。