返回

从 Azure DevOps 下载 iOS Archive (ipa) 的两种方法

IOS

从 Azure DevOps 下载 iOS 应用 Archive

在 iOS 应用开发流程中,通常会使用 Azure DevOps 来进行自动化构建、测试和发布。 生成的应用 archive (.ipa 文件) 包含了应用的代码和资源,有时需要下载这个 archive 文件,例如,用于获取 dSYM 文件以便调试 crash report 或者进行进一步的分析。 本文探讨如何从 Azure DevOps 下载 iOS 应用 Archive。

场景分析

开发过程中的一项常见需求是从构建好的 iOS 应用 Archive 中提取 dSYM 文件。 dSYM 文件是调试符号文件,它包含了编译后的代码与原始代码的映射关系,可以帮助开发者定位崩溃发生的具体位置和原因。 因此,在应用发布后,需要保留 dSYM 文件,或者方便地从 Archive 中提取 dSYM 文件。 本文主要围绕这个常见的使用场景,介绍如何在 Azure DevOps 管道中配置下载 Archive 的能力,方便开发者获取需要的资源。

解决方案一:发布 Pipeline Artifacts

这是最直接也是推荐的方式。在构建完成后,可以将 .ipa 文件作为一个 pipeline artifact 发布。 这允许在 pipeline 执行完成后,从 Azure DevOps 界面下载 Archive 文件。

步骤:

  1. 确定 Archive 文件位置: 确定在构建过程中,.ipa 文件被保存到哪个目录。 这通常是在 Xcode 构建配置中定义的 ARCHIVE_PATHPRODUCT_NAME 等变量决定。
  2. 添加 PublishPipelineArtifact 任务: 在你的 Azure DevOps pipeline 定义文件(例如 azure-pipelines.yml)中,添加一个 PublishPipelineArtifact 任务,配置 artifact 的名称和要上传的文件或文件夹。

示例 azure-pipelines.yml 片段:

steps:
- task: Xcode@5
  inputs:
    actions: 'archive'
    scheme: 'YourSchemeName'
    sdk: 'iphoneos'
    configuration: 'Release'
    archivePath: '$(Build.ArtifactStagingDirectory)/YourApp.xcarchive'  # 将 Archive 存放到 staging 目录
    exportPath: '$(Build.ArtifactStagingDirectory)/YourApp'           # Export Path 也放到staging目录
    exportOptions: 'plist'
    exportOptionsPlist: 'YourExportOptions.plist'

- task: PublishPipelineArtifact@1
  inputs:
    targetPath: '$(Build.ArtifactStagingDirectory)'  # 将 staging 目录下的内容都发布为 Artifact
    artifact: 'iOSAppArchive'                    # Artifact 名称
    publishLocation: 'pipeline'                     # 发布到 pipeline 级别

代码解释:

  • Xcode@5: 用于执行 Xcode 构建操作, archivePath 指定了 archive 的存放位置。 确保配置正确,并替换为实际的项目配置。exportPath 配置 export 的ipa文件存放位置。
  • PublishPipelineArtifact@1: 将指定路径下的文件发布为 pipeline artifact。 targetPath 指向包含了 .ipa 文件所在的目录。 artifact 是 artifact 的名称,你可以自定义。 publishLocation 指定 artifact 发布的位置。 pipeline 表示发布到 pipeline 级别,方便下载。
  • $(Build.ArtifactStagingDirectory): Azure DevOps 预定义的变量,代表 artifact 临时存放的目录。 这是一个推荐的最佳实践,将需要发布的 artifact 先拷贝到 staging 目录,然后再发布。

操作步骤:

  1. 在 Azure DevOps 中编辑你的 pipeline 定义。
  2. 添加上述代码片段到你的 pipeline YAML 文件中。
  3. 运行 pipeline。
  4. 在 pipeline 运行完成后,在 pipeline 的运行结果页面中,你应该能够看到一个名为 iOSAppArchive 的 artifact。 点击它就可以下载包含 .ipa 文件的整个 staging 目录。

