【问题标题】:How to tell Jenkins to use a particular virtualenv python如何告诉 Jenkins 使用特定的 virtualenv python
【发布时间】:2014-02-01 22:23:36
【问题描述】:

我已经创建了一个 virtualenv 来运行我的 python 脚本。

现在,当我将此 python 脚本与 Jenkins 集成时,我发现执行时 Jenkins 使用了错误的 python 环境。

如何确保 Jenkins 使用正确的 virtualenv?

例如,对于我的情况,我想使用 virtualenv 测试。我如何使用这个预先准备好的 virtualenv 来运行我的 python 脚本。

source test/bin/activate 

【问题讨论】:

  • 很好奇,但如果您在 linux 上运行 jenkins,您可以在脚本开头添加 #!/path/to/python/virtualenv。这应该告诉 bash 使用哪个解释器 - 你可以让 jenkins 直接调用 shell 脚本而不是尝试执行 python。

标签: python python-2.7 jenkins virtualenv jenkins-plugins


【解决方案1】:

您应该安装其中一个 python 插件。我用过ShiningPanda。然后,您将能够在管理 Jenkins > 配置系统 > Python > Python 安装中创建单独的虚拟环境配置。 在作业配置中会有 Python Builder 步骤,您可以在其中选择 python 环境。

只需确保您没有从现有的 python 虚拟环境中启动 Jenkins 服务。

【讨论】:

  • 例如,对于我的情况,我想使用 virtualenv 测试。有没有我可以使用的方法。 source test/bin/activate
  • @Baishakh 是的,这正是它正在做的事情。将现有的 python 虚拟环境添加为单独的配置。然后在 Job 中添加 Build Step 以使用该配置开始测试。
  • @IvanNevostruev,Jenkins已经在现有的python虚拟环境中启动了,我该如何改变呢?
  • 不再推荐使用 ShiningPanda,请参阅stackoverflow.com/a/42650694/99834
【解决方案2】:

首先,您应该避免使用 ShiningPanda,因为它已损坏。它将fail if you try to run jobs in parallel 并且与 Jenkins2 管道不兼容。

当构建并行(并发)运行时,Jenkins 会将@2,@3... 附加到工作区目录,因此两个执行不会共享同一个文件夹。 Jenkins 确实克隆了原始工作空间,因此如果它包含您在之前构建中创建的 virtualenv,请不要感到惊讶。

您需要自己处理 virtualenv 创建,但您必须非常小心如何使用它:

  • workspaces 文件夹可能未清理,其位置可能会从一个版本更改为另一个版本
  • 知道虚拟环境在移动时会损坏,而 jenkins 会移动它们。
  • 在工作空间之外创建文件是一种非常糟糕的 CI 做法,避免使用 /tmp 的诱惑

因此,您唯一安全的选择是为工作空间内的每个构建创建一个唯一的虚拟环境文件夹。您可以使用$JOB_NUMBER 环境变量轻松完成此操作。

即使您有并行运行的作业,情况也会有所不同。这也不会重复。

缺点:

  • 速度:virtualenvs 不会在构建之间重用,因此它们会被完全重新创建。如果您使用--site-packages,您可能会大大加快创建速度(如果系统上已经安装了重包)
  • space:如果不定期清理工作空间,virtualenvs 的数量会增加。解决方法:每周或每两周清洁一次工作区。这也是发现其他错误的好习惯。有些人选择为每次执行清理工作区。

Shell sn-p

      #/bin/bash
      set -euox pipefail

      # Get an unique venv folder to using *inside* workspace
      VENV=".venv-$BUILD_NUMBER"

      # Initialize new venv
      virtualenv "$VENV"

      # Update pip
      PS1="${PS1:-}" source "$VENV/bin/activate"

      # <YOUR CODE HERE>

第一行是实现 bash 字符串模式,更多细节在http://redsymbol.net/articles/unofficial-bash-strict-mode/

【讨论】:

  • 我喜欢这种方法,因为它不需要额外的插件。
【解决方案3】:

您可以使用Pyenv Pipeline Plugin。用法很简单,加个


stage('my_stage'){
    steps{
        script{
            withPythonEnv('path_to_venv/bin'){
                sh("python foo.py")                              
                ...

您可以在步骤中添加pip install whatever 以更新您正在使用的任何虚拟环境。

默认会在jenkins工作空间中寻找虚拟环境,如果没有找到,会创建一个新的。

【讨论】:

  • Windows下好像不支持:
猜你喜欢
  • 2014-02-25
  • 2012-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-15
  • 2013-12-17
  • 2019-12-21
相关资源
最近更新 更多