pipenv:部署工作流程
pipenv: deployment workflow
我正在考虑从 pip 和 virtualenv 切换到 pipenv。但是在研究了文档之后,我仍然对 pipenv 的创建者如何构建部署工作流一无所知。
例如,在开发中我有一个 Pipfile
和一个 Pipfile.lock
来定义环境。使用我要部署的部署脚本
git pull
通过 Github 到生产服务器
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
部署应用程序的预期工作流程是什么?
你几乎没有选择。
你可以 运行 你的 gunicorn 通过 pipenv run
:
pipenv run gunicorn module:app
这会产生轻微的开销,但优点是还可以从 $PROJECT_DIR/.env
(或其他 $PIPENV_DOTENV_LOCATION
)加载环境。
您可以设置PIPENV_VENV_IN_PROJECT
环境变量。这会将 pipenv 的 virtualenv 保留在 $PROJECT_DIR/.venv
而不是全局位置。
您可以使用现有的 virtualenv 和 运行 pipenv。 Pipenv 不会尝试创建自己的 virtualenv 如果它是 运行 来自一个。
你可以只使用奇怪的 pipenv 创建的 virtualenv 路径。
我刚刚切换到 pipenv
进行部署,我的工作流程大致如下(使用 ansible 进行管理)。对于名为 "project" 的虚构项目,假设工作 Pipfile.lock 已签入源代码管理:
克隆 git 存储库:
git clone https://github.com/namespace/project.git /opt/project
进入那个目录
cd /opt/project
查看目标引用(分支、标签...):
git checkout $git_ref
在某处创建一个 virtualenv,目标 Python 版本(3.6、2.7 等):
virtualenv -p"python$pyver" /usr/local/project/$git_ref
在该 virtualenv 的上下文中调用 pipenv,因此它不会安装自己的:
VIRTUAL_ENV="/usr/local/project/$git_ref" pipenv --python="/usr/local/project/$git_ref/bin/python" install --deploy
当 Pipfile.lock 与 Pipfile 不匹配时,--deploy
将抛出错误。
使用 virtualenv 的 pip
安装项目本身(仅当它不在 Pipfile 中时才需要):
/usr/local/project/$git_ref/bin/pip install /opt/project
设置指向新安装目录的符号链接:
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
我正在考虑从 pip 和 virtualenv 切换到 pipenv。但是在研究了文档之后,我仍然对 pipenv 的创建者如何构建部署工作流一无所知。
例如,在开发中我有一个 Pipfile
和一个 Pipfile.lock
来定义环境。使用我要部署的部署脚本
git pull
通过 Github 到生产服务器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
部署应用程序的预期工作流程是什么?
你几乎没有选择。
你可以 运行 你的 gunicorn 通过
pipenv run
:pipenv run gunicorn module:app
这会产生轻微的开销,但优点是还可以从 $PROJECT_DIR/.env
(或其他 $PIPENV_DOTENV_LOCATION
)加载环境。
您可以设置
PIPENV_VENV_IN_PROJECT
环境变量。这会将 pipenv 的 virtualenv 保留在$PROJECT_DIR/.venv
而不是全局位置。您可以使用现有的 virtualenv 和 运行 pipenv。 Pipenv 不会尝试创建自己的 virtualenv 如果它是 运行 来自一个。
你可以只使用奇怪的 pipenv 创建的 virtualenv 路径。
我刚刚切换到 pipenv
进行部署,我的工作流程大致如下(使用 ansible 进行管理)。对于名为 "project" 的虚构项目,假设工作 Pipfile.lock 已签入源代码管理:
克隆 git 存储库:
git clone https://github.com/namespace/project.git /opt/project
进入那个目录
cd /opt/project
查看目标引用(分支、标签...):
git checkout $git_ref
在某处创建一个 virtualenv,目标 Python 版本(3.6、2.7 等):
virtualenv -p"python$pyver" /usr/local/project/$git_ref
在该 virtualenv 的上下文中调用 pipenv,因此它不会安装自己的:
VIRTUAL_ENV="/usr/local/project/$git_ref" pipenv --python="/usr/local/project/$git_ref/bin/python" install --deploy
当 Pipfile.lock 与 Pipfile 不匹配时,
--deploy
将抛出错误。使用 virtualenv 的
pip
安装项目本身(仅当它不在 Pipfile 中时才需要):/usr/local/project/$git_ref/bin/pip install /opt/project
设置指向新安装目录的符号链接:
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