解决方案二:使用 Command Line 任务

如果需要更灵活地控制 artifact 的发布,可以使用 Command Line Script 任务。 这种方式允许你使用脚本来查找并发布 .ipa 文件。

步骤:

  1. 查找 Archive 文件: 使用脚本查找 .ipa 文件的完整路径。
  2. 发布 Archive 文件: 使用 az artifacts upload 命令发布 Archive 文件。

示例 azure-pipelines.yml 片段:

steps:
- task: CmdLine@2
  inputs:
    script: |
      IPA_PATH=$(find $(System.DefaultWorkingDirectory) -name "*.ipa" -print -quit)
      echo "##vso[task.setvariable variable=IPA_PATH]$IPA_PATH" # 设置变量 IPA_PATH
      echo "Found IPA at: $IPA_PATH"
      AZURE_DEVOPS_EXT_PAT=$(System.AccessToken) # 获取访问令牌
      az artifacts upload --organization $(System.TeamFoundationCollectionUri) --project $(System.TeamProject) --scope pipeline --name iOSAppArchive --path "$IPA_PATH"

  displayName: 'Publish IPA'
  env:
      AZURE_DEVOPS_EXT_PAT: $(System.AccessToken)  # 设置访问令牌

代码解释:

  • CmdLine@2: 用于执行命令行脚本。
  • script: 包含要执行的 shell 脚本。
    • IPA_PATH=$(find ...): 使用 find 命令查找 .ipa 文件的路径。 -quit 参数可以在找到第一个匹配的文件后停止搜索,可以提高效率。
    • echo "##vso[task.setvariable variable=IPA_PATH]$IPA_PATH": 将查找的路径设置为 pipeline 变量 IPA_PATH。 这使得在后续步骤中可以使用该变量。
    • az artifacts upload ...: 使用 Azure CLI 的 az artifacts upload 命令上传 artifact。 需要确保 Azure CLI 已经安装在 agent 上。 可以在 pipeline 中添加一个安装 Azure CLI 的任务。
    • --organization: Azure DevOps 组织的 URL。
    • --project: Azure DevOps 项目的名称。
    • --scope: 设置为 pipeline 表示发布到 pipeline 级别。
    • --name: artifact 的名称。
    • --path: 要上传的文件的路径。
  • displayName: 为该task自定义一个展示名称,在日志和界面展示时更友好
  • System.AccessToken: Azure DevOps 预定义的变量,表示当前 pipeline 的访问令牌。 需要确保你的 pipeline 具有访问 artifacts 的权限。

操作步骤:

  1. 在 Azure DevOps 中编辑你的 pipeline 定义。
  2. 添加上述代码片段到你的 pipeline YAML 文件中。
  3. 确保你的 agent 上安装了 Azure CLI,如果没有,需要添加一个任务来安装。 例如: pip install azure-cli
  4. 运行 pipeline。
  5. 在 pipeline 运行完成后,在 pipeline 的运行结果页面中,你应该能够看到一个名为 iOSAppArchive 的 artifact。 点击它就可以下载 .ipa 文件。

安全建议

  • 权限控制: 确保只有授权的用户才能访问和下载 artifacts。 审查 pipeline 的权限设置,防止未授权的访问。
  • 访问令牌: 妥善保管 Azure DevOps 的访问令牌。 避免将令牌泄露到公开的代码仓库或其他不安全的地方。 使用 Azure DevOps 提供的安全变量来存储敏感信息。

这两种方案提供了一种从 Azure DevOps 下载 iOS 应用 Archive 的方法。 选择哪一种方案取决于项目的具体需求和偏好。 PublishPipelineArtifact 任务通常更容易设置,而使用命令行任务则提供更大的灵活性。 重要的是理解每种方案的原理,以便根据项目需求进行选择。