conan仓库迁移,部分组件上传失败问题分析
更新时间: 2026/05/28
在Gitcode上查看源码

问题背景

  • 单板类型:NA;
  • 软件版本:NA;
  • 涉及功能:升级包构建;
  • 触发条件:经在外网通过构建的方式将conan二进制缓存打包转移到内网,但上传到自建conan仓时出现问题。
  • 业务表现:预期conan二进制转移到内网自建的conan仓,转移成功;实际迁移出错。

问题复现步骤

需要将conan二进制转移到内网自建的conan仓 上传到自建conan仓的命令:

text
conan search "*" | tail -n +3  | xargs -P 12 -I {{}} conan upload {{}} -c --all -r cbmc_release

关键日志信息

出错打印:

定位过程

涉及的组件有:

text
Computing_Component_RAID/V100R001C00SPC512B020@openUBMC.release/stable
Cyrus_SASL/2.1.28-h1.computing.ibmc.r1@openUBMC.release/rc
Editline_Library_-_libedit/3.1-20230828-htrunk2@openUBMC.release/rc
Signature_Verify_CBB_Library/24.1.0.B006_001@openUBMC.release/rc
boost/1.82.0.B001@openUBMC.release/rc
curl/7.79.1-25.oe2203sp3-htrunk31@openUBMC.release/rc
hisec_tls/24.1.0.B039@openUBMC.release/rc
huawei_secure_c/1.0.2@openUBMC.release/rc
json/B003_00002@openUBMC.release/rc
kmc/24.0.0.B020_002@openUBMC.release/rc
libjpeg/9f@openUBMC.release/rc
libssh2/1.10.0-5.oe2203sp3-htrunk4-1@openUBMC.release/rc
lldpd/1.0.17-h1@openUBMC.release/stable
luajit/2.1.0.B012@openUBMC.release/rc
muparser/2.3.4@openUBMC.release/stable
net-snmp/5.9.1-6.oe2203sp3-htrunk4.B005@openUBMC.release/rc
nginx/1.27.1-htrunk3.1@openUBMC.release/stable
ntp/4.2.8p17-3.oe2403-htrunk3-1@openUBMC.release/rc
openldap/2.6.6-htrunk1@openUBMC.release/rc
openssh/8.8p1-23.oe2203sp3.r6@openUBMC.release/rc
secbox/24.0.10.B066_00001@openUBMC.release/rc
skynet/1.7.0.B016@openUBMC.release/rc
sqlite3/3.37.2-6.oe2203sp3-h2.B001@openUBMC.release/rc
vpp/V300R024C10SPC002B100_002@openUBMC.release/rc

这些组件都是openUBMC.release通道发布,实际上这些组件在本地缓存都有hw.ibmc.release,而hw.ibmc.release通道的组件推送没报错。

应该是组件的conanfile.py文件定义了源码,但是这些闭源组件包并没有源码快照,因此报错,目前通过注释 exports_sources 变量和source函数能推送大部分:

text
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Copyright © Huawei Technologies Co., Ltd. 2022-2025. All rights reserved.
import os

from conans import ConanFile, tools, CMake

class hi1880_conan(ConanFile):
    name = "Computing_Component_RAID"
    description = "Computing_Component_RAID"
    settings = "os", "arch", "compiler"
    _env_build = None
    generators = "cmake"
    #exports_sources = ["permissions.ini"]                注释变量exports_sources 
    _cmake = None

    @property
    def _source_subfolder(self):
        return "sorce_subfolder"

    #def source(self):                                                  注释函数 source
    #    git = tools.Git(verify_ssl=False, folder="hi1880_code")
    #    git.clone(**self.conan_data["sources"][self.version]["HI1880V100_DEVELOP"])

    def build(self):
        # 修改工作目录
        lib_path = "hi1880_code/src/host/tools/lib"
        os.chdir(lib_path)

        # 修改脚本 适配构建环境,并只编译64位
        self.run("sed -i 's/buildtools\///g' Makefile")
        self.run("sed -i '76c all : $(OBJS64LE)' Makefile")
        self.run("sed -i '77,79d' Makefile")
        self.run("make")

    def package(self):
        hs_h_dir = "hi1880_code/src/include/open_api"
        hs_lib_dir = "hi1880_code/src/host/tools/lib"

        self.copy("*", src=hs_h_dir, dst="include", symlinks=True)
        self.copy("tool_lib.h", src=hs_lib_dir, dst="include", symlinks=True)
        self.copy(
            "raidlib.so*", src=f"{hs_lib_dir}/bin/64le", dst="usr/lib64", symlinks=True
        )
        self.copy("permissions.ini", src="", dst="")

    def package_info(self):
        self.cpp_info.libdirs = ["usr/lib64"]

尽管做这样的修改,但是仍然有部分组件无法推送: 涉及的组件有:

text
luajit/2.1.0.B012@openUBMC.release/rc
nginx/1.27.1-htrunk3.1@openUBMC.release/stable
skynet/1.7.0.B016@openUBMC.release/rc

实际上nginx/1.27.1-htrunk3.1@openUBMC.release/stable和skynet/1.7.0.B016@openUBMC.release/rc是依赖luajit/2.1.0.B012@openUBMC.release/rc的。

问题原因

本地存在git 变更,编译组件的时候没有计算出正确的scm,是没法upload的。

解决方案

  • 规避措施

    执行以下命令规避openUBMC的conan仓下载不了package的问题:

    text
    echo $(pip3 show conan |  grep -oP 'Location:\s*\K.*')/conans/client/remote_manager.py | xargs sed -i 's/recipe_hash/recipeHash/g'
  • 下载组件包

    示例:

    text
    conan download xxx/xxx@openUBMC.release/rc -r openubmc_dev
    conan download xxx/xxx@openUBMC.release/stable -r openubmc_dev

    自行编写脚本下载需要的所有组件包。

  • 打包

    将~/.conan/data的组件打包,转移。

  • 上传组件包

    text
    conan upload "*"  -c  --all --no-overwrite --parallel  -r  xx