在使用spinnaker发布代码时候,遇到的问题是这样的场景:使用git管理代码版本,每一次push之后,都会有一个tag,类似“ 551bc1ab”这样的一个标志,在cd自动化部署环境中,发布工程时候,会看到这种tag。
1.第一次提交代码时候,本地测试,ok;发布到线上,也是ok的;
2.修改代码之后,本地测试,ok;再次提交,发布到线上,访问某接口,报错,而且根本就没有执行进入到接口里面。最关键的是,修改的代码,仅仅只是增加了简单的print语句以及if判断等,不涉及其他的代码。而且本地测试,是ok的,线上就出问题了。
具体报错信息如下:
Blueprint' object has no attribute 'json_decoder'
两次提交的代码,除了修改的代码,其他没有任何区别,但就是一个可以,一个不行。最关键的是,修改的代码,不会造成什么影响。从自动构建这里入手,发现了问题所在。
code.devops.******.com
然后查看部署的日志,发现了不一样的地方,第一次线上正常时候,是使用的
Collecting flask~=0.11 (from -r requirements.txt (line 3))
Downloading http://pypi.devops.*******.com/packages/source/f/flask/Flask-0.12.2-py2.py3-none-any.whl?remote=http%3A%2F%2Fpypi.doubanio.com%2Fpackages%2F77%2F32%2Fe3597cb19ffffe724ad4bf0beca4153419918e7fa4ba6a34b04ee4da3371%2FFlask-0.12.2-py2.py3-none-any.whl
第二次上线时候,使用的
Collecting flask~=0.11 (from -r requirements.txt (line 3))
Downloading http://pypi.devops.*****.com/packages/source/f/flask/Flask-0.12.3-py2.py3-none-any.whl?remote=http%3A%2F%2Fpypi.doubanio.com%2Fpackages%2F24%2F3e%2F1b6aa496fa9bb119f6b22263ca5ca9e826aaa132431fd78f413c8bcc18e3%2FFlask-0.12.3-py2.py3-none-any.whl
可以看到这两者之间的差别了,第一次使用的是flask0.12.2,第二次使用的是flask0.12.3。
在代码里面,requirements.txt文件中,对flask版本的控制是
flask~=0.11
然后,将requirements.txt中修改为flask==0.12.2
,即可。
In the requirements.txt for a Python library I am using, one of the requirements is specified like:
mock-django~=0.6.10
What does ~= mean?
It means it will select the lastest version of the package, greater or equal to 0.6.10, but still in the 0.6.* version, so it won't download the 0.7.0 for example. It ensures you will get security fixes but keep backward-compatibility, if the package maintener respects the semantic versionning (which state that breaking changes should occurs only in major versions).
Or, as said by the PEP 440:
For a given release identifier V.N , the compatible release clause is approximately equivalent to the pair of comparison clauses:
>= V.N, == V.*
网友评论