Je suis en train d'essayer d'utiliser virtualenv
pour gérer de manière programmable les environnements Python pour chaque travail sur un serveur Jenkins, implémenté via une extension de Librairie Partagée pour activer les environnements sur une base de tâche. Par exemple :
/vars/activateEnvironment.groovy
:
def call(String env = "/usr/local/etc/environments/jenkins-$JOB_NAME") {
sh """
mkdir ${env}
virtualenv ${env}
source ${env}/bin/activate
"""
}
Script de pipeline, dans lequel le dépôt virtualenv-scripts
contient le fichier ci-dessus :
@Library('virtualenv-scripts') _
pipeline {
agent any
stages {
stage("Test") {
steps {
activateEnvironment()
sh 'which pip'
sh 'echo \$PATH'
}
}
}
}
En exécutant ce script de pipeline, j'obtiens la sortie suivante :
[Pipeline] sh
[example-pipeline] Exécution du script shell
+ echo /sbin:/usr/sbin:/bin:/usr/bin
/sbin:/usr/sbin:/bin:/usr/bin
[Pipeline] sh
[example-pipeline] Exécution du script shell
+ which pip
/bin/pip
J'ai essayé d'utiliser cette réponse pour que Jenkins utilise un shell de connexion, mais cela recharge toujours l'environnement à chaque appel sh
.
J'ai également vu cette réponse qui nécessiterait de coller du texte supplémentaire chaque fois qu'une étape sh
est utilisée dans un Pipeline -- pas idéal.
Existe-t-il un bon moyen de conserver l'environnement entre les commandes sh
? Alternativement, existe-t-il un meilleur moyen d'obtenir des environnements par travail avec virtualenv
? Merci pour toute l'aide/suggestions !