pipenv:部署工作流程

pipenv: deployment workflow

我正在考虑从 pip 和 virtualenv 切换到 pipenv。但是在研究了文档之后,我仍然对 pipenv 的创建者如何构建部署工作流一无所知。

例如,在开发中我有一个 Pipfile 和一个 Pipfile.lock 来定义环境。使用我要部署的部署脚本

  1. git pull 通过 Github 到生产服务器
  2. pipenv install creates/refreshes部署用户家目录下的环境

但我需要在 specific 目录中有一个 venv,该目录已经在 systemd 或 supervisor 中配置。例如:command=/home/ubuntu/production/application_xy/env/bin/gunicorn module:app

pipenv 在某些位置创建环境,例如 /home/ultimo/.local/share/virtualenvs/application_xy-jvrv1OSi

使用 pipenv 部署应用程序的预期工作流程是什么?

你几乎没有选择。

  1. 你可以 运行 你的 gunicorn 通过 pipenv run:

    pipenv run gunicorn module:app

这会产生轻微的开销,但优点是还可以从 $PROJECT_DIR/.env(或其他 $PIPENV_DOTENV_LOCATION)加载环境。

  1. 您可以设置PIPENV_VENV_IN_PROJECT环境变量。这会将 pipenv 的 virtualenv 保留在 $PROJECT_DIR/.venv 而不是全局位置。

  2. 您可以使用现有的 virtualenv 和 运行 pipenv。 Pipenv 不会尝试创建自己的 virtualenv 如果它是 运行 来自一个。

  3. 你可以只使用奇怪的 pipenv 创建的 virtualenv 路径。

我刚刚切换到 pipenv 进行部署,我的工作流程大致如下(使用 ansible 进行管理)。对于名为 "project" 的虚构项目,假设工作 Pipfile.lock 已签入源代码管理:

  1. 克隆 git 存储库:

    git clone https://github.com/namespace/project.git /opt/project

  2. 进入那个目录

    cd /opt/project

  3. 查看目标引用(分支、标签...):

    git checkout $git_ref

  4. 在某处创建一个 virtualenv,目标 Python 版本(3.6、2.7 等):

    virtualenv -p"python$pyver" /usr/local/project/$git_ref

  5. 在该 virtualenv 的上下文中调用 pipenv,因此它不会安装自己的:

    VIRTUAL_ENV="/usr/local/project/$git_ref" pipenv --python="/usr/local/project/$git_ref/bin/python" install --deploy

    当 Pipfile.lock 与 Pipfile 不匹配时,--deploy 将抛出错误。

  6. 使用 virtualenv 的 pip 安装项目本身(仅当它不在 Pipfile 中时才需要):

    /usr/local/project/$git_ref/bin/pip install /opt/project

  7. 设置指向新安装目录的符号链接:

    ln -s /usr/local/project/$git_ref /usr/local/project/current

然后可以调用我的应用程序,例如使用 /usr/local/project/current/bin/project_exec --foo --bar,这是在 supervisor 中配置的,例如。

所有这些都是在将标签推送到远程时触发的。

由于早期版本的 virtualenvs 保持不变,只需将 current- 符号链接设置回早期版本即可完成回滚。 IE。如果标签 1.5 损坏,我想回到 1.4,我所要做的就是 ln -s /usr/local/project/1.4 /usr/local/project/current 并使用 supervisorctl.

重新启动应用程序

要在与项目相同的目录中创建虚拟环境,请设置以下环境变量doc

PIPENV_VENV_IN_PROJECT=true

这会将依赖项安装到项目内的 .venv 目录中。可从 PipEnv v2.8.7

我认为 pipenv 非常适合管理依赖项,但太慢、太麻烦,而且仍然有点不稳定,无法将其用于自动部署。

相反,我在目标机器上使用 virtualenv(或 virtualenvwrapper)和 pip。

  • 在我的 build/development 机器上 我使用 pipenv lock -r:[=14= 创建了一个 requirements.txt 兼容的文本文件]

      $ pipenv lock -r > deploy-requirements.txt
    
  • 在部署时,我在 virtualenv 中 运行:

      $ pip install -r deploy-requirements.txt
    

只需这样做:

mkdir .venv
pipenv install

解释:

pipenv 检查您的项目目录以查找名为 .venv 的子目录。如果找到它,那么 pipenv 会创建一个本地虚拟环境(因为它会自动设置 PIPENV_VENV_IN_PROJECT=true

所以现在如果你愿意,你可以激活虚拟环境:

source .venv/bin/activate

或者为 gunicorn 配置你 app.conf 像这样:

exec /path/to/.venv/bin/gunicorn myapp:app