You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按需启动任意数量的TeamCity构建代理?

在TeamCity中实现可配置的APK并行构建任务拆分

核心实现思路

利用TeamCity的**矩阵构建(Matrix Build)**特性,结合参数解析逻辑,根据用户传入的配置自动生成并行的构建任务,每个任务分配到独立的代理执行。

具体步骤

1. 定义用户输入参数

在构建配置中添加一个自定义参数,用于接收用户的构建目标配置:

  • 参数名:build.TargetSpec
  • 支持两种输入格式:
    • 格式1:Apps:<app列表>; Flavors:<flavor列表>(示例:Apps:app1,app2; Flavors:test,prod)
    • 格式2:<app>:<flavor>或逗号分隔的多组(示例:app1:test、app1:test,app2:prod)

2. 添加参数解析预处理步骤

添加命令行构建步骤(Bash示例),解析用户输入的build.TargetSpec,生成矩阵构建所需的参数:

TARGET_SPEC="%build.TargetSpec%"

if echo "$TARGET_SPEC" | grep -q "Apps:"; then
    # 拆分Apps和Flavors参数
    APPS=$(echo "$TARGET_SPEC" | sed 's/.*Apps:\([^;]*\).*/\1/')
    FLAVORS=$(echo "$TARGET_SPEC" | sed 's/.*Flavors:\([^;]*\).*/\1/')
    # 传递给TeamCity全局参数
    echo "##teamcity[setParameter name='env.MATRIX_APPS' value='$APPS']"
    echo "##teamcity[setParameter name='env.MATRIX_FLAVORS' value='$FLAVORS']"
else
    # 直接将输入作为Target列表
    echo "##teamcity[setParameter name='env.MATRIX_TARGETS' value='$TARGET_SPEC']"
fi

3. 配置矩阵构建维度

在构建配置的矩阵构建设置中,添加三个可选维度,通过条件控制启用:

  • 维度1:App
    • 取值来源:%env.MATRIX_APPS%(逗号分隔值)
    • 启用条件:%env.MATRIX_APPS% 不为空
  • 维度2:Flavor
    • 取值来源:%env.MATRIX_FLAVORS%(逗号分隔值)
    • 启用条件:%env.MATRIX_FLAVORS% 不为空
  • 维度3:Target
    • 取值来源:%env.MATRIX_TARGETS%(逗号分隔值)
    • 启用条件:%env.MATRIX_TARGETS% 不为空

注:TeamCity会自动为维度的所有组合生成独立构建实例,每个实例分配到可用代理执行。

4. 编写适配矩阵参数的构建脚本

添加实际的APK构建步骤,根据当前矩阵实例的参数执行对应命令:

if [ -n "%matrix.App%" ]; then
    # 处理Apps+Flavors组合场景
    ./gradlew assemble%matrix.Flavor%Release -Papp=%matrix.App%
else
    # 处理单一Target场景,拆分app与flavor
    TARGET="%matrix.Target%"
    APP=$(echo "$TARGET" | cut -d: -f1)
    FLAVOR=$(echo "$TARGET" | cut -d: -f2)
    ./gradlew assemble${FLAVOR}Release -Papp=${APP}
fi

5. 优化配置

  • 代理定向:可为矩阵参数添加代理标签需求(如让app1任务仅跑在带app1-build标签的代理上),提升构建效率。
  • 失败策略:在矩阵构建设置中开启「快速失败」,一旦某个实例失败,立即终止其他未完成实例。
  • 工件收集:按矩阵参数命名工件路径(如app/%matrix.App%/%matrix.Flavor%/*.apk),方便区分不同任务生成的APK。

示例场景验证

  • 输入Apps:app1; Flavors:test,prod:生成2个并行实例(app1-test、app1-prod)
  • 输入app1:test:生成1个单一实例
  • 输入Apps:app1,app2; Flavors:test,prod:生成4个全组合并行实例

内容的提问来源于stack exchange,提问作者ildar ishalin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 02:33:42