Jenkins のジョブごとの環境を virtualenv で設定する

Jenkins のジョブごとの環境を virtualenv で設定する

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で仮想環境を使用するより良い方法があるかもしれませんが、私は仮想環境でタスクを実行するJenkinsジョブを書いたことがないので、何とも言えません。このプラグイン、 しかし別のstackoverflowの回答この回答で示したアプローチは、Jenkins で virtualenvs を操作するための推奨される方法であることを示唆しています。

関連情報