如何按需启动任意数量的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)
- 格式1:
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
相关产品推荐
相关产品推荐

