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

Yocto中do_fetch[nostamp]设置无效,无法重复下载固件文件

Yocto 每次构建自动重新下载GitLab CI/CD固件的解决方案

核心问题分析

Yocto的nostamp虽禁用了时间戳检查,但SRC_URI的缓存逻辑仍会依赖文件校验和或.done标记,甚至BitBake会在构建目录的状态文件中记录任务执行状态,导致删除.done也无法触发重新下载。

具体解决方法

方法1:重写do_fetch任务强制刷新

直接跳过BitBake的缓存检查逻辑,每次构建都执行下载命令:

do_fetch() {
    # 清理旧固件文件,避免残留404无效文件
    rm -f ${WORKDIR}/firmware.bin
    # 执行wget下载,指定输出路径覆盖旧文件
    wget -O ${WORKDIR}/firmware.bin "${SRC_URI}" || exit 1
    # 校验文件有效性,空文件则终止构建
    if [ ! -s ${WORKDIR}/firmware.bin ]; then
        echo "固件下载失败,文件为空"
        exit 1
    fi
    # 写入版本信息
    echo "${TAG}" > ${WORKDIR}/version.txt
}

# 禁用fetch任务的缓存机制
do_fetch[nostamp] = "1"
# 强制任务每次都执行,跳过状态检查
do_fetch[force] = "1"

方法2:给SRC_URI添加动态参数绕过缓存

在固件URL末尾添加随构建变化的动态参数(比如时间戳),让BitBake认为每次的下载地址都是新的,从而触发重新下载:

# 生成当前构建的时间戳参数
BUILD_TIMESTAMP = "${@strftime('%Y%m%d%H%M%S', time.gmtime())}"
# 把时间戳作为URL参数加入
SRC_URI = "https://你的GitLab工件地址/master/firmware.bin?ts=${BUILD_TIMESTAMP}"

# 保留nostamp设置避免时间戳缓存
do_fetch[nostamp] = "1"

这种方法无需重写整个fetch任务,适合不想大幅改动原有配方逻辑的场景。

方法3:禁用配方的缓存哈希检查

在配方中添加配置,让BitBake忽略动态参数的哈希计算,确保每次构建都重新执行fetch:

# 让BitBake不将BUILD_TIMESTAMP纳入缓存哈希计算
BB_HASHBASE_WHITELIST += "BUILD_TIMESTAMP"
# 强制fetch任务每次执行
do_fetch[force] = "1"

配合方法2的动态SRC_URI使用,能彻底绕过缓存机制。

额外注意事项

  • 如果GitLab工件URL需要认证,可在SRC_URI中直接携带认证信息(如https://用户名:令牌@gitlab.example.com/...),或在构建机器的.wgetrc中配置认证参数。
  • 确保wget命令使用-O指定输出文件,避免默认以URL中的文件名保存,引发缓存混淆。

内容的提问来源于stack exchange,提问作者Jeanot Zubler

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 13:05:36