[疑难杂症2023-001]代码没有任何改变,仅用CI打了一个新镜像,运行出错的可能原因分析

Posted inter_peng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[疑难杂症2023-001]代码没有任何改变,仅用CI打了一个新镜像,运行出错的可能原因分析相关的知识,希望对你有一定的参考价值。

本文由Markdown语法编辑器编辑完成。

1. 前言

近日在项目中,遇到一个比较奇怪的问题。就是代码基本没有做任何修改,只是在配置文件中增加了几行配置,结果用CI的服务器,打了一个新的tag, 然后再运行时,就会出现报错。

ImportError: cannot import name 'Celery' from 'celery'

而报错的地方,可以肯定与做的更改没有任何关系。
这时,就陷入了困境。到底是哪里发生了问题呢?

2. 解决思路:

2.1 重新打包

遇到这种问题, 一般首先想到的,是不是自动打包时发生了异常,导致打出来的安装包出问题了.
因此,一般都会再Retry一下.但是经过一段时间的等待,重新打出来的包,启动时还是会报相同的问题.

2.2 查看依赖库

因为代码几乎没有变,那经过CI时,最可能变化的,可能就是依赖的第三方包的版本了.
从网上查到了类似的问题:
https://stackoverflow.com/questions/74025035/importerror-cannot-import-name-celery-from-celery
而且报错几乎完全一致.
下面第一个回答就是关于这个问题的.
它是说,由于Celery依赖的包importlib-metadata的版本发生了变化.
如果在打镜像时,没有特别指明这个第三方包的版本时,CI会自动安装最新的版本.
因此,CI自动下载了 importlib-metadata==5.0.0的版本.
而由于我们使用的Celery是4.3.0的版本,它需要依赖importlib-metadata的版本是4.12.0, 才不会报错.

知道了原因后,再去CI的服务器上看一下打包记录.

我查看CI服务器上的打包记录,显示的是下载的importlib_metadata==6.0.0的版本.
因此导致了Celery出错.

修复方案:

知道了问题后,再修改就很简单了.
在requirements.txt中,指明这个包的版本为4.12.0即可.再重新打镜像,便解决了这个问题.

......
importlib_metadata==4.12.0

以上是关于[疑难杂症2023-001]代码没有任何改变,仅用CI打了一个新镜像,运行出错的可能原因分析的主要内容,如果未能解决你的问题,请参考以下文章

多态性 - 仅用两个句子定义 [关闭]

仅用5000行代码,在全志V853上AI渲染出一亿幅山水画

合并仅用变量引用的连续单元格

工作中遇到的疑难问题--"闪退"

工作中遇到的疑难问题--"闪退"

刑事案件的25大疑难问题