建立、測試及部署 Xcode 應用程式

Azure Pipelines |Azure DevOps Server 2020 |Azure DevOps Server 2019 |TFS 2018 |TFS 2017

瞭解如何使用 Azure Pipelines 來建立和部署 Xcode 專案。

必要條件

建立管線

  1. 登入您的 Azure DevOps 組織,並移至您的專案。

  2. 移至Pipelines,然後選取 [新增管線]。

  3. 先選取GitHub作為原始程式碼的位置,以執行嚮導的步驟。

  4. 系統可能會將您重新導向至 GitHub 以進行登入。 若是如此,請輸入您的 GitHub 認證。

  5. 當您看到存放庫清單時,請選取您的存放庫。

  6. 您可能會被重新導向至 GitHub,以安裝 Azure Pipelines 應用程式。 如果是,請選取 [ 核准 安裝]。

出現 [ 設定 ] 索引標籤時,請選取 [ Xcode]。

  1. 當您的新管線出現時,請查看 YAML 查看其功能。 當您準備好時,請選取 [ 儲存並執行]。

    Save and run button in a new YAML pipeline

  2. 系統會提示您將新的 >azure-pipelines.yml yml 檔案認可至您的存放庫。 當您感到滿意訊息之後,請選取 [儲存後再 執行 一次]。

    如果您想要監看管線的作用,請選取組建作業。

    您剛剛建立並執行了自動為您建立的管線,因為您的程式碼似乎與 Xcode 範本相符。

    您現在已有可 azure-pipelines.yml 供您自訂的 () 儲存機制中的工作 YAML 管線!

  3. 當您準備好要對管線進行變更時,請在 [ Pipelines ] 頁面中選取該檔案,然後編輯該檔案

請參閱下列各節,以瞭解自訂管線的一些較常見的方式。

提示

若要變更 YAML 檔案(如本主題所述),請在Pipelines ] 頁面中選取管線,然後選取 [編輯] 以開啟檔案的編輯器

組建環境

您可以使用 Azure Pipelines 以 Xcode 建立您的應用程式,而不需要設定您自己的任何基礎結構。 Xcode 已預先安裝在 Azure Pipelines 的 Microsoft 裝載的macOS 代理程式上。 您可以使用 macOS 代理程式來執行組建。

如需預先安裝的確切 Xcode 版本,請參閱 Microsoft 裝載的 代理程式。

在存放庫的根目錄中建立名為 >azure-pipelines.yml 的檔案。 然後,將下列程式碼片段新增至您的檔案, azure-pipelines.yml 以選取適當的代理程式組件區:

# https://docs.microsoft.com/azure/devops/pipelines/ecosystems/xcode
pool:
  vmImage: 'macOS-latest'

使用 Xcode 建立應用程式

若要使用 Xcode 建立應用程式,請將下列程式碼片段新增至您的檔案 azure-pipelines.yml 。 這是用來建立 iOS 專案的最小程式碼片段,其使用其預設配置、模擬器和不封裝。 變更值以符合您的專案設定。 如需這些選項的詳細資訊,請參閱 Xcode 工作。

pool:
  vmImage: 'macos-latest'

steps:
- task: Xcode@5
  inputs:
    actions: 'build'
    scheme: ''
    sdk: 'iphoneos'
    configuration: 'Release'
    xcWorkspacePath: '**/*.xcodeproj/project.xcworkspace'
    xcodeVersion: 'default' # Options: 8, 9, 10, 11, 12, default, specifyPath

簽署與布建

Xcode 應用程式必須經過簽署和布建,才能在裝置上執行,或發佈至 App Store。 簽署和布建程式需要存取您的 P12 簽署憑證,以及一或多個布建設定檔。 安裝 Apple 憑證安裝 Apple 布建設定檔工作,可讓您在組建期間 Xcode 這些資源。

若要深入瞭解,請參閱 簽署您的行動應用程式

Carthage

如果您的專案使用 Carthage 搭配私用 Carthage 儲存機制,您可以設定驗證,方法是使用 GITHUB_ACCESS_TOKEN 可存取存放庫的權杖值來設定名為的環境變數。 Carthage 會自動偵測並使用這個環境變數。

請勿將秘密權杖直接新增至您的管線 YAML。 相反地,請建立新的管線變數,並在 [變數] 窗格上啟用其鎖定,以加密此值。 請參閱 秘密變數

以下範例會使用名為的密碼變數 myGitHubAccessToken 作為 GITHUB_ACCESS_TOKEN 環境變數的值。

- script: carthage update --platform iOS
  env:
    GITHUB_ACCESS_TOKEN: $(myGitHubAccessToken)

在 Azure 託管的裝置上進行測試

新增 App Center 測試 工作,以在 IOS 和 Android 裝置的託管實驗室中測試應用程式。 需要 App Center 免費試用版,之後必須將其轉換為付費。

註冊 App Center

