Je veux exécuter mon script fabric localement, qui à son tour, se connectera à mon serveur, changera d'utilisateur à déployer, activera les projets .virtualenv, ce qui changera dir vers le projet et émettra un git pull.
def git_pull():
sudo('su deploy')
# here i need to switch to the virtualenv
run('git pull')
J'utilise généralement la commande workon de virtualenvwrapper qui source le fichier d'activation et le fichier de postactivation me placera dans le dossier du projet. Dans ce cas, il semble que parce que le tissu fonctionne à partir de l'interpréteur de commandes, le contrôle est cédé au tissu, donc je ne peux pas utiliser la source intégrée de bash dans '$ source ~ / .virtualenv / myvenv / bin / activate'
Quelqu'un a-t-il un exemple et une explication de la façon dont ils ont fait cela?
python
virtualenv
fabric
automated-deploy
Thomas Schreiber
la source
la source
workon
tant queprefix
?Réponses:
Pour le moment, vous pouvez faire ce que je fais, ce qui est assez compliqué mais fonctionne parfaitement bien * (cette utilisation suppose que vous utilisez virtualenvwrapper - ce que vous devriez être - mais vous pouvez facilement le remplacer par l'appel `` source '' plus long que vous avez mentionné , si non):
Depuis la version 1.0, Fabric dispose d'un
prefix
gestionnaire de contexte qui utilise cette technique afin que vous puissiez par exemple:* Il y a forcément des cas où l'utilisation de l'
command1 && command2
approche peut exploser sur vous, par exemple en cas d'command1
échec (command2
ne fonctionnera jamais) ou si ellecommand1
n'est pas correctement échappée et contient des caractères shell spéciaux, et ainsi de suite.la source
workon
est inconnu parsh
. Comment pouvons-nous dire à Fabric d'utiliser bash à la place?source venv/bin/activate
. C'est plus facile et ça marche hors de la boîte.workon
est une dépendance supplémentaire et même si elle est installée, vous devez l'ajouter.bashrc
- trop compliqué pour les déploiements de fabric.En tant que mise à jour des prévisions de bitprophet: Avec Fabric 1.0, vous pouvez utiliser prefix () et vos propres gestionnaires de contexte.
la source
source
est inconnu parsh
. Comment pouvons-nous dire à Fabric d'utiliser bash à la place?.
place desource
cd()
lorsque vous spécifiez complètement le chemin d'accès àactivate
inprefix()
?prefix()
cela ne semble pas y aller - voir ces documents qui font de même. Nous voulonscd
là pour que lorsque nousyield
exécutons d'autres commandes (pip freeze
dans mon exemple), ces commandes puissent être relatives à ce répertoire.J'utilise juste une simple fonction wrapper virtualenv () qui peut être appelée à la place de run (). Il n'utilise pas le gestionnaire de contexte cd, donc des chemins relatifs peuvent être utilisés.
la source
virtualenvwrapper
peut rendre cela un peu plus simpleUtilisation de l'approche de @ nh2 (cette approche fonctionne également lors de l'utilisation
local
, mais uniquement pour les installations de virtualenvwrapper où seworkon
trouve$PATH
, en d'autres termes - Windows)Ou déployez votre fichier fab et exécutez-le localement. Cette configuration vous permet d'activer virtualenv pour les commandes locales ou distantes. Cette approche est puissante car elle contourne
local
l'incapacité de exécuter .bashrc en utilisantbash -l
:la source
C'est mon approche d'utilisation
virtualenv
avec les déploiements locaux.En utilisant le gestionnaire de contexte de fabric path () , vous pouvez exécuter
pip
oupython
avec des binaires de virtualenv.la source
Merci à toutes les réponses publiées et je voudrais ajouter une autre alternative pour cela. Il existe un module, fabric-virtualenv , qui peut fournir la fonction sous le même code:
fabric-virtualenv utilise
fabric.context_managers.prefix
, ce qui pourrait être un bon moyen :)la source
Si vous souhaitez installer les packages dans l'environnement ou si vous souhaitez exécuter des commandes en fonction des packages que vous avez dans l'environnement, j'ai trouvé ce hack pour résoudre mon problème, au lieu d'écrire des méthodes complexes de fabric ou d'installer de nouveaux packages OS:
De cette façon, vous n'aurez peut-être pas besoin d'activer l'environnement, mais vous pouvez exécuter des commandes sous l'environnement.
la source
Voici le code d'un décorateur qui entraînera l'utilisation de l'environnement virtuel pour tous les appels run / sudo:
puis pour utiliser le décorateur, notez que l'ordre des décorateurs est important:
la source
Cette approche a fonctionné pour moi, vous pouvez également l'appliquer.
En supposant qu'il
venv
s'agit de votre répertoire d'environnement virtuel et ajoutez cette méthode le cas échéant.la source