Eu tive o mesmo problema. Depois de conversar com alguns administradores veteranos do Jenkins, esta é a solução que cheguei:
def runCommandInMyEnvironment(cmd) {
sh "setup_environment_command; source ./some/file; ${cmd}"
}
pipeline {
agent any
stages {
stage("My Stage") {
steps {
runCommandInMyEnvironment('first_command')
runCommandInMyEnvironment('second_command')
// and so on
}
}
}
}
Não é bonito e pode atrapalhar bastante a saída do console, mas também é a maneira mais confiável de fazer isso.
Outra abordagem seria analisar a saída de algum comando e dividi-lo em várias variáveis de ambiente e, em seguida, passá-las para um bloco withEnv
, mas isso pode ser uma abordagem muito complicada e não confiável.
De qualquer forma, como você aludiu, o Jenkins não suporta ambientes persistentes sem withEnv
, então, afinal, não há uma maneira boa ou limpa de fazê-lo.
Pode haver uma maneira melhor de usar o virtualenvs com o Jenkins, mas eu nunca escrevi um trabalho do Jenkins que executa tarefas em um virtualenv, então não posso dizer. Existe este plugin , mas outra resposta do stackoverflow sugere que a abordagem que eu dei nesta resposta é o método preferido para trabalhar com o virtualenvs no Jenkins.