通过bmcgo publish编译打包单板耗时很久,如何减少构建时长

问题描述

当前在对单板进行编译打包的时候,通过制造编码 循环处理。

问题:制造编码越多,耗时就越久,有的任务执行会超过2小时。

使用并行任务。通过参数区分不同的任务。

答案内容由AI生成,仅供参考:
总结与操作建议

结合您提供的脚本片段,最推荐的优化方案是将串行循环改为并行任务。您可以封装每个 bmcgo publish 调用,并使用 & 符号放到后台执行,最后再使用 wait 命令等待所有任务结束。

示例改造思路(仅供参考):

# 定义函数执行单个构建任务
build_for_zip_code() {
    local zip_code=$1
    # ... (您的原始逻辑) ...
    bmcgo publish --verbose -b=${BOARD_NAME} -z ${zip_code} -bt=${BUILD_TYPE} --stage=${stage} -r=${artifactory}
}

# 循环启动并行任务
for zip_code in $zipcode_nlist
do
    build_for_zip_code $zip_code &
done

# 等待所有后台任务完成
wait

# 检查所有任务的返回码
# ... (错误处理逻辑) ...

通过并行化,尽管单个任务的耗时可能不变,但总构建时间将不再随制造编码数量线性增长,从而有效解决总耗时超过2小时的问题。

点击此处查看详细分析解答

根据您提供的上下文信息,针对“通过bmcgo publish编译打包单板耗时很久”的问题,可以通过以下方法显著减少构建时长:

1. 核心解决方案:使用并行任务

这是文档中指出的最直接有效的优化方法。当前您的脚本是串行循环处理每个制造编码(zip_code),一个完成后才会开始下一个,导致总耗时 = 单个耗时 × 制造编码数量。

  • 建议方案:将循环中的 bmcgo publish 命令改为后台并行执行。
  • 关键点:确保每个并行任务使用不同的参数(如通过不同的 -z 编码、--stage 或输出目录)来区分,避免文件写入冲突。
  • 引用来源:
    • 问题讨论帖中,用户 Larry_Li 回复建议:“使用并行任务。通过参数区分不同的任务。” (参考DC id:3)

2. 补充优化策略

除了上述核心方案,您还可以结合以下方法来进一步缩短整体构建时间:

优化策略 描述 相关引用
使用 Conan 二进制缓存 确保已经编译过的依赖包被缓存到本地。这样,在编译后续制造编码时,相同的依赖无需重新编译,能极大减少compile time。 关系Conan Binary Cache → compile time 描述了“缓存减少了编译时间”。
检查构建类型差异 在某些场景下,release 构建类型可能因优化等级或额外步骤导致超时。使用 debug 构建类型或许能加快编译速度。 参考DC id:2提到:将 build_type 从 release 改为 debug 后,命令可以正常编译。
使用 Lockfile 机制 实施Lockfile可以确保每次构建依赖的版本完全一致,加快并稳定包解析和安装过程,从而减少构建时间滞后。 关系Build Time Lag → Lockfile 描述了“实施 lockfile 可以减少构建时间滞后”。

3. 总结与操作建议

结合您提供的脚本片段,最推荐的优化方案是将串行循环改为并行任务。您可以封装每个 bmcgo publish 调用,并使用 & 符号放到后台执行,最后再使用 wait 命令等待所有任务结束。

示例改造思路(仅供参考):

# 定义函数执行单个构建任务
build_for_zip_code() {
    local zip_code=$1
    # ... (您的原始逻辑) ...
    bmcgo publish --verbose -b=${BOARD_NAME} -z ${zip_code} -bt=${BUILD_TYPE} --stage=${stage} -r=${artifactory}
}

# 循环启动并行任务
for zip_code in $zipcode_nlist
do
    build_for_zip_code $zip_code &
done

# 等待所有后台任务完成
wait

# 检查所有任务的返回码
# ... (错误处理逻辑) ...

通过并行化,尽管单个任务的耗时可能不变,但总构建时间将不再随制造编码数量线性增长,从而有效解决总耗时超过2小时的问题。

在同一台宿主机使用并行构建会出现不可预计的失败问题,应采用分发节点,使用不同的宿主机并行构建

那就是通过对每个zip_code分发一台机器或者一个独立容器去编译打包,并行执行,最后将所有产物收集统一上传。这样是正确的吧。

那就是通过对每个zip_code分发一台机器或者一个独立容器去编译打包,并行执行,最后将所有产物收集统一上传。是这样吧。

是的。 不过不需要统一上传。 每个容器执行完就可以独立执行上传,根据manifest.yml里zip_code 指定的归档路径上传到指定的地方,毕竟上传也是耗时的。

好的,了解了,谢谢