virtualenv를 사용하는 Jenkins의 작업별 환경

virtualenv를 사용하는 Jenkins의 작업별 환경

virtualenvJenkins 서버의 각 작업에 대한 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로 작업하는 데 선호되는 방법임을 제안합니다.

관련 정보