AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1112006
Accepted
Rino Bino
Rino Bino
Asked: 2022-10-01 13:46:05 +0800 CST2022-10-01 13:46:05 +0800 CST 2022-10-01 13:46:05 +0800 CST

清理 Jenkins 工作区但保持 Python .venv 完整

  • 772

这个问题与在 Jenkins 管道中使用 Python + Poetry 项目以及如何保留.venv/


设想:

我有一个触发 Python 项目的 Jenkins Pipeline 作业。该项目使用诗歌在工作空间内的 .venv 中创建虚拟环境。每次后续作业运行,它将按预期重新使用 .venv ,因此每个 pip 包不需要在每次运行时重新下载(除非poetry.lock 文件中有差异)。一切都按预期工作。

我想使用 Jenkins Workspace Cleanup Plugin 对管道进行更改,我想破坏工作区文件但保留一些文件,包括 pip/poetry/venv 环境文件。这是为了允许它重新使用上一次运行中仍然存储在 .venv 中的 pip 包——就像它在今天的工作管道上一样。

完整的管道文件示例在这篇文章的底部,但这是我添加到现有管道中的 cleanWs() 部分的片段:

post {
  always {
    cleanWs(
      deleteDirs: true,
      notFailBuild: true,
      patterns: [
        [pattern: '.venv', type: 'EXCLUDE'],
        [pattern: '.venv/**', type: 'EXCLUDE']
      ]
    )
  }
}

这是问题:

  • 作业第一次运行时,它工作得非常好,工作区清理工作按预期工作。该.venv/目录按预期保留。

  • (问题)在作业的后续运行中,诗歌将重新安装所有包并且不会重新使用 .venv 目录:

    Creating virtualenv test in /data/jenkins_home/workspace/test-cleanup/.venv-- 这会强制重新下载每个包,即使.venv已经存在。在作业运行之前已确认/data/jenkins_home/workspace/test-cleanup/.venv已存在。

  • 这是奇怪的部分:如果我在 Jenkins 服务器上手动转到工作区目录并运行与预期完全相同的命令 ,它会被重用并且不会重新安装所有包。因此,它在作业中运行的处理方式有一些特定的内容,这使得它想要重新创建 .venv 目录。poetry install.venv

注意in-project = true已经为诗歌设置。所以它总是会尝试在当前工作目录中使用 .venv 。


例子:

这是一个按预期工作的简单示例管道。当poetry installstep 运行时,它不会在每次作业运行时重新下载所有包,只有第一次,或者如果有差异:

pipeline {

  agent any

  stages {

    stage("Prep Build Environment") {
      steps {

        script {
          scmVars = git branch: "main", poll: false, url: "[email protected]:my-org/private-repo.git"
        }

        sh "poetry install"
      }
    }
  }
}

这是添加的新Jenkinsfile 管道文件cleanWs()。添加后,项目将不再在每次运行时重新使用 .venv,即使它仍然存在:

pipeline {

  agent any

  stages {

    stage("Prep Build Environment") {
      steps {

        script {
          scmVars = git branch: "main", poll: false, url: "[email protected]:my-org/private-repo.git"
        }

        sh "poetry install"
      }
    }
  }

  post {
    always {
      cleanWs(
        deleteDirs: true,
        notFailBuild: true,
        patterns: [
          [pattern: '.venv', type: 'EXCLUDE'],
          [pattern: '.venv/**', type: 'EXCLUDE']
        ]
      )
    }
  }

}
python
  • 2 2 个回答
  • 60 Views

2 个回答

  • Voted
  1. jayhendren
    2022-10-02T18:39:27+08:002022-10-02T18:39:27+08:00

    通常,Jenkins Pipeline 会在构建开始时清理工作区,这就是为什么 .venv 文件夹在构建运行后存在但在下一次构建期间运行 virtualenv 步骤时不存在的原因。

    如果您想在构建之间缓存或保留一些文件,最可靠的方法是将这些文件存储在工作区之外。但是,您需要非常小心,因为同时运行构建访问相同的文件可能会导致资源争用和竞争条件以及损坏的文件。

    • 0
  2. Best Answer
    Rino Bino
    2022-10-04T16:54:51+08:002022-10-04T16:54:51+08:00

    快速回答:

    添加[pattern: '.git/**', type: 'EXCLUDE']到您的cleanWs()模式列表中。

    工作区文件,包括.venv/将在作业运行之间持续存在。


    长答案:

    所以问题似乎是 git 插件在.git/目录丢失时破坏了工作区(当它需要进行完整克隆时)。从我所看到的任何地方,我都没有看到这种行为记录在案。

    由于cleanWs()动作 removes .git,它将触发 git 插件的这个“功能”。

    将.git/目录添加到排除列表似乎已经解决了原始问题并允许其他文件在构建之间保留。

    可以证明这种行为:

    1. 将文件写入工作区并签出 repo 的流水线步骤。

      steps {
        sh "ls -l"
        sh "touch foo.txt"
        git branch: "master", poll: false, url: "[email protected]:golang/example.git"
      }
      

      作业运行一次后,foo.txt 将持续存在于工作区中:

    2. .git克隆后删除数据:

      steps {
        sh "ls -l"
        sh "touch foo.txt"
        git branch: "master", poll: false, url: "[email protected]:golang/example.git"
        sh "rm -rf .git"
      }
      

      作业运行一次后, foo.txt 现在将在每次作业运行开始时丢失:


    最后的帖子/总是阻止片段。诗歌安装和虚拟环境现在按预期工作:

    post {
      always {
        cleanWs(
          deleteDirs: true,
          notFailBuild: true,
          patterns: [
            [pattern: '.git/**', type: 'EXCLUDE'],
            [pattern: '.venv/**', type: 'EXCLUDE']
          ]
        )
      }
    }
    
    • 0

相关问题

  • 在 cygwin/XP 下安装完整 Python 的最佳方式?

  • Mac OS X:从 python 脚本中更改 $PATH

  • 可以使用 easy_install 和 bdist_rpm 安装吗?

  • 我可以“注册”python 脚本以在 Windows 上执行吗?

  • 如何使用脚本远程重启 Windows 服务?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve