我只是在工作中使用 pip、Fabric 和 git 设置了类似的东西。流程基本上是这样的,并且大量借鉴了这个脚本:
- 在我们的源代码树中,我们维护了一个 requirements.txt 文件。我们将手动维护它。
- 当我们发布新版本时,Fabric 脚本会根据我们传递的任何树状结构创建一个存档。
- Fabric 将为我们正在部署的内容找到 SHA
git log -1 --format=format:%h TREEISH
。这给了我们SHA_OF_THE_RELEASE
- Fabric 将获得我们的需求文件的最后一个 SHA 文件
git log -1 --format=format:%h SHA_OF_THE_RELEASE requirements.txt
。这会吐出哈希的简短版本,例如1d02afc
此特定版本的该文件的 SHA。
- 然后,Fabric 脚本将查看我们的 virtualenvs 存储在远程主机上的目录。
- 如果没有名为 的目录
1d02afc
,则创建一个新的 virtualenv 并使用pip install -E /path/to/venv/1d02afc -r /path/to/requirements.txt
- 如果存在,则
path/to/venv/1d02afc
什么都不做
这其中最神奇的部分是传递你想要 git 的任何树状结构,并让它进行打包(来自 Fabric)。通过使用或其他任何方法git archive my-branch
,git archive 1d02afc
我可以保证在我的远程机器上安装正确的软件包。
我走这条路是因为如果软件包在发布之间没有改变,我真的不想让额外的美德四处飘荡。我也不喜欢在我自己的源代码树中拥有我所依赖的实际包的想法。