返回

如何应对 GitHub Actions 中构建名称的动态性?

Android

如何处理 GitHub Actions 中构建名称的动态性,将 artifact 上传到带有动态名称的构建中?

在 GitHub Actions 管道中,有时我们可能需要处理具有动态名称的构建。这通常会发生在构建名称是通过 Gradle 或 Maven 等构建工具动态生成的场景中。在这些情况下,我们需要找到一种方法来在 GitHub Actions 中处理这些动态名称,以便成功将构建工件上传到具有相同动态名称的 artifact 中。

了解问题

考虑以下示例,我们正在使用 Gradle 构建一个 Android 应用程序,构建名称是根据构建日期和时间动态生成的。生成的构建名称如下:

com.xyz.app-v22(1.7.0.6)-24-02-05 10.10.19-stagging-debug.apk

我们的目标是在 GitHub Actions 中将此构建上传到一个名为 stagging_artifact 的 artifact 中。但是,由于构建名称是动态的,我们无法在 path 参数中使用硬编码的名称。

解决方法

为了解决这个问题,我们可以使用以下步骤:

  1. 获取动态构建名称: 在构建步骤中,我们可以使用 echo 命令将动态构建名称存储在环境变量中。例如:
echo "##[set-env name=DYNAMIC_BUILD_NAME]$(ls app/build/outputs/apk/stagging/debug/*.apk | sed 's/.*\///g')"
  1. 使用环境变量:upload-artifact 操作中,我们可以使用环境变量来引用动态构建名称。例如:
path: app/build/outputs/apk/stagging/debug/${{ env.DYNAMIC_BUILD_NAME }}

更新后的 GitHub Actions 工作流

更新后的 GitHub Actions 工作流如下:

jobs:
  build:
    steps:
      - name: Get dynamic build name
        run: |
          DYNAMIC_BUILD_NAME=$(ls app/build/outputs/apk/stagging/debug/*.apk | sed 's/.*\///g')
          echo "##[set-env name=DYNAMIC_BUILD_NAME]$DYNAMIC_BUILD_NAME"
      - name: Upload APK
        uses: actions/[email protected]
        with:
          name: stagging_artifact
          path: app/build/outputs/apk/stagging/debug/${{ env.DYNAMIC_BUILD_NAME }}

常见问题解答

1. 为什么需要获取动态构建名称?

动态构建名称使得使用硬编码的构建名称来上传 artifact 变得困难。我们需要获取动态名称才能在 upload-artifact 操作中引用它。

2. 如何自定义环境变量的名称?

你可以根据需要自定义环境变量的名称。但是,确保在 upload-artifact 操作中使用相同的名称来引用它。

3. 是否可以在构建步骤中直接使用动态构建名称?

不,由于 upload-artifact 操作在不同的步骤中运行,因此在构建步骤中直接使用动态构建名称是不行的。我们需要将其存储在环境变量中,以便在 upload-artifact 步骤中访问它。

4. 是否可以在 upload-artifact 操作中使用通配符?

不,upload-artifact 操作不支持在 path 参数中使用通配符。

5. 如何处理具有多个动态构建名称的情况?

如果你有多个具有动态名称的构建,你可以使用多个 upload-artifact 操作来上传它们,每个操作都使用特定的构建名称环境变量。