# App Center test
# Test app packages with Visual Studio App Center
- task: AppCenterTest@1
  inputs:
    appFile: 
    #artifactsDirectory: '$(Build.ArtifactStagingDirectory)/AppCenterTest' 
    #prepareTests: true # Optional
    #frameworkOption: 'appium' # Required when prepareTests == True# Options: appium, espresso, calabash, uitest, xcuitest
    #appiumBuildDirectory: # Required when prepareTests == True && Framework == Appium
    #espressoBuildDirectory: # Optional
    #espressoTestApkFile: # Optional
    #calabashProjectDirectory: # Required when prepareTests == True && Framework == Calabash
    #calabashConfigFile: # Optional
    #calabashProfile: # Optional
    #calabashSkipConfigCheck: # Optional
    #uiTestBuildDirectory: # Required when prepareTests == True && Framework == Uitest
    #uitestStorePath: # Optional
    #uiTestStorePassword: # Optional
    #uitestKeyAlias: # Optional
    #uiTestKeyPassword: # Optional
    #uiTestToolsDirectory: # Optional
    #signInfo: # Optional
    #xcUITestBuildDirectory: # Optional
    #xcUITestIpaFile: # Optional
    #prepareOptions: # Optional
    #runTests: true # Optional
    #credentialsOption: 'serviceEndpoint' # Required when runTests == True# Options: serviceEndpoint, inputs
    #serverEndpoint: # Required when runTests == True && CredsType == ServiceEndpoint
    #username: # Required when runTests == True && CredsType == Inputs
    #password: # Required when runTests == True && CredsType == Inputs
    #appSlug: # Required when runTests == True
    #devices: # Required when runTests == True
    #series: 'master' # Optional
    #dsymDirectory: # Optional
    #localeOption: 'en_US' # Required when runTests == True# Options: da_DK, nl_NL, en_GB, en_US, fr_FR, de_DE, ja_JP, ru_RU, es_MX, es_ES, user
    #userDefinedLocale: # Optional
    #loginOptions: # Optional
    #runOptions: # Optional
    #skipWaitingForResults: # Optional
    #cliFile: # Optional
    #showDebugOutput: # Optional

使用組建記錄保留構件

新增 [複製檔案] 和 [發行組建 Artifacts工作],以使用組建記錄來儲存您的 IPA,或進行測試並部署至後續的管線。 請參閱Artifacts

- task: CopyFiles@2
  inputs:
    contents: '**/*.ipa'
    targetFolder: '$(build.artifactStagingDirectory)'
- task: PublishBuildArtifacts@1
  inputs:
    PathtoPublish: '$(Build.ArtifactStagingDirectory)'
    ArtifactName: 'drop'
    publishLocation: 'Container'

部署

App Center

新增 App Center 散發 工作,以將應用程式散發給一群測試人員或搶鮮版(Beta)使用者,或將應用程式升級至 Intune 或 Apple App Store。 需要免費的 App Center 帳戶 () 不需要支付任何費用。

# App Center distribute
# Distribute app builds to testers and users via Visual Studio App Center
- task: AppCenterDistribute@1
  inputs:
    serverEndpoint: 
    appSlug: 
    appFile: 
    #symbolsOption: 'Apple' # Optional. Options: apple
    #symbolsPath: # Optional
    #symbolsPdbFiles: '**/*.pdb' # Optional
    #symbolsDsymFiles: # Optional
    #symbolsMappingTxtFile: # Optional
    #symbolsIncludeParentDirectory: # Optional
    #releaseNotesOption: 'input' # Options: input, file
    #releaseNotesInput: # Required when releaseNotesOption == Input
    #releaseNotesFile: # Required when releaseNotesOption == File
    #isMandatory: false # Optional
    #distributionGroupId: # Optional

Apple App Store

安裝 Apple App Store 擴充 功能,並使用下列工作自動與 App Store 互動。 根據預設,這些工作會使用您設定的 服務連接 來向 Apple 進行驗證。

版本

新增App Store釋出工作,將現有 iOS TestFlight Beta 版應用程式的更新或 App Store 中的生產應用程式的更新自動化。

請參閱將此工作與 Apple 雙因素驗證搭配使用的 限制 ,因為 apple 驗證是區域專屬的,而且 fastlane 的會話權杖很快就會過期,必須重新建立並重新設定。

- task: AppStoreRelease@1
  displayName: 'Publish to the App Store TestFlight track'
  inputs:
    serviceEndpoint: 'My Apple App Store service connection' # This service connection must be added by you
    appIdentifier: com.yourorganization.testapplication.etc
    ipaPath: '$(build.artifactstagingdirectory)/**/*.ipa'
    shouldSkipWaitingForProcessing: true
    shouldSkipSubmission: true

升階

新增App Store 升階工作,以自動將先前提交的應用程式從 iTunes 連線升級至 App Store。

- task: AppStorePromote@1
  displayName: 'Submit to the App Store for review'
  inputs:
    serviceEndpoint: 'My Apple App Store service connection' # This service connection must be added by you
    appIdentifier: com.yourorganization.testapplication.etc
    shouldAutoRelease: false