virtualenv
Jenkins 서버의 각 작업에 대한 Python 환경을 프로그래밍 방식으로 관리하는 데 사용하려고 합니다 .공유 라이브러리작업별로 환경을 활성화하는 확장입니다. 예:
/vars/activateEnvironment.groovy
:
def call(String env = "/usr/local/etc/environments/jenkins-$JOB_NAME") {
sh """
mkdir ${env}
virtualenv ${env}
source ${env}/bin/activate
"""
}
virtualenv-scripts
저장소에 위 파일이 포함 된 파이프라인 스크립트 :
@Library('virtualenv-scripts') _
pipeline {
agent any
stages {
stage("Test") {
steps {
activateEnvironment()
sh 'which pip'
sh 'echo \$PATH'
}
}
}
}
이 파이프라인 스크립트를 실행하면 다음과 같은 출력이 표시됩니다.
[Pipeline] sh
[example-pipeline] Running shell script
+ echo /sbin:/usr/sbin:/bin:/usr/bin
/sbin:/usr/sbin:/bin:/usr/bin
[Pipeline] sh
[example-pipeline] Running shell script
+ which pip
/bin/pip
나는 사용해 보았습니다.이 답변Jenkins가 로그인 셸을 사용하도록 하려면 호출할 때마다 환경을 다시 로드해야 합니다 sh
.
나도 봤다이 답변sh
파이프라인에서 단계를 사용할 때마다 추가 텍스트를 붙여넣어야 하지만 이상적이지는 않습니다.
sh
명령 간에 환경을 유지하는 좋은 방법이 있습니까 ? 또는 를 사용하여 작업별 환경을 달성하는 더 좋은 방법이 있습니까 virtualenv
? 모든 도움/제안을 보내주셔서 감사합니다!
답변1
나는 같은 문제가있었습니다. 일부 베테랑 Jenkins 관리자와 대화한 후 제가 도달한 솔루션은 다음과 같습니다.
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
}
}
}
}
이는 보기 좋지 않고 콘솔 출력을 상당히 흐릿하게 만들 수 있지만 이를 수행하는 가장 안정적인 방법이기도 합니다.
또 다른 접근 방식은 일부 명령의 출력을 구문 분석하고 이를 여러 환경 변수로 자른 다음 이를 블록에 전달하는 것입니다 withEnv
. 그러나 이는 매우 까다롭고 신뢰할 수 없는 접근 방식일 수 있습니다.
어쨌든 당신이 언급했듯이 Jenkins는 withEnv
.
Jenkins와 함께 virtualenv를 사용하는 더 좋은 방법이 있을 수 있지만 virtualenv에서 작업을 실행하는 Jenkins 작업을 작성한 적이 없으므로 말할 수 없습니다. 있다이 플러그인, 하지만또 다른 stackoverflow 답변이 답변에서 제가 제공한 접근 방식이 Jenkins에서 virtualenvs로 작업하는 데 선호되는 방법임을 제안합니다.