Jenkinsfile et Python virtualenv
J'essaye de configurer un projet qui utilise le nouveau brillant Jenkins pipelines, plus précisément un multibranch projet.
J'ai un Jenkinsfile créé dans un test de la branche comme ci-dessous:
node {
stage 'Preparing VirtualEnv'
if (!fileExists('.env')){
echo 'Creating virtualenv ...'
sh 'virtualenv --no-site-packages .env'
}
sh '. .env/bin/activate'
sh 'ls -all'
if (fileExists('requirements/preinstall.txt')){
sh 'pip install -r requirements/preinstall.txt'
}
sh 'pip install -r requirements/test.txt'
stage 'Unittests'
sh './manage.py test --noinput'
}
Il est intéressant de noter que preinstall.txt sera mise à jour pip
Je suis d'erreur comme ci-dessous:
OSError: [Errno 13] Permission denied: '/usr/local/lib/python2.7/dist-packages/pip'
Dirait qu'il essaie de mettre à jour pip mondiale env au lieu de l'intérieur de virtualenv, et ressemble à chaque sh
étape est sur son propre contexte, comment puis-je les faire exécuter, dans le même contexte?
activate
s'applique uniquement à la coquille instace il est exécuté en, dans votre cas, seule ligne. Essayez d'exécuter lepip
dans le venv avec chemin d'accès complet etmanage.py
avec (chemin complet)python
.
Vous devez vous connecter pour publier un commentaire.
Ce que vous essayez de le faire ne fonctionnera pas. Chaque fois que vous appelez la
sh
commande, jenkins va créer un nouveau shell.Cela signifie que si vous utilisez
.env/bin/activate
dans unsh
il sera seulement des sources dans cette session shell. Le résultat est que, dans un nouvelsh
commande que vous avez à la source du fichier à nouveau (si vous regardez de plus près à la sortie de la console, vous verrez que Jenkins va réellement créer shell temporaire des fichiers à chaque fois yu exécuter le comman.De sorte que vous devrait à la source de la
.env/bin/activate
de fichier au début de chaque commande shell (vous pouvez utiliser le triple qoutes pour multiligne chaînes de caractères), commeou d'exécuter tout cela dans un shell
Comme Rik posté, virtualenvs ne fonctionnent pas bien dans le Jenkins Pipeline de l'Environnement, puisqu'un nouveau shell est créé pour chaque commande.
J'ai créé un plugin qui rend ce processus est un peu moins douloureux, qui peut être trouvé ici: https://wiki.jenkins.io/display/JENKINS/Pyenv+Pipeline+Plugin. Il est essentiellement juste encapsule chaque appel de façon active le virtualenv avant l'exécution de la commande. En soi, c'est difficile, comme certaines méthodes de l'exécution de plusieurs commandes inline sont divisés en deux commandes séparées par Jenkins, provoquant l'activation virtualenv de ne plus appliquer.
Je suis nouveau sur Jenkins fichiers. Voici comment j'ai travaillé autour de l'environnement virtuel problème. (Je suis en cours d'exécution Python3, Jenkins 2.73.1)
Mise en garde: Juste pour être clair, je ne dis pas que c'est une bonne façon de résoudre le problème, et je n'ai pas testé ce suffisant pour se tenir derrière cette approche, mais ici ce qui est de travailler pour moi aujourd'hui:
J'ai été jouer avec en contournant le venv "activer" en appelant l'environnement virtuel de l'interpréteur python directement. Ainsi, au lieu de:
on peut utiliser:
Je passe mon chemin vers l'environnement virtuel de l'interpréteur python via le shell du fichier rc (Dans mon cas,
~/.bashrc
.) En théorie, chaque shell Jenkins appels devraient lire ce fichier de ressources. Dans la pratique, je dois redémarrer Jenkins, après avoir fait des changements à la coquille fichier de ressources.Mon Jenkinsfile ressemble à ceci:
Ainsi, lorsque la canalisation est exécuté, le sh a l' $PYTHON_INTERPRETER les valeurs de l'environnement défini.
Remarque un défaut de cette approche est que maintenant le Jenkins fichier ne contient pas toutes les informations nécessaires pour exécuter le script correctement. J'espère que cela va vous descendez le sol.