Je songe à passer de pip & virtualenv à pipenv
Mais après avoir étudié la documentation, je ne comprends toujours pas comment les créateurs de pipenv ont structuré le flux de travail de déploiement.
exemple:
En développement, j'ai un "Pipfile" & un "Pipfile.lock" qui définissent l'environnement.
Utilisation d'un script de déploiement que je souhaite déployer
1) "git pull" via Github vers le serveur de production
2) "pipenv install" crée/actualise l'environnement dans le répertoire de base de l'utilisateur de déploiement
Mais il me faut un répertoire dans spécifique qui est déjà configuré dans systemd ou supervisor
par exemple.:
command=/home/ubuntu/production/application_xy/env/bin/gunicorn module:app
pipenv crée env dans un emplacement tel que: /home/ultimo/.local/share/virtualenvs/application_xy-jvrv1OSi
Quel est le flux de travail prévu pour déployer une application avec pipenv?
Vous avez peu d'options là-bas.
Vous pouvez exécuter votre gunicorn via pipenv run
:
pipenv run gunicorn module:app
Cela crée une légère surcharge, mais présente l’avantage de charger également l’environnement depuis $PROJECT_DIR/.env
(ou un autre $PIPENV_DOTENV_LOCATION
).
Vous pouvez définir la variable d'environnement PIPENV_VENV_IN_PROJECT
. Ceci gardera virtualenv de pipenv dans $PROJECT_DIR/.venv
au lieu de l'emplacement global.
Vous pouvez utiliser un virtualenv existant et exécuter pipenv à partir de celui-ci. Pipenv n'essaiera pas de créer son propre virtualenv s'il est exécuté à partir de l'un d'eux.
Vous pouvez simplement utiliser le étrange chemin virtualenv créé par pipenv.
Je viens de passer à pipenv
pour le déploiement et mon flux de travail est approximativement le suivant (géré avec ansible ). Pour un projet imaginaire appelé "projet", en supposant qu'un Pipfile.lock en état de fonctionnement est coché dans le contrôle de source:
Clonez le référentiel git:
git clone https://github.com/namespace/project.git /opt/project
Changer dans ce répertoire
cd /opt/project
Découvrez la référence cible (branche, tag, ...):
git checkout $git_ref
Créez quelque part virtualenv, avec la version cible de Python (3.6, 2.7, etc.):
virtualenv -p"python$pyver" /usr/local/project/$git_ref
Appelez pipenv dans le contexte de ce virtualenv pour qu'il n'installe pas le sien:
VIRTUAL_ENV="/usr/local/project/$git_ref" pipenv --python="/usr/local/project/$git_ref/bin/python" install --deploy
Le --deploy
génère une erreur lorsque le fichier Pipfile.lock ne correspond pas à celui-ci.
Installez le projet lui-même en utilisant la variable pip
de virtualenv (nécessaire uniquement s'il ne figure pas déjà dans le fichier Pipfile):
/usr/local/project/$git_ref/bin/pip install /opt/project
Définissez un lien symbolique vers le nouveau répertoire d'installation:
ln -s /usr/local/project/$git_ref /usr/local/project/current
Ma demande est alors appelable, par exemple. avec /usr/local/project/current/bin/project_exec --foo --bar
, qui est ce qui est configuré dans supervisor , par exemple.
Tout cela est déclenché lorsqu'un tag est poussé vers la télécommande.
Comme les virtualenvs des versions précédentes restent intacts, une restauration est simplement effectuée en redéfinissant le current-
symlink sur une version antérieure. C'est à dire. si la balise 1.5 est cassée et que je veux revenir à la version 1.4, tout ce que je dois faire est ln -s /usr/local/project/1.4 /usr/local/project/current
et redémarrer l'application avec supervisorctl
.
Je pense que pipenv est très utile pour gérer les dépendances, mais il est trop lent, lourd et encore un peu instable pour l’utiliser pour des déploiements automatiques.
Au lieu de cela, j'utilise virtualenv (ou virtualenvwrapper) et pip sur la machine cible.
Sur ma machine de développement je crée un fichier texte compatible requirements.txt
à l'aide de pipenv lock -r
:
$ pipenv lock -r > deploy-requirements.txt
Pendant le déploiement, dans un environnement virtuel, je lance:
$ pip install -r deploy-requirements.txt
Pour créer un environnement virtuel dans le même répertoire que le projet, définissez la variable d’environnement suivante. doc
PIPENV_VENV_IN_PROJECT=true
Cela installe les dépendances dans le répertoire .venv
dans le projet. Disponible à partir de PipEnv v2.8.7