从 Azure DevOps 下载 iOS Archive (ipa) 的两种方法
2025-02-04 05:58:35
从 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 文件。
步骤:
- 确定 Archive 文件位置: 确定在构建过程中,
.ipa
文件被保存到哪个目录。 这通常是在 Xcode 构建配置中定义的ARCHIVE_PATH
或PRODUCT_NAME
等变量决定。 - 添加
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 目录,然后再发布。
操作步骤:
- 在 Azure DevOps 中编辑你的 pipeline 定义。
- 添加上述代码片段到你的 pipeline YAML 文件中。
- 运行 pipeline。
- 在 pipeline 运行完成后,在 pipeline 的运行结果页面中,你应该能够看到一个名为
iOSAppArchive
的 artifact。 点击它就可以下载包含.ipa
文件的整个 staging 目录。
解决方案二:使用 Command Line 任务
如果需要更灵活地控制 artifact 的发布,可以使用 Command Line Script
任务。 这种方式允许你使用脚本来查找并发布 .ipa
文件。
步骤:
- 查找 Archive 文件: 使用脚本查找
.ipa
文件的完整路径。 - 发布 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 的权限。
操作步骤:
- 在 Azure DevOps 中编辑你的 pipeline 定义。
- 添加上述代码片段到你的 pipeline YAML 文件中。
- 确保你的 agent 上安装了 Azure CLI,如果没有,需要添加一个任务来安装。 例如:
pip install azure-cli
- 运行 pipeline。
- 在 pipeline 运行完成后,在 pipeline 的运行结果页面中,你应该能够看到一个名为
iOSAppArchive
的 artifact。 点击它就可以下载.ipa
文件。
安全建议
- 权限控制: 确保只有授权的用户才能访问和下载 artifacts。 审查 pipeline 的权限设置,防止未授权的访问。
- 访问令牌: 妥善保管 Azure DevOps 的访问令牌。 避免将令牌泄露到公开的代码仓库或其他不安全的地方。 使用 Azure DevOps 提供的安全变量来存储敏感信息。
这两种方案提供了一种从 Azure DevOps 下载 iOS 应用 Archive 的方法。 选择哪一种方案取决于项目的具体需求和偏好。 PublishPipelineArtifact
任务通常更容易设置,而使用命令行任务则提供更大的灵活性。 重要的是理解每种方案的原理,以便根据项目需求进行选择。