生成、测试和部署Xcode应用

Azure DevOps Services | Azure DevOps Server 2020 | Azure DevOps Server 2019 | TFS 2018

了解如何使用 Azure Pipelines 生成和部署Xcode项目。

先决条件

创建管道

  1. 登录到Azure DevOps组织并转到项目。

  2. 转到“管道”,然后选择“新建管道”。

  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 文件提交到存储库。 对消息感到满意后,选择“ 保存”并再次运行

    如果要监视管道的操作,请选择生成作业。

    你刚刚创建并运行了我们为你自动创建的管道,因为你的代码似乎与Xcode模板匹配得很好。

    现在,存储库中有一个正在运行的 YAML 管道 (azure-pipelines.yml) ,可供你自定义!

  3. 准备好对管道进行更改时,请在“Pipelines”页中选择它,然后编辑azure-pipelines.yml该文件。

请参阅以下部分,了解自定义管道的一些更常见方法。

提示

若要更改本主题中所述的 YAML 文件,请在“Pipelines”页中选择管道,然后选择“编辑”以打开文件的azure-pipelines.yml编辑器。

生成环境

可以使用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。 相反,请在“变量”窗格上创建新的管道变量,以加密此值。 请参阅 机密变量

下面是一个示例,该示例使用名为环境变量值的GITHUB_ACCESS_TOKEN机密变量myGitHubAccessToken

- 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 Distribut 任务以将应用分发给一组测试人员或 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发布任务,以自动发布App Store中现有iOS TestFlight beta 应用或生产应用的更新。

查看将此任务与 Apple 双因素身份验证配合使用 的限制 ,因为 Apple 身份验证特定于区域且快速兰会话令牌会很快过期,必须重新创建和重新配置。

- 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