web-dev-qa-db-fra.com

pipenv: workflow de déploiement

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?

8
caliph

Vous avez peu d'options là-bas. 

  1. 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).

  1. 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.

  2. 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.

  3. Vous pouvez simplement utiliser le étrange chemin virtualenv créé par pipenv.

6
rczajka

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:

  1. Clonez le référentiel git:

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

  2. Changer dans ce répertoire

    cd /opt/project

  3. Découvrez la référence cible (branche, tag, ...):

    git checkout $git_ref

  4. 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

  5. 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.

  6. 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

  7. 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.

7
karlson

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
    
2
Udi

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

0
salmanulfarzy