生成、测试和部署 Xcode 应用

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

本快速入门将介绍如何在 Azure Pipelines 中使用 YAML 管道生成和部署 Xcode 项目。

先决条件

  • Azure DevOps 组织和项目拥有管道创建和应用部署权限。
  • GitHub 存储库中存在 Xcode 9+ 项目和应用。 有关详细信息,请参阅为应用创建 Xcode 项目

创建管道

重要

在 GitHub 流程中,系统可能会提示你创建 GitHub 服务连接或重定向到 GitHub 以登录、安装或授权 Azure Pipelines。 按照屏幕上的说明完成该过程。 有关详细信息,请参阅访问 GitHub 存储库

  1. 在 Azure DevOps 项目中,如果此管道是项目中的第一个管道,选择“管道”、“新建管道”或“创建管道”>
  2. 选择 GitHub 作为源代码位置。
  3. 在“选择存储库”屏幕上,为 Xcode 项目选择存储库。
  4. 在“配置管道”屏幕上,选择“Xcode”

Azure Pipelines 基于 Xcode 模板提供初学者管道。 查看 azure-pipelines.yml 中的代码。

生成环境

Xcode 预安装在 Azure Pipelines 中 Microsoft 托管的 macOS 代理上,因此无需设置任何基础结构。 有关预安装的确切 Xcode 版本,请参阅 Microsoft 托管的代理软件

azure-pipelines.yml文件pool顶部的节点选择相应的代理池。

pool:
  vmImage: 'macOS-latest'

Xcode 生成任务

Xcode 任务在 macOS 上生成、测试或存档 Xcode 工作区,并且可以选择打包应用。 初学者管道的 azure-pipelines.yml 文件中的 Xcode 步骤使用其默认方案为模拟器生成 iOS 项目,但不会打包。 你可以更改值并添加参数以匹配项目配置。

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

保存并运行管道

azure-pipelines.yml 中查看代码后,选择“保存并运行”

显示新 YAML 管道中的“保存并运行”按钮的截图。

可以选择编辑“提交消息”并提供说明。 然后再次选择“保持并运行”azure-pipelines.yml 文件提交到存储库并启动生成。

“生成和运行”页显示生成详细信息和进度。 如果要查看管道的运行情况,请选择页面下方的“作业”

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

自定义管道

要更改管道,请在管道页面上选择“编辑”。 以下部分介绍了自定义 Xcode 管道的一些常见方法。

添加签名和预配任务

Xcode 应用必须经过签名和预配才能在设备上运行或发布到 App Store。 签名和预配过程必须访问你的 P12 签名证书以及一个或多个预配配置文件。 有关详细信息,请参阅为移动应用签名

在生成期间,要使证书和配置文件可用于 Xcode,请将安装 Apple 证书安装 Apple 预配配置文件任务添加到您的管道中。

使用 Carthage 环境变量

如果项目使用具有专用 Carthage 存储库的 Carthage,你可以通过使用一个名为 GITHUB_ACCESS_TOKEN 的、值为有权访问该存储库的令牌的环境变量,来设置身份验证。 Carthage 将自动检测并使用此环境变量。

不要将机密令牌直接添加到管道 YAML。 而是选择管道页面上的“变量”以打开“变量”窗格并为此令牌创建变量。 请务必启用锁定图标来加密变量的值。 有关详细信息,请参阅设置机密变量

以下管道代码使用一个名为 myGitHubAccessToken 的机密变量作为 GITHUB_ACCESS_TOKEN 环境变量的值。

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

在 Azure 托管的设备上进行测试

若要在 Visual Studio App Center 中测试 iOS 设备的托管实验室中的应用,请将 App Center 测试任务添加到管道。

此任务需要 App Center 免费试用版帐户,该帐户必须在 30 天后转换为付费帐户才能继续使用测试实验室。 在使用此任务之前注册 App Center 帐户

以下示例运行 App Center 测试套件。 该任务使用必须设置的服务连接

有关完整的任务语法和参考,请参阅 App Center 测试任务。 有关详细信息,请参阅使用 Azure DevOps 进行 UI 测试

- task: AppCenterTest@1
  inputs:
    appFile: path/myapp.ipa
    artifactsDirectory: '$(Build.ArtifactStagingDirectory)/AppCenterTest'
    frameworkOption: 'appium'
    appiumBuildDirectory: test/upload
    serverEndpoint: 'My App Center service connection'
    appSlug: username/appIdentifier
    devices: 'devicelist'

将工件与生成记录一起保留

要将 iOS App Store 包 (IPA) 文件与生成记录一起存储或要在后续管道中进行测试并部署,请将复制文件发布生成工件任务添加到管道中。 有关详细信息,请参阅发布和下载管道工件

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

部署到 App Center

要将应用分发给一组测试人员或 beta 版用户,或将应用升级到 Intune 或 Apple App Store,请添加 App Center 分发任务。 该任务需要使用仍处于免费试用阶段的免费 App Center 帐户。

以下示例将应用分发给用户。 有关完整的任务语法和参考,请参阅 App Center 分发。 有关详细信息,请参阅使用 App Center 部署 Azure DevOps 生成

- task: AppCenterDistribute@3
  inputs:
    serverEndpoint: 'AppCenter'
    appSlug: '$(APP_CENTER_SLUG)'
    appFile: '$(APP_FILE)' # Relative path from the repo root to the IPA file you want to publish
    symbolsOption: 'Apple'
    releaseNotesOption: 'input'
    releaseNotesInput: 'Here are the release notes for this version.'
    destinationType: 'groups'

安装 Apple App Store 扩展并部署到 Apple App Store

要自动化与 Apple App Store 的交互,请安装 Apple 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' 
    appIdentifier: com.yourorganization.testapplication.etc
    ipaPath: '$(build.artifactstagingdirectory)/**/*.ipa'
    shouldSkipWaitingForProcessing: true
    shouldSkipSubmission: true

要自动将以前提交的应用从 iTunes Connect 升级到 App Store,请添加 App Store 升级任务。

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